LISP函数替换不替换我的字符串

时间:2014-03-14 13:43:57

标签: lisp

我试图理解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)就像我期望的那样。

知道为什么会这样吗?

1 个答案:

答案 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)