分页: 1 / 2
vim script 不定参数问题 [解决]
发表于 : 2011-05-01 20:20
由 自由建客
一个预处理函数 Fun(...),一个处理函数 FunOp(...)
Fun 最终要调用 FunOp 进行具体操作,Fun 该如何调用 FunOp 才能把所有参数原封不动地再传给 FunOp ?
效果就如同 shell 脚本的 exec command "$@"。
Re: vim script 不定参数问题
发表于 : 2011-05-01 20:31
由 acer4740
说的不清楚
Re: vim script 不定参数问题
发表于 : 2011-05-01 21:07
由 自由建客
代码: 全选
fun Fun(...)
" 预处理
return FunOp(这里该怎么写) " 把接收的所有参数原封不动的再传给 FunOp
endfun
fun FunOp(...)
" 具体操作
endfun
Re: vim script 不定参数问题
发表于 : 2011-05-01 21:19
由 qy117121
Re: vim script 不定参数问题
发表于 : 2011-05-01 21:22
由 SmallV
Re: vim script 不定参数问题
发表于 : 2011-05-01 21:32
由 月下叹逍遥
返回字符还是数组?
Re: vim script 不定参数问题
发表于 : 2011-05-01 22:14
由 fanhe
Re: vim script 不定参数问题
发表于 : 2011-05-01 23:08
由 自由建客
fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
Re: vim script 不定参数问题
发表于 : 2011-05-01 23:09
由 月下叹逍遥
不会,只学过一点C……
Re: vim script 不定参数问题
发表于 : 2011-05-01 23:26
由 fanhe
自由建客 写了:fanhe, 我看到了,但没看出来哪符合我的要求,a:000 是列表,我要的效果是
比如某地方
call Fun(1, 2, 3)
然后 Fun 内部调用 FunOp 时就是
FunOp(1, 2, 3) 的效果,而不是 FunOp([1, 2, 3]) 的效果
代码: 全选
fun! Fun(...)
" 预处理
echo a:000
if a:0 > 0
let args = ''
for idx in range(1, a:0 - 1)
let args .= 'a:'.idx.', '
endfor
let args .= 'a:'.a:0.''
endif
" echo args
" return FunOp(a:000) " 把接收的所有参数原封不动的再传给 FunOp
exec 'let ret = FunOp('. args .')'
return ret
" return FunOp(args) " 把接收的所有参数原封不动的再传给 FunOp
endfun
fun! FunOp(...)
echo a:000
" 具体操作
endfun
call Fun('a', 1, ['xyz'])
方法是自己想出来的
你自己可以想办法自己封装一下
Re: vim script 不定参数问题
发表于 : 2011-05-02 0:59
由 自由建客
代码: 全选
fun! Fun(...)
echo "=== Fun ==="
echo a:0
let args=""
let i=1
while i<=a:0
let args.="a:".i.","
let i+=1
endwhile
echo args
exe "let r=FunOp(".args.")"
return r
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
endfun
Fun 这样的预处理函数有很多个,每个都这样写,好麻烦

有没有宏,只要写一行就扩展为
代码: 全选
let args=""
let i=1
while i<=a:0
let args.="a:".i.","
let i+=1
endwhile
exe "let r=FunOp(".args.")"
return r
像 C 语言的 #define
Re: vim script 不定参数问题
发表于 : 2011-05-02 1:18
由 自由建客
代码: 全选
let s:CALL_FUNOP="let args=''\n let i=1\n while i<=a:0\n let args.='a:'.i.','\n let i+=1\n endwhile\n echo args\n exe 'let r=FunOp('.args.')'\n return r"
fun! Fun(...)
echo "=== Fun ==="
echo a:0
exe s:CALL_FUNOP
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
endfun

可读性啊
Re: vim script 不定参数问题
发表于 : 2011-05-02 13:32
由 自由建客
代码: 全选
fun! s:Args(begin, end)
if a:begin>a:end
return ""
else
let args="a:".a:begin
endif
let i=a:begin+1
while i<=a:end
let args.=",a:".i
let i+=1
endwhile
return args
endfun
fun! Fun(...)
echo "=== Fun ==="
echo a:0
echo s:Args(1, a:0)
exec "let r=FunOp(".s:Args(1, a:0).")"
return r
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
return "*****".a:0."*****"
endfun
好吧,最后方案了!

Re: vim script 不定参数问题
发表于 : 2011-05-02 14:06
由 acer4740
自由建客 写了:代码: 全选
fun! s:Args(begin, end)
if a:begin>a:end
return ""
else
let args="a:".a:begin
endif
let i=a:begin+1
while i<=a:end
let args.=",a:".i
let i+=1
endwhile
return args
endfun
fun! Fun(...)
echo "=== Fun ==="
echo a:0
echo s:Args(1, a:0)
exec "let r=FunOp(".s:Args(1, a:0).")"
return r
endfun
fun! FunOp(...)
echo "=== FunOp ==="
echo a:0
return "*****".a:0."*****"
endfun
好吧,最后方案了!

应该还有更简单的办法
代码: 全选
call Fun(1, 2, 3)
FunOp(a:000)
传入列表,FunOp再按列表解析
a:1[0]
a:1[1]
a:1[2]
Re: vim script 不定参数问题
发表于 : 2011-05-02 14:36
由 自由建客
FunOp 的接口不能变动,这是规定