【问题标题】:Why does member function return nil为什么成员函数返回nil
【发布时间】: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


【解决方案1】:

只需(member x *DSTATES* :test #'tree-equal)

这将使member 检查会员资格。

希望对大家有所帮助

how to test whether one list is a member of another

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-25
    • 2018-02-19
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2014-11-11
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多