lisp - 用于回文的小型 lisp 程序的困难

标签 lisp clisp

大家好,我正在尝试使用 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/

相关文章:

lisp - 类似于图形但具有不同类型边的数学对象的名称是什么?

LISP逐级显示二叉树

lisp - 如何找到 lisp 中发生堆栈溢出的位置?

lisp - 在 Common Lisp 中,您将如何扩展现有的比较器操作以适用于新类型?

common-lisp - sbcl 上的 undefined variable ,而不是 clisp 上的 undefined variable

lisp - lisp 中一个名为 xtoy 的函数,它返回一个从 x 到 y 的列表

LISP 二项式系数、阶乘

parsing - (Prolog) 将 Lisp s-表达式解析为 Prolog 术语

lisp - 如何知道函数是否评估其参数?

lambda - 创建一个 Lisp 宏,可以将 lambda 应用于上下文中的列表