Vim 脚本中的“reduce”函数

2024-05-15

Vim 脚本有一些非常基本的函数式编程工具。

It has map() and filter(),但据我所知它缺乏reduce()功能。 ”Reduce https://en.wikipedia.org/wiki/Fold_%28higher-order_function%29" 将值的集合减少为单个值。

有没有办法创建reduce()或者在 Vim 脚本中以某种方式模拟它?是否可以在 Vim 脚本表达式中减少值列表,而无需编写显式循环?举个例子,有没有办法减少加法运算的前五个正整数,与函数式语言课程的标准一样吗?

在 JavaScript 中:

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

在 Clojure 中:

(reduce + (range 1 (inc 5)))
15

在哈斯克尔中:

foldl (+) 0 [1..5]
15

In J:

+/>:i.5
15

在 Vim 脚本中:...?


为了供将来参考,以下是我对主题的变体,灵感来自 @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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vim 脚本中的“reduce”函数 的相关文章

  • :set 选项的显示值

    如果你不给 colorscheme一个参数 然后它显示 vim 当前使用的颜色方案的名称 vim 中是否有类似的方法来显示是否设置了选项或如果选项的值不是布尔值则设置为什么 例如 如果我想知道是否autoindent已设置或者我想知道的值t
  • 使 'n' 始终向前搜索,无论是否 / 或 ?用于搜索

    我几乎总是在 Vim 中搜索 然后继续向前搜索n并向后N 然而 有时我会使用 跳转到我当前所在行上方几行的项目 在这种情况下 如果我想向前搜索同一项目 我必须使用N代替n 令人烦恼的心理减速带 所以我的问题是 是否有可能使n永远向前走 并且
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 文件类型更改时颜色方案也会更改

    当我打开 vim htm html xml 或 vimrc 文件时 是否可以更改 Vim 中的颜色方案 当我切换到具有上述扩展名的已打开文件时 也会更改颜色方案 这就是我想要我的 vim 做的事情 file txt 或新的 未保存 缓冲区
  • C# 开发人员有什么理由应该学习 Emacs/Vim 吗?

    我在一家纯粹的 Microsoft 商店担任 C 开发人员 最近 我开始在工作之余的空闲时间使用 Gas 和 Linux 自学汇编 我喜欢摆弄 Linux 尽管我对它还很陌生 我一直听说我应该学习 VIM 或 Emacs 但事实是 我绝对不
  • std::bind 重载解析

    下面的代码工作正常 include
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • 如何在不改变也不重新分配的情况下实现可设置和可检索的状态?

    编写代码时可以遵循以下几条规则 当没有重新分配时 代码更容易阅读和推理 许多 linter 推荐首选const只要有可能 代码也更容易阅读和推理对象何时不会发生变化 如果您在代码的一部分中定义了一个对象 那么知道您可以在其他地方自由引用该对
  • @tailrec为什么这个方法不编译为“包含不在尾部位置的递归调用”?

    tailrec private def loop V key String V key match case gt loop key 此方法无法编译并抱怨它 包含不在尾部位置的递归调用 有人可以向我解释一下发生了什么事吗 这个错误消息对我来
  • 设置高亮大括号的 vim 颜色主题

    如何更改突出显示大括号的 vim 配色方案 我希望实际编辑 vim 主题文件以使更改永久生效 问候 克雷格 匹配括号的自动高亮颜色称为MatchParen 您可以通过执行以下操作来更改 vimrc 中的颜色 highlight MatchP
  • 如何使用 JSHint 配置 Syntastic?

    如何使用 Syntastic Vim 插件和 JSHint 来验证 JavaScript 代码 环境 乌班图11 04 VIM Vi 改进 7 3 我已经安装了 按照解决方案VIM JSLint https stackoverflow co
  • 在 Vim 中隐藏所有(不)匹配的行

    是否可以在 vi 或 Vim 中显示 隐藏所有匹配行 不突出显示 而只显示那些行 例如 我有一个带有单词单词的文本ERROR 如何让它只显示包含以下内容的行ERROR以及如何只显示线条而不显示ERROR 有解决办法吗不删除所有匹配的行然后撤
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 如何在 Vimscript 中获取光标下的单词和当前行的文本?

    我正在写一个 Vim 脚本 如何获取光标下的单词和当前行的文本 你可以与expand https vimdoc sourceforge net htmldoc eval html expand and getline https vimdo
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • 有没有好的 Clojure 基准测试?

    Edit Clojure 基准测试已达到基准游戏 http benchmarksgame alioth debian org u64q clojure html 我已经制作了这个问题社区维基并邀请其他人保持更新 有人知道 Clojure 性
  • 某些数据结构是否比其他数据结构更适合函数式编程?

    In 现实世界哈斯克尔 http book realworldhaskell org 有一个标题为 没有数组或哈希表的生活 的部分 其中作者建议在函数式编程中首选列表和树 而在命令式程序中可能会使用数组或哈希表 这是有道理的 因为在创建新列
  • 如何设置打开文件时默认展开?

    In my vimrc我已经把set foldmethod syntax启用方法折叠等 但是 我不喜欢每次打开文件时都会折叠整个文件的默认设置 有没有办法启用foldmethod 但是当我打开文件时文件是否展开了 set foldlevel
  • Vim 扩展(通过 Python)?

    是否可以通过自定义扩展 最好用 Python 编写 来扩展 vim 功能 理想情况下 我需要的是在命令模式下的自定义命令 例如 ESC do this do that vim 支持 python 脚本 我认为也支持 perl 您只需确保您使
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它

