在 Paul Graham 的 ANSI Common Lisp 中编写示例

2023-11-27

谁能解释一下 Paul Graham 的 ANSI Common Lisp 第 110 页中的示例吗?

该示例尝试解释使用 &rest 和 lambda 来创建函数式编程工具。其中之一是组成函数参数的函数。我找不到任何解释它是如何工作的。代码如下:

(defun compose (&rest fns)
  (destructuring-bind (fn1 . rest) (reverse fns)
    #'(lambda (&rest args)
        (reduce #'(lambda (v f) (funcall f v))
                rest
                :initial-value (apply fn1 args)))))

用法是:

(mapcar (compose #'list #'round #'sqrt)
        '(4 9 16 25))

输出是:

((2) (3) (4) (5))

对我来说,2 号线和 6 号线看起来特别神奇。


The compose函数返回一个closure从最后到第一个调用每个函数,并将每个函数调用的结果传递给下一个函数。

调用导致的关闭(compose #'list #'round #'sqrt)首先计算其参数的平方根,将结果四舍五入到最接近的整数,然后创建结果列表。使用 say 3 作为参数调用闭包相当于评估(list (round (sqrt 3))).

The 解构绑定评估(reverse fns)表达式来获取参数compose以相反的顺序,并将结果列表的第一项绑定到fn1局部变量和结果列表的其余部分rest局部变数。因此fn1保存最后一项fns, #'sqrt.

The reduce称每个fns具有累积结果的函数。这:initial-value (apply fn1 args)提供初始值reduce函数并支持使用多个参数调用闭包。不需要多个参数,compose可以简化为:

(defun compose (&rest fns)
  #'(lambda (arg)
      (reduce #'(lambda (v f) (funcall f v))
              (reverse fns)
              :initial-value arg)))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Paul Graham 的 ANSI Common Lisp 中编写示例 的相关文章

随机推荐

  • matplotlib 循环为每个类别绘制子图

    我正在尝试编写一个循环 该循环将生成一个包含 25 个子图的图形 每个国家 1 个子图 我的代码制作了一个包含 25 个子图的图形 但这些图是空的 我可以更改什么以使数据出现在图表中 fig plt figure for c num in
  • std::sort 使用自定义比较器

    在下面的代码中 为什么这三个IntComparator IntComparator2 and IntComparator3作为第三个参数sort 功能 他们不会有不同的左值函数类型吗 基于https en cppreference com
  • java中的单例模式。惰性初始化

    public static MySingleton getInstance if instance null synchronized MySingleton class instance new MySingleton return in
  • Python:变量什么时候通过引用传递,什么时候通过值传递? [复制]

    这个问题在这里已经有答案了 我的代码 locs 1 2 for loc in locs loc print locs prints gt 1 2 Why is loc不是元素的引用locs Python 除非显式复制 否则所有内容都作为引用
  • CPU变量类型

    我在 Visual Studio 中工作时 快乐的小无辜智能感知说有一个名为 cpu 的变量类型 我在网上找不到任何关于它的信息 因为所有谷歌都会返回的是中央处理单元 有谁知道 cpu 变量的作用或存储是什么 cpu 是一个限制说明符 可应
  • 禁用 UIPageViewController 弹跳 - Swift [重复]

    这个问题在这里已经有答案了 我一直在制作一个示例应用程序 在之间滚动UIViewControllers但重点是我想在滚动结束时和返回到第一个时禁用弹跳效果UIViewController 这是我的代码 class PageViewContr
  • 如何获取Celery中失败的任务?

    我正在使用芹菜来处理一些任务 我可以看到有多少是活动的或计划的等 但我无法找到任何方法来查看失败的任务 Flower 确实会向我显示状态 但前提是它在任务启动和失败时正在运行 是否有任何命令可以获取所有失败的任务 状态 失败 创建任务时我确
  • 如何在 Perl 中运行时加载模块?

    是否可以在 Perl 中在运行时加载模块 我尝试了以下方法 但没有成功 我在程序的某个地方写了以下内容 require some module import some module some func some func Foo pm pa
  • 检查 pandas DataFrame 中的 dtype 时的注意事项

    由 来指导this回答 我开始建立管道来根据其数据类型处理数据帧的列 但是在获得一些意外的输出和一些调试之后 我最终得到了测试数据帧和测试数据类型检查 Creating test dataframe test pd DataFrame bo
  • 删除 Chrome/IE9 中的图像边框

    我试图摆脱 Chrome 和 IE9 中每个图像出现的细边框 我有这个CSS outline none border none 使用 jQuery 我还添加了border 0每个图像标签上的属性 但如图所示的边框仍然出现 有什么解决办法吗
  • 实现具有独立行高的多列ListView

    我想创建一个包含大约 200 个 ImageView 随机高度 的列表 并以 拼贴 方式使用以下布局 通常我会在 ListView 中执行此操作 以获得通过使用适配器获得的性能 但因为我希望图像按列显示 并且具有不同的高度 参见图片Exam
  • 如何使用 FPDF/FPDI 获得精确修改后的 PDF?

    我有一个修改 PDF 并向其中添加图像的任务 为此我使用了 FPDF 和 FPDI 库 其操作代码如下
  • 访问 jenkins 共享库代码中的环境变量

    当我使用新的共享库时 我无法访问任何直接由 Jenkinsfile 或通过 var groovy 脚本执行的 src 类的环境变量 即使我添加了这个问题仍然存在withEnv到 var groovy 脚本 让环境变量传播到 jenkins
  • 在 10 分钟内触发活动的简单 AlarmManager 示例

    我发现了很多与此类似的问题 但至少我认为它们太复杂 代码太多 这件事能用几行代码完成吗 我想在 10 比方说 分钟内启动一项活动 仅此而已 谢谢 将闹钟设置为 10 分钟 比方说 使用此代码 AlarmManager alarmMgr Al
  • 如何改变 dplyr 中的 for 循环

    我想为数据框中的列创建多个值范围的滞后变量 我的代码可以成功执行我想要的操作 但无法根据我的需要进行扩展 数百次迭代 我的下面的代码成功地完成了我想要的操作 但无法根据我的需要进行扩展 数百次迭代 Lake Lag lt Lake Cham
  • SparkSQL注册表时MissingRequirementError

    我是 Scala 和 Apache Spark 的新手 我正在尝试使用 Spark SQL 克隆后repo我通过输入启动了 Spark shellbin spark shell并运行以下命令 val sqlContext new org a
  • C free() 例程和递增数组指针

    会不会free 如果我动态分配一个数组 然后传递一个指向数组中间的指针 而不是初始指针 那么常规工作会怎样 例子 int array malloc 10 sizeof array if array array 5 adjusting the
  • 使用 Spring Boot 应用程序启用 HTTP 严格传输安全 (HSTS)

    我已经关注了这篇文章https docs spring io spring security site docs 4 0 2 RELEASE reference html headers html headers hsts在我的 Sprin
  • JavaScript location.reload() 正在丢失发布数据

    我正在尝试使用java脚本重新加载页面 页面重新加载 但页面中的帖子数据未加载 帖子数据被删除 而页面重新加载任何人都可以帮助我 function currencychange xxx setTimeout delay 2000 funct
  • 在 Paul Graham 的 ANSI Common Lisp 中编写示例

    谁能解释一下 Paul Graham 的 ANSI Common Lisp 第 110 页中的示例吗 该示例尝试解释使用 rest 和 lambda 来创建函数式编程工具 其中之一是组成函数参数的函数 我找不到任何解释它是如何工作的 代码如