在阅读其他开发人员编写的 Commom Lisp 代码时,我注意到他们中的一些人调用VALUES访问器,而没有在返回值是无效或可忽略的定义的最后一种形式中提供任何参数。
例子:
(defun definition-whose-return-values-are-neglectable ()
... Some s-expressions ...
(values))
将此形式添加为这些类型定义中的最后一个表达式是否有任何优势(对于编译器、性能等)?
在阅读其他开发人员编写的 Commom Lisp 代码时,我注意到他们中的一些人调用VALUES访问器,而没有在返回值是无效或可忽略的定义的最后一种形式中提供任何参数。
例子:
(defun definition-whose-return-values-are-neglectable ()
... Some s-expressions ...
(values))
将此形式添加为这些类型定义中的最后一个表达式是否有任何优势(对于编译器、性能等)?
一件有用的事情是,当您在 REPL 中调用该函数时,您最终不会打印出随机值。这在与系统交互时非常方便。
Lisp中没有invisible
,所以无论你的函数返回什么,都将由P
REPL 的 (print) 部分打印。这意味着如果您的打印设置不合适,系统可能会打印很多屏幕(您甚至可能会得到一个令人困惑的堆栈溢出错误,因为您的print-circle是nil
并且返回值是一个循环结构)。
编译器可以做一些优化(具体的编译器在实践中可能会或可能不会做);例如,它可能会将函数标记为不返回任何有趣的内容,然后编译表达式,例如(setq var (my-func))
to (progn (my-func) (setq var nil))
。
如果编译器可以证明该函数没有副作用并且您以它结束,(values)
那么编译器可以完全放弃它的调用。
计算机编程的一个重要方面是您的代码将被包括您自己在内的其他人阅读,并且添加(values)
到函数的末尾告诉读者该函数仅用于副作用。
最后一种形式的优点或主要用例(values)
是:
*print-circle*
设置为t
、
*print-length*
设置为nil
、
*print-level*
设置为nil
或任何类似的实现特定参数*
为nil
无值被视为 的结果
nil
,并设置/
为空列表非优势/非问题:
multiple-value-call
表单中使用时multiple-value-call
问题:
ftype
declare
declaim
1.您可以通过将历史大纲的内容设置为空列表来清除 Allegro CL 中的侦听器历史:
(setf (cg:range (cg:find-component
:history-outline
(first (cg:toolbars ide.base:*listener-window*))))
'())