首先,你需要正确地缩进代码:
(defun write-lookup (binding-list pattern fact)
(cond
; No bindings have been stored
; Return the binding list with a new one!
((not binding-list) (cons (cons pattern fact) nil))
; A list of bindings is being stored
(cond
; The current binding matches
((equal (caar binding-list) pattern)
; Return the binding-list if value matches, nil else
(if (compare pattern fact) binding-list nil))
; Recursively search the rest of the list for the binding
((cdr binding-list) (write-lookup (cdr binding-list) pattern fact))
; The list doesn't have the binding.
; Return the binding-list with the added pattern
(T (cons (cons pattern fact) binding-list)))))
一个典型的Lisp的编辑器会为你做一个按键。
现在您可以很容易发现第一个COND缺少T子句。我要补充的是:
(defun write-lookup (binding-list pattern fact)
(cond
; No bindings have been stored
; Return the binding list with a new one!
((not binding-list) (cons (cons pattern fact) nil))
; A list of bindings is being stored
(t (cond
; The current binding matches
((equal (caar binding-list) pattern)
; Return the binding-list if value matches, nil else
(if (compare pattern fact) binding-list nil))
; Recursively search the rest of the list for the binding
((cdr binding-list) (write-lookup (cdr binding-list) pattern fact))
; The list doesn't have the binding.
; Return the binding-list with the added pattern
(T (cons (cons pattern fact) binding-list))))))
我也动注释掉的代码:
(defun write-lookup (binding-list pattern fact)
(cond ((not binding-list) ; No bindings have been stored
(cons (cons pattern fact) nil)) ; Return the binding list with a new one!
(t ; A list of bindings is being stored
(cond ((equal (caar binding-list) pattern) ; The current binding matches
(if (compare pattern fact) ; Return the binding-list if value matches, nil else
binding-list
nil))
((cdr binding-list) ; Recursively search the rest list for the binding
(write-lookup (cdr binding-list) pattern fact))
(T ; The list doesn't have the binding.
(cons (cons pattern fact) ; Return the binding-list adding the pattern
binding-list))))))
谢谢!缺少的T是罪魁祸首。 – 2010-09-24 22:52:07
嵌套的COND是否可以做任何事情?看起来像将嵌套COND中的子句带出到主COND的子句级别将产生相同的结果。 – Vatine 2010-09-25 10:26:12
@Vatine,这是一个很好的观察。我不想重写代码,但这是一回事。还有(cons foo nil)=(list foo),... – 2010-09-25 10:58:34