【发布时间】:2014-09-28 19:39:21
【问题描述】:
我有一个清单:
*DSTATES* = ( ( list1 ) ( list2 ) ( list3 ) ... ( listn ) )
还有一个州名列表,x = ( list )
*DSTATES* 拥有( (zero) (three two one) (two) (three zero) )
x 有(two)。
这是我的代码:
(map '() #'(lambda (x)
(princ "Looking at transition ") (princ x)
(princ #\newline)
(if (and (eq '() (member x *DSTATES*)) (not (eq '() x)))
(progn
(princ x) (princ " is not a member of *DSTATES*")
(princ #\newline)
(setq *DSTATES* (append *DSTATES* (list x)))))
(princ "Intermediate *DSTATES* ") (princ *DSTATES*)
(princ #\newline) (princ #\newline))
trans)
当我执行( eq '() ( member x *DSTATES* ) ) 时,它总是——据我所知——返回真。因此,*DSTATES* 变得越来越大,而我的循环(在*DSTATES* 的大小上具有停止条件)永远不会终止。
我该如何解决这个问题?
【问题讨论】:
-
样式问题1:永远不要追加到列表的末尾。
-
样式问题2:
(eq '() foo)是(null foo)。如果是布尔值,请使用(not foo). -
好的,谢谢你的建议。追加到列表末尾有什么问题?
-
问题 4:
*states*是一个列表列表。member不会找到任何东西,因为它不查看子列表。 -
member检查项目是否在列表中。member不检查项目是否在子列表中。
标签: lisp