我认为您应该构造一个字符串然后执行它(我承认这感觉有点笨拙)。帮助 ( :h E714
) 给出了这个例子:
:exe 'let sum = ' . join(nrlist, '+')
所以在你的情况下, where nrlist
is [1, 2, 3, 4, 5]
,它将构造字符串let sum = 1+2+3+4+5
然后执行它。
或者,您可以编写自己的 reduce 函数,因为没有内置函数。
编辑:
我在 vim_use Google Group 上找到了关于Vim 中的函数式编程的讨论( How strong is language build in vim compare with the language build in emacs?,2010 年 1 月 25 日),其中包括几个这样的 reduce 函数的实现。
第一个由 Tom Link 撰写,如下:
function! Reduce(ffn, list) "{{{3
if empty(a:list)
return ''
else
let list = copy(a:list)
let s:acc = remove(list, 0)
let ffn = substitute(a:ffn, '\<v:acc\>', "s:acc", 'g')
for val in list
let s:acc = eval(substitute(ffn, '\<v:val\>', val, 'g'))
endfor
return s:acc
endif
endf
echom Reduce("v:val + v:acc", [1, 2, 3, 4])
echom Reduce("v:val > v:acc ? v:val : v:acc", [1, 2, 3, 4])
echom Reduce("'v:val' < v:acc ? 'v:val' : v:acc", split("characters",
'\zs'))
第二个,安东尼斯克里文,如下:
fun Reduce(funcname, list)
let F = function(a:funcname)
let acc = a:list[0]
for value in a:list[1:]
let acc = F(acc, value)
endfor
return acc
endfun
fun Add(a,b)
return a:a + a:b
endfun
fun Max(a,b)
return a:a > a:b ? a:a : a:b
endfun
fun Min(a,b)
return a:a < a:b ? a:a : a:b
endfun
let list = [1,2,3,4,5]
echo Reduce('Add', list)
echo Reduce('Max', list)
echo Reduce('Min', list)