【发布时间】:2017-04-20 12:00:06
【问题描述】:
我偶然发现了 this 解释 Y Combinator 的文章。代码在 Scheme,但我正在尝试使用 Common Lisp 完成它。
但是,我在从 Scheme 到 Common Lisp 的翻译中遇到了麻烦。 Scheme 对函数和(其他)变量使用一个命名空间,但 Common Lisp 对函数和变量使用不同的命名空间。我怎样才能解决这个差异,以获得有效的 Common Lisp 代码?
方案代码
这是教程中的一些 Scheme 代码。
一开始作者定义了阶乘函数:
(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 中的所有函数都是真正的 lambda 表达式。
普通的 Lisp
我尝试在 Common Lisp 中重写上述两个 sn-ps 以模仿从第一种形式到第二种形式的转换。但是 CL 中没有 define,也没有单一的名称空间。所以我试图用自己的方式作弊。
用 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))))))
这是一种不好的方法(或者有更好的方法)?它似乎有效,但编译器给了我一个样式警告:未定义函数:阶乘。
【问题讨论】:
标签: lambda scheme common-lisp