No value returned by Common Lisp function
我已经阅读到Common Lisp中的每个表单在评估时都会返回一些信息。但是,最近我一直在使用ASDF API,发现一个不返回任何内容的函数:
1 2
| CL-USER> (asdf:clear-output-translations)
; No value |
这怎么可能?为什么不返回类似NIL的内容?
通用Lisp允许函数从0返回最多MULTIPLE-VALUES-LIMIT个值。常量MULTIPLE-VALUES-LIMIT为20或更大。
函数VALUES允许一个返回多个值,包括零个值。
因此,当函数没有有用的返回值且仅出于副作用而被调用时,通常的习惯用法是使用(values)形式。同样,这通常也会导致Lisp侦听器(也称为REPL)不打印任何内容作为返回值,这出于美学原因可能很有用。
请注意,变量仅具有一个值,并且只能将一个值恰好绑定到变量。
- 在这种情况下,我更喜欢返回nil。有趣的是,表达式(eq nil (values))在CLISP和SBCL上被求值为T。
-
@Mark:您不能在Common Lisp中将参数的零值传递给函数参数。因此,它被替换为nil。因此EQ返回T是因为nil等于nil。
-
multiple-value-call可以用于允许任意参数的函数。例如。 (multiple-value-call #'= 0 (values)) ; ==> t,但(multiple-value-call #'eq nil (values))将不起作用,因为EQ恰好需要两个参数。
函数不能使用(values)形式返回任何值。
例如:
1 2
| (defun foo ()) ;; returns nil
(defun bar () (values)) ;; returns nothing |