你在这么多方面做错了。
1. - 为什么在只使用可选参数时创建-aux函数?
(defun constants (form &optional lst)
(cond
((null form) lst) ...
2. - 你不需要那么多类似的分支,你可以写:
((find (car form) '(implies not and or))
(constants (cdr form) lst))
- delete-duplicates可以修改你的清单,但不认为这不得不,甚至如果会,它所做的修改不是你想要的。你应该使用它的结果。我认为你甚至有一个风格警告,在SBCL它看起来像这样你的代码:
; caught STYLE-WARNING:
; The return value of DELETE-DUPLICATES should not be discarded.
阅读警告,它有帮助。
我不明白你期待什么结果,所以我不能修改你的函数来正常工作,但我会试着告诉你问题在哪里。您的最后两个COND分支代码:
((atom (car form))
(print (car form))
(cons (car form) (list lst)) ;; Result is ignored
(delete-duplicates lst) ;; Result is ignored
(constants-aux (cdr form) lst))
你应该写:
(constant-aux (cdr form) (delete-duplicates lst))
(T
(constants-aux (car form) lst) ;; Result is ignored
(constants-aux (cdr form) lst))))
可能(取决于你想要得到什么),你应该写:
(cons
(constants-aux (car form) lst)
(constants-aux (cdr form) lst))
我不是很舒服,但它看起来像使用打印进行调试,只需使用trace。为了您的代码它会给你不错的信息,什么是执行过程中与您的清单事情:
0: (CONSTANTS-AUX (IMPLIES (NOT Q) (IMPLIES Q P)) NIL)
1: (CONSTANTS-AUX ((NOT Q) (IMPLIES Q P)) NIL)
2: (CONSTANTS-AUX (NOT Q) NIL)
3: (CONSTANTS-AUX (Q) NIL)
Q 4: (CONSTANTS-AUX NIL NIL)
4: CONSTANTS-AUX returned NIL
3: CONSTANTS-AUX returned NIL
2: CONSTANTS-AUX returned NIL
2: (CONSTANTS-AUX ((IMPLIES Q P)) NIL)
3: (CONSTANTS-AUX (IMPLIES Q P) NIL)
4: (CONSTANTS-AUX (Q P) NIL)
Q 5: (CONSTANTS-AUX (P) NIL)
P 6: (CONSTANTS-AUX NIL NIL)
6: CONSTANTS-AUX returned NIL
5: CONSTANTS-AUX returned NIL
4: CONSTANTS-AUX returned NIL
3: CONSTANTS-AUX returned NIL
3: (CONSTANTS-AUX NIL NIL)
3: CONSTANTS-AUX returned NIL
2: CONSTANTS-AUX returned NIL
1: CONSTANTS-AUX returned NIL
0: CONSTANTS-AUX returned NIL
5.这将是真正easyer回答,如果你解释你从这个代码期待什么转型。
好运。
您正在调试器中工作。 'cl-user 3:1>'表示您处于调试级别1. – 2014-09-22 08:33:29