functional-programming - Vim脚本中的 "reduce"函数

标签 functional-programming vim

Vim脚本具有一些非常基本的功能编程功能。

它具有map()filter(),但是据我所知它缺少reduce()函数。 “Reduce”将值的集合减少为单个值。

有没有一种方法可以在Vim脚本中创建reduce()或对其进行仿真?是否可以在Vim脚本表达式中减少值的列表,而无需编写显式循环?例如,有没有一种方法可以像函数语言中的类(class)一样减少加法运算的前五个正整数?

在JavaScript中:

[1, 2, 3, 4, 5].reduce(function(x, y) { return x + y; });
15

在Clojure中:
(reduce + (range 1 (inc 5)))
15

在Haskell中:
foldl (+) 0 [1..5]
15

在J中:
+/>:i.5
15

在Vim脚本中:...?

最佳答案

我认为您应该构造一个字符串然后执行它(我承认这有点笨拙)。帮助(:h E714)给出了以下示例:

:exe 'let sum = ' . join(nrlist, '+')

因此,在您的情况下,nrlist[1, 2, 3, 4, 5],它将构造字符串let sum = 1+2+3+4+5然后执行它。

另外,您可能可以编写自己的reduce函数,因为没有内置函数。

编辑:

我在vim_use Google网上论坛上找到了a discussion(vim中的语言构建与emacs中的语言构建相比有多强大?,2010年1月25日),其中涉及Vim中的函数式编程,其中包括几个简化功能的实现。

汤姆·林克(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'))

第二,由安东尼·斯克里文(Antony Scriven)撰写,内容如下:
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)

关于functional-programming - Vim脚本中的 "reduce"函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18807349/

相关文章:

functional-programming - purescript 中的 Eff-monad 是否受到 www.eff-lang.org 的启发?

functional-programming - 什么是欣德利米尔纳?

ruby - 使用 ruby​​(或其他语言)的全屏终端应用程序

c++ - Vim 插件 clang_complete 看不到 *.cc 文件

haskell - Monadic 杂质和 Haskell 纯度。它们是如何结合的?

swift - 了解 Swift map 定义中的 Self.Generator.Element 是什么

java - TextMate 相当于 gVim Ctrl+P

vim - 在 Vim 中更改标题大小写(所有单词的首字母大写)

python - 仅在 python 文件中将制表符扩展到 vim 中的空格?

haskell - 使用不可变数据结构改变数据