In case when you define a function F1 which behaves same as a given function F2 in Vim script, you may just choose the following cases depending on the arguments of F2.
The solution is just to use call()
.
function! F1(...)
return call('F2', a:000)
endfunction
But if you also want to preserve the definition of arguments? There are still solution of each cases.
Named arguments (or no arguments)
function! F1(x)
return F2(a:x)
endfunction
Unnamed arguments
function! F1(...)
return call('F2', a:000)
endfunction
Then you can make mixed version, using call()
.
function! F1(x, ...)
return call('F2', insert(deepcopy(a:000), a:x))
endfunction
Basically this is "cons"ing a named variable into the top of the list.
Summary
call()
is so handy.
Shougo Matsu, the neocomplcache and unite author, suggested me to use call()
instead of the following "First version" of this blog post. That's absolutely better idea than I had. Thanks Shougo!
First version
The following sentense was legacy. I leave them just for your additional information.
Named arguments (or no arguments)
function! F1(x)
return F2(a:x)
endfunction
Unnamed arguments
function! F1(...)
return eval('F2(' . join(map(range(1, a:0), '"a:" . v:val'), ', ') . ')')
endfunction
This looks more difficult than it should be. Let me explain it.
a:0
is the number of the arguments of the function. If you call F1(x, y, z)
, a:0
is 3. You can access each arguments as a:1
, a:2
and a:3
.
range(1, a:0)
This becomes a list [1, 2, 3] if the number of the arguments of F1 is 3.
map(range(1, a:0), '"a:" . v:val'), ', ')
This becomes 'a:1, a:2, a:3'. Then you can make a string "F2(a:1, a:2, a:3)"
dynamically, and call it by eval
.
Then you can make mixed version easily.
function! F1(x, ...)
return eval('F2(a:x, ' . join(map(range(1, a:0), '"a:" . v:val'), ', ') . ')')
endfunction
The difference is only just "F2(a:x, "
which was originally "F2("
.
No comments:
Post a Comment