gpt4 book ai didi

lambda - 在 Common Lisp 中定义和使用变量中的函数

转载 作者:行者123 更新时间:2023-12-02 09:01:47 28 4
gpt4 key购买 nike

我偶然发现this解释 Y 组合器的文章。该代码位于Scheme 中,但我正在尝试使用Common Lisp 来完成它。

但是,我在从Scheme 到Common Lisp 的转换时遇到了麻烦。 Scheme 对函数和(其他)变量使用单个命名空间,但 Common Lisp 对函数和变量使用不同的命名空间。我怎样才能解决这个差异,以获得有效的 Common Lisp 代码?

方案代码

这是教程中的一些方案代码。

一开始作者定义了阶乘函数:

(define (factorial n)
if (= n 0)
1
(* n (factorial (- n 1)))))

并将其翻译为:

(define factorial
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))

因为(根据作者的说法)Scheme 就是这么做的:

Scheme simply translates the first definition into the second one before evaluating it. So all functions in Scheme are really lambda expressions.

通用 Lisp

我尝试在 Common Lisp 中重写上述两个片段,以模仿从第一种形式到第二种形式的转换。但 CL 中没有定义,也没有单一的 namespace 。所以我试图用欺骗的方式来解决这个问题。

用 Common Lisp 重写第一个 Scheme 定义很容易:

(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))

但是(对我来说)将其翻译成第二个定义有点棘手。我是这样翻译的:

(setf (symbol-function 'factorial)
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))

这是一个不好的方法吗(或者有更好的方法)吗?它似乎有效,但编译器给了我一个样式警告:未定义的函数:阶乘。

最佳答案

如果我理解正确,您问题的主要内容涉及 "Lisp-1" and a "Lisp-2" 之间的翻译。 .

Scheme 是一个“Lisp-1”——它具有用于函数和变量的单一命名空间。另一方面,Common Lisp 是“Lisp-2”——它具有单独的函数和变量命名空间。

在scheme中可以这样写

(define foo (lambda (...) ...))

然后调用foo,如下所示:

(foo ...)

我们也可以在 Common Lisp 中以完全相同的方式定义 foo,但是如果我们尝试使用该语法调用 foo,你的程序将会崩溃。这是因为 foo 位于 variable 命名空间中,而不是 function 命名空间中。

我们可以使用 funcall 来解决这个问题调用 foo:

(funcall foo ...)

这是一个简短的介绍。 Common Lisp Cookbook的页面 Functions提供您可能会觉得有用的其他详细信息。

关于lambda - 在 Common Lisp 中定义和使用变量中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40985333/

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