lisp - 向量中字符串的相等性

标签 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)))  

如果我在数字上使用它没问题,但对于字符串,例如(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/

相关文章:

emacs - 杀死 paredit 中的下一个表达式

lisp - SBCL 的统计分析器不显示每个调用的函数的条目

unit-testing - 单元测试功能 elisp

emacs - 列出所有必需的功能

emacs - 具有较少冗余的defface

使用记忆化计算组合 nCk 的方案

lisp - cl-who 在函数调用中传递流

dictionary - 通过应用给定的操作将矩阵转换为向量的函数

emacs 组织模式,无法设置自定义 TODO 序列

regex - emacs 主模式定义