Lisp 向量中字符串的相等性

Lisp 向量中字符串的相等性,lisp,elisp,Lisp,Elisp,我在elisp中定义了一个函数,用于查找向量中列表的索引: (defun vposition (e v) (letrec ((f (lambda (e v i) (if (equal e (elt v i)) i (f e v (+ i 1)))))) (f e v 0))) 如果我在数字上使用它就可以了,但是如果使用字符串,例如(vposit

我在elisp中定义了一个函数,用于查找向量中列表的索引:

(defun vposition (e v)  
   (letrec  
      ((f (lambda (e v i)  
             (if (equal e (elt v i))  
                 i  
                 (f e v (+ i 1))))))  
      (f e v 0)))  
如果我在数字上使用它就可以了,但是如果使用字符串,例如
(vposition“bar”[“foo”“bar”“thing”])
,我会得到一个错误:

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p "bar")
  =("bar" "foo")
如果我这样做,比如说,
(vposition 3[1 2 3])
,它会像预期的那样工作,
(equal“bar”“foo”)
也会工作,所以我无法找出问题所在。我遗漏了什么?

这一个有效:

(defun vposition (e v)
  (cl-labels ((f (e v i)
                (if (equal e (elt v i))
                    i
                  (f e v (+ i 1)))))
    (f e v 0)))

您的问题是,您对
f
的调用并没有调用局部变量
f
中的函数,而是调用了您先前可能意外定义的其他函数
f
(该函数使用
=
而不是
equal
)。当我尝试您的代码和示例时,我得到一个不同的错误:

Symbol's function definition is void: f
您可以使用以下工具轻松修复代码:

(defun vposition (e v)  
  (letrec  
      ((f (lambda (e v i)  
            (if (equal e (elt v i))  
                i  
              (funcall f e v (+ i 1))))))
    (funcall f e v 0)))

当然,像这样的递归在Elisp中往往效率低下,因为Elisp实现太幼稚了,所以您可能希望使用
while
循环来代替。

哪里定义了
cl标签
?它不在
cl
中。另外,是否存在
letrec
中断和
cl标签
不中断的原因?文件是
cl macs.el
,但您可以通过
(需要'cl lib)
获得它
cl-lib
是在Emacs中使用cl的好方法,我想。