为什么我的函数在lisp中没有值关键字时返回多个值

时间:2018-04-06 18:14:53

标签: function return lisp common-lisp

我想问为什么我的函数不需要使用values函数来输出嵌套列表?

(defun p2 (l)
(cond
 ((null l) nil)
 ((listp (car l)) ( values (p2 (car l)) (p2 (cdr l))) )
 (t (princ (car l)) (princ " ") (p2 (cdr l)))
 ))

我的意思是,如果条件为真,cond构造返回1值或采取1动作吗?
为什么这有效?

1 个答案:

答案 0 :(得分:4)

<script>

var session = localStorage.getItem('myappsession');
if (session == null) {
    session = 0;
}

location.href = 'f?p=appalias:startpage:' + session;

</script>

(defun p2 (l) (cond ((null l) ; condition nil) ; body ((listp (car l)) ; condition (values (p2 (car l)) ; \ (p2 (cdr l)))) ; /` body (t ; condition (princ (car l)) ; \ (princ " ") ; > body (p2 (cdr l))))) ; / 表单有三个子句。每个子句都是一个列表,其中第一个元素是条件,其余是一个主体。 cond依次查看每个子句,直到找到条件为真的子句。然后它在隐式Cond 中执行该子句的主体。 progn返回其最后一个形式返回的所有值。 Progn返回匹配子句返回的所有值。函数返回其正文返回的所有值(这是另一个隐式Cond)。

关于“为什么”:它在标准中以这种(非常明智的)方式定义,并且实现以这种方式实现它。