0

我在 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")工作,并且也可以工作,所以我无法确定问题出在哪里。我错过了什么?

4

2 回答 2

2

您的问题是您的调用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循环来代替。

于 2013-09-22T01:00:52.577 回答
0

这个有效:

(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)))
于 2013-09-21T19:09:14.747 回答