2013-09-21 53 views
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")作品也一樣,所以我不能孤立問題的所在。我錯過了什麼?

回答

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來代替。

+0

真的很徹底的答案 - 謝謝! – amindfv

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))) 
+0

「cl-labels'''定義在哪裏?它不在'''cl'''中。另外,有沒有理由'''letrec'''休息和'''cl-labels'''不? – amindfv

+0

該文件是'cl-macs.el',但你可以通過'(require'cl-lib)'得到它。 'cl-lib'是在Emacs中使用cl的有趣方式,我想。 –