我想知道为什么每个常见的 lisp 函数/宏定义都会返回正在定义的内容?它可以返回 nil 或函数本身。为什么返回定义的符号?有什么我可以做的吗?
> (defun foo ()) => foo
> (defmacro bar ()) => bar
我想知道为什么每个常见的 lisp 函数/宏定义都会返回正在定义的内容?它可以返回 nil 或函数本身。为什么返回定义的符号?有什么我可以做的吗?
> (defun foo ()) => foo
> (defmacro bar ()) => bar
我希望 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
好的,看起来不错。
每个表单返回某些东西的原因是它是如何设计的。在 read-eval-print-loop 中,这很有用,因此即使不使用它也能得到确认。
除了 CL 在其规范中指定之外,返回的内容并不重要,因此每个 CL 都在做同样的事情。
请记住,它仅在 REPL 中显示返回的内容。当您运行脚本时,只会显示您打印的内容。
另一种主要的方言,Scheme,据说它在变异时不会返回任何东西。实际上,实现返回一个只有 REPL 忽略的特殊对象。如果你(显示(设置!X 6))你会得到打印的东西。