随机推荐

  • 创建面向鼠标和触摸的 WPF 应用程序的最佳实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用滑动窗口动画 ggplot 时间序列图

    我正在寻找在不失去分辨率的情况下对长时间序列图进行动画处理的方法 我希望视图能够 平移 数据 显示从开始到结束的滑动子集 假设我有以下内容 library ggplot2 library dplyr library gganimate df
  • 从标签 ID 更改整个 gridview 单元格颜色

    试图弄清楚当我有标签 ID 时如何更改 gridview 单元格的背景颜色
  • Python:使类可迭代

    我继承了一个包含许多大型类的项目 这些类仅由类对象 整数 字符串等 组成 我希望能够检查属性是否存在 而无需手动定义属性列表 是否可以制作一条蟒蛇classiterable 本身使用标准语法 也就是说 我希望能够使用迭代所有类的属性for
  • 从自定义结构/类型公开通用值

    我的一个项目有一个值类型 结构 表示视频格式的自定义标识符字符串 在本例中 它将包含内容类型字符串 但这可能会有所不同 我使用了一个结构体 因此它在传递时可以是强类型的 并对初始字符串值执行一些健全性检查 public struct Vid
  • 正则表达式捕获和替换可以与 Apache DirectoryMatch 指令一起使用吗?

    有谁知道是否可以在 Apache 的 DirectoryMatch 指令中使用正则表达式捕获 我想做类似以下的事情
  • C 埃及分数

    古埃及人仅使用以下形式的分数1 n因此任何其他分数都必须表示为这些单位分数的总和 而且 所有单位分数都是不同的 在C或Java中使任何分数成为埃及分数 总和越少越好 的好方法是什么 可以使用什么算法 分支定界 a 例如 3 4 1 2 1
  • 在数据库中建模抽象基类和子类

    我有4个子类 Video Image Note and Form 每一项都包含不同类型的数据 例如 Image类包含磁盘上图像文件的路径和图像属性 以及Form类包含表单字段值 然而 每个项目之间的共同元素是 GPS 坐标和航向 因此我有以
  • 有没有办法将击键发送到节点中的终端?

    我特别想发送 ctrl l 清除终端 这样每次我测试脚本时终端都是干净的 如果您使用的是 Linux console log 033 2J 如果你使用的是 Windows 我认为这可行 将光标设置在 0 0 var util require
  • 单元测试时静态元模型属性为 null

    我在外部包中有 Entity 类 这些类也有静态元模型 在我的应用程序的服务类中 我使用这些元模型和 EntityManager CriteriaBuilder CriteriaQuery 来检索我的数据 这在运行应用程序时工作得很好 但是
  • 使用 PutDataMapRequest 后,Wearable.DataApi.getDataItem() 的 Uri 是什么?

    我正在测试可穿戴数据层 API如中所述安卓教程 http developer android com training wearables data layer index html 有一个基于底层 APIDataItem http dev
  • HTTP 错误 500.24 - 内部服务器错误 检测到不适用于集成托管管道模式的 Asp.NET 设置

    我有带有 gridview 的网页 其中一列将有一张图像 单击图像时 它将打开保存在网络服务器上的 PDF 它工作正常 但我遇到了以下错误 HTTP 错误 55 24 内部服务器错误 检测到不适用于集成托管管道模式的 Asp NET 设置
  • 尝试使用 boost.multi precision 编译项目时出现 C2143/C2518

    我在尝试让 boost multi precision 在我的 VC2017 项目中工作时遇到了问题 我试图使最简单的项目成为可能作为概念证明 include
  • 跨多个 Azure Function 实例共享对象

    我们有一个要求 需要存储一个可由函数的多个实例访问和使用的对象 请告知实现此目的的最佳方法是什么 大多数时候 所有函数执行都在同一个进程中运行 因此您could使用静态类成员在函数实例之间共享状态 然而 这并不可靠 该进程可能随时停止运行
  • 是否可以更新动画中的箭袋位置坐标?

    我想用 matplotlib 绘制一些粒子并为其设置动画 每个点都有一个位置和速度 我可以使用 matplotlib 绘制单帧quiver 但是如何更新每一帧的箭袋数据呢 我正在使用 matplotlib 动画类 我读到了有关 未记录 qu
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • 无法使用注释从 .properties 文件中提取值

    我想通过 properties 文件配置我的 bean 字符串字段 但它不会替换 value 键 意味着它会回显 value 字符串 我的代码如下 主要类别 public class Main public static void main
  • 如何使用 matplotlib 显示文本

    我想这样做 我有这个Python代码 import numpy as np import pylab as plt a np array 1 2 3 4 5 6 7 8 9 10 b np array 7 8 6 3 2 1 5 8 4 1
  • R:为什么 boxplot(x,log="y") 与 boxplot(log(x)) 不同?

    delme lt exp rnorm 1000 1 5 0 3 boxplot delme log y boxplot log10 delme 为什么这两个图中的胡须不同 谢谢 阿古斯 我想说的是 在您的第一个图中 您只是将 y 轴更改为对
  • Vim 脚本中的“reduce”函数

    Vim 脚本有一些非常基本的函数式编程工具 It has map and filter 但据我所知它缺乏reduce 功能 Reduce https en wikipedia org wiki Fold 28higher order fun