Function 公共Lisp函数未返回任何值
我读过,CommonLisp中的每个表单在计算时都会返回一些内容。但是,最近我一直在使用ASDF API,发现了一个不返回任何内容的函数:Function 公共Lisp函数未返回任何值,function,lisp,common-lisp,return-value,Function,Lisp,Common Lisp,Return Value,我读过,CommonLisp中的每个表单在计算时都会返回一些内容。但是,最近我一直在使用ASDF API,发现了一个不返回任何内容的函数: CL-USER> (asdf:clear-output-translations) ; No value 这是怎么可能的,为什么它不返回类似于NIL?函数可以使用(值)表单不返回值 例如: (defun foo ()) ;; returns nil (defun bar () (values)) ;; returns nothing Common
CL-USER> (asdf:clear-output-translations)
; No value
这是怎么可能的,为什么它不返回类似于
NIL
?函数可以使用(值)
表单不返回值
例如:
(defun foo ()) ;; returns nil
(defun bar () (values)) ;; returns nothing
Common Lisp允许函数从
0
返回至多个值。常数多值限值
为20
或更大
该函数允许返回,包括零值
因此,一个常见的习惯用法是,当函数没有有用的返回值并且只是为了产生副作用而调用时,使用形式(值)
。此外,这通常会导致Lisp侦听器(也称为REPL)不将任何内容打印为返回值,这对于美学上的原因很有用
请注意,变量只有一个值,并且只能将一个值绑定到一个变量。在这种情况下,我宁愿返回
nil
。。。有趣的是,表达式(eq nil(values))
在CLISP和SBCL上的计算结果为T
。@Mark:在Common Lisp中,不能将参数的零值传递给函数参数。因此,它被NIL
取代。因此,EQ
返回T
是因为NIL
是EQ到NIL
,多值调用
可以用于允许任意参数的函数。例如,(多值调用#'=0(值));=>t
但是(多值调用#'eq nil(值))
不起作用,因为eq
只需要两个参数。