我想问为什么我的函数不需要使用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动作吗?
为什么这有效?
答案 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
)。
关于“为什么”:它在标准中以这种(非常明智的)方式定义,并且实现以这种方式实现它。