Sunday, February 5, 2012

Help me improve the inline calculator

http://vimrc-dissection.blogspot.com/2011/01/vim-inline-calculator-revisited.html

This inline calculator is very handy.
It doesn't required Python to be installed on the system.
And we can define variables.

I am trying to improve it to use ^ as the power operator, like 2^3 =
8,
I know vim has internal function pow(2,3) = 8.
But 2^3 is more natural to me as I use latex and matlab a lot.

Following is the result of my modified version.

2^3 = 8.0
2.2^3.3 = 13.489469
-2^3 = -8.0
-2^4 = -16.0
2 ^ 3 = 8.0
2^3 - 3^2 = -1.0
(-2)^3 = -8.0
(-2)^4 = 16.0
(-2.2)^(4) = 23.4256
(22.3 ^ 3.2) = 20633.626351
((2^3)) = 8.0
2^3^4^0 = 1.0
2^ 3^ 4^5 = 1.152922e18
2^(2^2)^2 = 256.0

It handles simple equations very well.
However, I don't know how to make it deal with such equation:

(2+3)^(5-3)

because regexp can't find the matching bracket.
Is there a internal function acting like v_ib

function! CalcLine(ln)
let tag_marker = "#"
let s = getline(a:ln)

" remove old result if any
let x = substitute( s, '[[:space:]]*=.*', "", "" )
" strip the tag, if any
let x1 = substitute( x, '[a-zA-Z0-9]\+'.tag_marker.'[[:space:]]*',
"", "" )
" replace values by the tag
let x1 = substitute( x1, tag_marker.'\([a-zA-Z0-9]\+\)',
'\=CalcGetValue(submatch(1))', 'g' )

""""""""""""""""""""""""""""""""" modified section
"""""""""""""""""""""""""""""""""""
" replace base^exponent by power(base,exponent)
while matchstr( x1, '\^') == '^'

let floating = '\d\+\%(\.\d\+\)\=' "define floating number pattern
let element = '\(\(([-+]\='.floating.')\)\|\('.floating.'\)\|\
((\=pow('.floating.','.floating.'))\=\)\)'

let power = matchstr( x1, element.'\s*\^\s*'.element)
let base = matchstr( power, element.'\s*\^')
let base = substitute( base, '\s*\^', "", "")
let exponent = matchstr( power, '\^\s*'.element)
let exponent = substitute( exponent, '\^', "", "")
let y = printf('%f',eval( 'pow('.base.','.exponent.')' ))
let x1 = substitute( x1, power, y, "")
endwhile

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" evaluate
let v = 0
try
let v = "".eval(x1)
catch /E806:/
" VIM can't convert float to string automagically, apply printf("%g")
let v = "".eval('printf( "%g", '.x1.')')
endtry
" finish the job
call setline(a:ln, x.' = '.v)
endfunction

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

No comments:

Post a Comment