我是lisp的初学者,我需要有人向我解释一下这个prog
表单的工作原理.l1的初始值是多少?没?
如果列表在第一级上具有偶数个元素,则问题输出T,否则为零.
(defun nr_par (l)
(prog ((l1 l))
ciclu
(cond
((null l1) (return T))
((null (cdr l1)) (return NIL))
((null (cddr l1)) (return T))
(T (setf l1 (cddr l1))
(go ciclu)))))
Run Code Online (Sandbox Code Playgroud)
在控制台上:
(nr_par '(1 2 3 4 5 6 7 8))
T
Run Code Online (Sandbox Code Playgroud)
该程序很简单,但不是非常惯用的lisp(它是相当必要的而不是功能).一步一步如下.
prog
使用一系列变量绑定,在这种情况下,l1
赋值为l
initial.然后,循环开始的一系列语句(再次,不是非常lisp惯用).
这种类型的循环再次使用tag(ciclu
)和goto指令(go
),不推荐,但它就在那里.之后,cond
检查一系列案例.当列表为空(null
)时,返回true,在其他情况下,检查长度是偶数还是奇数,并返回值.
在列表长于一个或两个元素(两个情况都不为空)的情况下,l1
调整列表以指向其自身的下一个元素(cddr
函数)的下一个元素.
最后,该go
函数将程序转回ciclu
标签.
当cond
满足任何条款时,程序将结束,返回T
或者NIL
.