我在 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")
工作,也是,所以我无法确定问题出在哪里。我错过了什么?
最佳答案
您的问题是您对 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
循环。
关于lisp - 向量中字符串的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936295/