什么之间的区别eq,eql,equal和equalp,在Common Lisp的?我知道其中一些检查类型,其中一些检查所有类型,但哪个是哪个?什么时候比其他人更好用?
在书中的'lisp之乡'我读过
因为case命令使用eq进行比较,所以它通常仅用于对符号值进行分支.除其他外,它不能用于分支字符串值.
请解释原因?
如果我想比较两个值是否相等,有多种选择,例如:
\n\neq对于符号=对于数字char-equal对于角色string-equal对于字符串eql用于符号、数字和字符串equal对于除符号之外的所有内容(我希望到目前为止我做对了。)
\n\n现在,作为 Lisp 初学者,我的问题是:为什么会这样?这只是出于“历史原因”还是拥有所有这些可能性确实有好处?
\n\n我知道为什么问题总是很难回答,并且可能是基于意见的,但我认为(猜测)高级 Lisp 开发人员普遍同意一些最佳实践。
\n(删除'(1 2)'((1 2)(1 3)))不会从常见的lisp列表中删除'(1 2)..(我认为它使用eq而不是相等)我们还有其他吗?替换从clisp中的列表列表中删除元素??
通用 Lisp。
我正在尝试确定给定列表中是否存在字符串。
我的目标是拥有,
(member searched-string my-list)
但我不断得到NIL。
为什么(member "foo" '("foo" "bar"))返回NIL?
如何删除common-lisp中列表中的重复列表?我试过这个:
(remove-duplicates '( (1 2 3) (1 2 3)))
Run Code Online (Sandbox Code Playgroud)
但它评估的 ((1 2 3) (1 2 3))不是((1 2 3)).
谢谢.
我有以下列表:
(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)
有没有简单的方法来执行替换?
我试图检查一个单词是否是列表的元素.然后它不会将单词添加到列表的前面,但是如果它将该单词移动到列表的前面.我可以将单词添加到列表中,如果它还没有,但我不知道如果它已经在列表中,如何将元素移动到列表的前面.这是我的代码:
(defun movetofront (word lst)
(cond
((member word lst)
(remove word lst))
(T (cons word lst))))
Run Code Online (Sandbox Code Playgroud) 如果我想查找(x 2)是否存在于包含((x 2)(y 2)(z 2))的列表中,例如,我该怎么做?
(member '(x 2) '((x 2) (y 2) (z 2)))
Run Code Online (Sandbox Code Playgroud)
如找到的那样返回NIL
谢谢您的帮助