大家好,我正在尝试使用 clisp v2.47 编写一个 lisp 函数,它接受一个单词并在它是回文时返回 true,否则它将返回 false。顺便说一句,值得一提的是我是 lisp 的新手,所以我没有编写 lisp 代码的经验。
这是我的代码:
(defun palindrome( L )
(cond
((equal L '()) T )
((equal (car (L)) (last ( L )))
(palindrome (cdr (reverse (cdr (L))))))
(t nil)))
当我将它粘贴到 clisp 中时,一切正常,但是当我运行它时,出现了我不知道如何修复的错误:
[2]> (setq M '(bob))
(BOB)
[3]> (palindrome M)
*** - EVAL: undefined function L
The following restarts are available:
USE-VALUE :R1 Input a value to be used instead of (FDEFINITION 'L).
RETRY :R2 Retry
STORE-VALUE :R3 Input a new value for (FDEFINITION 'L).
ABORT :R4 Abort main loop
Break 1 [4]>
非常感谢任何帮助,因为我真的很急于完成这个程序。
谢谢大家
最佳答案
调用 (last ( L ))
不会计算列表 L
的最后一个元素。它不带任何参数调用名为 L
的函数,期望获得一个列表作为返回值,并计算该列表的最后一个 cell。 (car (last L))
将计算列表的最后一个元素。
在 Lisp 中,括号不是用来对代码语句进行分组的。它们表示功能应用程序。
(a b c d)
意思是,“用参数 b, c, d
调用函数 a
”。
(a)
意思是,“调用一个函数a
”。
因此,您的代码没有定义任何名为 L
的函数。它使用一个名为 L
的参数,但在 Common LISP 中,函数名和值名是两个不同的命名空间。
[11]>
(defun palindrome( L )
(cond
((null L) T )
((equal (car L) (car (last L)))
(palindrome (cdr (reverse (cdr L)))))))
PALINDROME
[12]> (palindrome '(bob))
T
编辑: 遵循 wvxvw 的最佳想法,这里有一个更好的代码,它不会过多地遍历列表:
(defun palindrome (x)
(do ((x x (cdr x))
(y x (cddr y))
(z () (cons (car x) z)))
((null (cdr y))
(equal z (if y (cdr x) x)))))
关于lisp - 用于回文的小型 lisp 程序的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10434036/