我试图理解LISP中的“替代”功能,但有些东西我不明白。 当我执行此操作时:
(defparameter *mytree* nil)
(push 1 *mytree*)
(substitute '8 '1 *mytree*)
一切运行正常, mytree 的值为(8)。
但是,当我表演时:
(defparameter *mytree* nil)
(push "A" *mytree*)
(substitute '8 '"A" *mytree*)
然后 mytree 是(“A”)而不是(8)就像我期望的那样。
知道为什么会这样吗?
答案 0 :(得分:0)
您需要在替换中使用:test关键字来使用正确的等式检查方法。
substitute
的签名是
(substitute newitem olditem sequence &key from-end test test-not start end count key)
Substitute
默认使用eql
,但在这种情况下无法使用
(eql "A" "A") ;; nil
(equal "A" "A") ;; t
这将产生正确的结果
(defparameter *mytree* nil)
(push "A" *mytree*)
(substitute 8 "A" *mytree* :test 'equal) ;; note the test, returns (8)