我想知道是否有一种方法可以强制getf使用equal而不是eq进行比较?我正在使用常见的lisp的ccl实现。
答案 0 :(得分:4)
没有。你必须使用不同的功能;大概喜欢这样的东西可以做你需要的东西:
(defun equal-getf (plist indicator)
(second (member indicator plist :test #'equal)))
修改强>
这是一个固定版本,可以将列表正确地视为键/值对:
(defun equal-getf (plist indicator)
(loop for key in plist by #'cddr
for value in (rest plist) by #'cddr
when (equal key indicator)
return value))
答案 1 :(得分:0)
我不知道是否有办法“覆盖”默认设置,看看您是否可以使用(describe 'getf)
或(symbol-plist 'getf)
找到impl。可能的简化实现可能是
(defun mgetf (l v) (if (< (length l) 2) NIL (if (equal (car l) v) (car (cdr l)) (mgetf (nthcdr 2 l) v))))
已编辑:使用nthcdr而不是double cdr。
答案 2 :(得分:0)
这应该可以胜任。这不是很好的递归,而是使用直接的LOOP应用程序。为了允许它使用任意等价谓词,使用可选参数的路径应该是直截了当的。
(defun mgetf (place indicator)
(loop for (key value . rest) on place by #'cddr
if (equal key indicator)
do (return value)))