getf可以用于比较而不是eq吗? (常见的lisp)

时间:2010-06-10 18:16:50

标签: common-lisp

我想知道是否有一种方法可以强制getf使用equal而不是eq进行比较?我正在使用常见的lisp的ccl实现。

3 个答案:

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