3

我想知道为什么每个常见的 lisp 函数/宏定义都会返回正在定义的内容?它可以返回 nil 或函数本身。为什么返回定义的符号?有什么我可以做的吗?

> (defun foo ()) => foo

> (defmacro bar ()) => bar
4

2 回答 2

5

我希望 Lisp 中的每个定义形式都返回已定义的名称(如 in DEFUN)或已定义的对象的名称(如 in DEFCLASS)。

这是一个有用的值,以后可以使用。在 Lisp 交互中,变量***具有***最后一个值。因此,您可以在带有解释器和编译器的 Lisp 中执行以下操作:

剪辑:

[1]> (defun foo-with-a-long-name (a) (+ a 42))
FOO-WITH-A-LONG-NAME

编译函数就是:

[2]> (compile *)
FOO-WITH-A-LONG-NAME ;
NIL ;
NIL

没有错误。我们来看看拆解:

[3]> (disassemble *)

Disassembly of function FOO-WITH-A-LONG-NAME
(CONST 0) = 42
1 required argument
0 optional arguments
No rest parameter
No keyword parameters
4 byte-code instructions:
0     (CONST&PUSH 0)                      ; 42
1     (LOAD&PUSH 2)
2     (CALLSR 2 55)                       ; +
5     (SKIP&RET 2)
NIL

好的,看起来不错。

于 2013-08-30T12:05:05.017 回答
2

每个表单返回某些东西的原因是它是如何设计的。在 read-eval-print-loop 中,这很有用,因此即使不使用它也能得到确认。

除了 CL 在其规范中指定之外,返回的内容并不重要,因此每个 CL 都在做同样的事情。

请记住,它仅在 REPL 中显示返回的内容。当您运行脚本时,只会显示您打印的内容。

另一种主要的方言,Scheme,据说它在变异时不会返回任何东西。实际上,实现返回一个只有 REPL 忽略的特殊对象。如果你(显示(设置!X 6))你会得到打印的东西。

于 2013-08-30T09:40:40.363 回答