Function 该函数未定义。(递归)

Function 该函数未定义。(递归),function,recursion,lisp,undefined,Function,Recursion,Lisp,Undefined,我正在编写一个简单的成员函数,返回与该成员关联的值。测试第一个值是否为我们要查找的值的条件的第一行工作正常,但是测试列表中更进一步的部分的递归部分每次都返回一个错误 以下是我的功能: (defun mem (prop L) (cond ((eq (caar L) prop) (print cadar L))) (t (mem (prop (cdr L)))))) // error is on this line! 所以,如果我进去 (me

我正在编写一个简单的成员函数,返回与该成员关联的值。测试第一个值是否为我们要查找的值的条件的第一行工作正常,但是测试列表中更进一步的部分的递归部分每次都返回一个错误

以下是我的功能:

(defun mem (prop L)
  (cond
    ((eq (caar L) prop) (print cadar L)))
    (t (mem (prop (cdr L))))))                   // error is on this line!
所以,如果我进去

(mem `i `((i 1) (j 2)))
它正确地返回1。但是如果我进去

(mem `j `((i 1) (j 2)))
它返回一个未定义函数prop的错误

如何让程序知道prop不是函数,只是一个输入参数


这是我的第一个lisp程序,所以我假设答案非常简单,但我已经尝试了很多事情,但还没有成功。

问题在于代码片段:prop cdr L。它试图调用prop,将其传递给cdr L。要将其作为参数传递给mem,只需省去额外的括号:mem prop cdr L

如果您在计算括号的位置时遇到问题,请注意Lisp语法与函数的数学语法非常相似,只是函数位于括号内,使用空格而不是逗号,但这不是问题。例如,用数学符号编写,您有:mempropcdrL,而不是memprop,cdrL

其他问题 看起来在cond的第一个分支后面有一个额外的括号,它会提前结束。使用括号匹配的编辑器/IDE捕捉此类错误。Emacs也这样做。前者可以通过在web上搜索平台的设置说明来与Common LISP一起使用,而后者则很容易支持Scheme

分号;是大多数Lisp中使用的注释字符

此函数不需要打印,根据其行为,打印可能不正确。在某些LISP(例如Common LISP)中,它返回其参数,但在另一些LISP中,它可能返回nil或某些void类型的实例

aka,backtick也是不必要的。QUISQUOTE允许您引用一些符号,而其他以逗号为前缀的符号将替换为它们的值。因为在引用的表达式中不需要替换,所以简单的引用就可以了:mem'j'i 1 j 2


为了可读性,请在右括号和右括号之间插入更多空格。

当您试图使用变量L的值作为目标流打印不存在的变量cadar的值时,我看不出函数如何返回1。