gpt4 book ai didi

namespaces - 在 LISP lambda 函数中使用参数作为运算符(Lisp 的根源)

转载 作者:行者123 更新时间:2023-12-02 18:06:38 24 4
gpt4 key购买 nike

我正在自学 Lisp,主要是因为我喜欢能够从小的公理 block 构建程序的想法。学习 lisp 对我来说是一个业余爱好项目,因为 i) 它看起来很有趣,ii) 我想看看它是否真的能让我以新的方式看待问题。为此,我正在阅读 Paul Graham 的《The Roots of Lisp》文章。我正在使用 SBCL 实现,但我的问题也出现在其他实现上。我在尝试在 lambda 函数中使用参数作为运算符时遇到了问题:

((lambda (f) (f '(b c))) 
'(lambda (x) (cons 'a x)))

根据 The Roots of Lisp 的第 2 节,其计算结果应为 (a b c)。这是有道理的,第二个 lambda 是第一个 lambda 的参数。假设我的理解是正确的,表达式简化为:

((lambda (x) (cons 'a x)) '(b c))

好吧。运行后者可以按预期工作。但是,运行前一个未简化的表达式会导致错误: The function COMMON-LISP-USER::F is undefined. 其他 SO 问题( herehere )让我相信这与 CL 中的函数与变量命名空间有关,我已经以各种方式尝试了 #' 语法,但我似乎无法让它按照我的方式工作预计。我该怎么办?

谢谢!

最佳答案

这里有两个错误:

  1. 您不应引用此表达式'(lambda (x) (cons 'a x)),它必须经过计算才能发挥作用。
  2. Common Lisp 是 Lisp-2 ,你必须使用 funcall获取符号的函数值。

正确代码:

((lambda (f) (funcall f '(b c))) 
(lambda (x) (cons 'a x)))

关于namespaces - 在 LISP lambda 函数中使用参数作为运算符(Lisp 的根源),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73099432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com