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

jak*_*ter 0 lisp return function 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)))
 ))
Run Code Online (Sandbox Code Playgroud)

我的意思是,cond如果条件为真,构造是否不返回 1 个值或执行 1 个操作?
为什么这样做?

Sva*_*nte 5

(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)))))  ; /
Run Code Online (Sandbox Code Playgroud)

这个cond表格有三个条款。每个子句都是一个列表,其中第一个元素是条件,其余元素是正文。 Cond依次查看每个子句,直到找到条件为真的子句。然后它以隐式的方式progn执行该子句的主体。 Progn返回其主体的最后一种形式返回的所有值。 Cond返回匹配子句返回的所有值。一个函数返回其主体(这是另一个隐式progn)返回的所有值。

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