为了供将来参考,以下是我对主题的变体,灵感来自 @MatthewStrawbridge 链接的答案。
原始示例问题的表达式:
eval(join(range(1, 5), '+'))
同样的更通用的解决方案,使用Add()
, where a
is range(1, 5)
:
eval(repeat('Add(',len(a)-1).a[0].','.join(a[1:],'),').')')
这构造了字符串"Add(Add(Add(Add(1,2),3),4),5)"
, 进而eval
是吗。乐趣!
最后,Reduce()
,它接受一个 Funcref 和一个列表,然后使用 Vim 的列表“解构”语法在循环中减少它[x, y; z]
. See :h :let-unpack
.
function! Reduce(f, list)
let [acc; tail] = a:list
while !empty(tail)
let [head; tail] = tail
let acc = a:f(acc, head)
endwhile
return acc
endfunction
这就是它的使用方式:
:echo Reduce(function('Add'), range(1, 5))
15