相当于LIST的LISP'dister'功能

Xav*_*ing 1 lisp common-lisp

我有以下列表:

(1 (2))
Run Code Online (Sandbox Code Playgroud)

我想用(2(3))替换(2)以获得:

(1 (2 (3)))
Run Code Online (Sandbox Code Playgroud)

如下使用subst不会返回所希望的结果:

(subst '(2 (3)) '(2) '(1 (2)))
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来执行替换?

cor*_*ump 6

默认情况下,subst使用eql,你必须指定:test参数使用#'equal,得到你想要的.

CL-USER> (subst '(2 (3)) '(2)  '(1 (2)) :test #'equal)
(1 (2 (3)))
Run Code Online (Sandbox Code Playgroud)

如您所见,两个直接指定的列表不是EQL,但它们是EQUAL:

CL-USER> (eql '(2) '(2)) 
NIL
CL-USER> (equal '(2) '(2))
T
Run Code Online (Sandbox Code Playgroud)

阅读更多关于 lisp中的eq,eql,equal和eqaulp的区别.

  • 值得注意的是,**eql**不仅仅是**subst**的默认值.根据[17.2.1满足双论证测试](http://www.lispworks.com/documentation/HyperSpec/Body/17_ba.htm),"如果既不是**:测试**也不是**:提供了test-not**参数,就好像提供了**#'eql**的**:test**参数." 这适用于该页面上列出的功能(包括**subst**). (2认同)