口齿不清错误 : should be lambda expression

标签 lisp common-lisp

我正在自学 lisp,但我不明白为什么会出现此错误。 如果有人能帮助我,那就太好了:)

这是我遇到错误的情况:

(cond ((equal c1 caracter) (push caracter pilatemp))
    ((or (equal c2 caracter) (equal c3 caracter) (equal c4 caracter) (equal c5 caracter) (equal c6 caracter))
        ((loop
            (setf t1 (jerarquia(caracter)))
            (setf t2 (jerarquia(first pilatemp)))
            if((or (= t1 t2) (> t1 t2)) (return))
            (push (pop pilatemp) piladef))
        (push caracter pilatemp)
            ))
    ((equal c7 caracter) ((loop
                    if((equal (first pila) c1) (return))
                    (push (pop pilatemp) piladef))
                (pop pilatemp)))
    (T (push caracter piladef))
)

这里是“jerarquia”函数:

(defun jerarquia(x)
(setf c1 ")")
(setf c2 "+")
(setf c3 "-")
(setf c4 "^")
(setf c5 "*")
(setf c6 "/")
(setf c7 "(")
(cond ((equal c1 x) 5)
    ((equal c4 x) 4)
    ((equal c5 x) 3)
    ((equal c2 x) 2)
    ((equal c7 x) 1)
    (T 0)))

这是我遇到的错误:

*** - SYSTEM::%EXPAND-FORM:
(LOOP (SETF T1 (JERARQUIA (CARACTER)))
  (SETF T2 (JERARQUIA (FIRST PILATEMP))) IF
  ((OR (= T1 T2) (> T1 T2)) (RETURN)) (PUSH (POP PILATEMP) PILADEF))
should be lambda expression

最佳答案

很明显,您对如何将 SExpressions 放在一起来创建有效的 Common Lisp 程序感到很困惑。这对初学者来说很常见。让我试着给您做一个非常简短的介绍。

最简单的东西是原子。诸如 Alpha、+、12、-23.4 之类的东西;这四个分别是两个符号,两个数字。加号是一个符号,就像 alpha 一样。

下一个最简单的事情是函数调用,即调用一个函数。例如:(+ 1 2)。该示例中的函数是加法,它与符号 + 相关联。

函数调用在所有编程语言中都很常见。通常他们会从左到右自下而上地评估它们。所以 (F (G 1 2) (H 3 5)) 将调用 G,然后是 H,然后是 F。如果他们想做其他事情,他们会引入语法,例如 if 语句、循环等。

这给我们带来了下一件事,一件聪明的事。在 Lisp 中,所有语法乍一看就像函数调用一样。所以你得到这样的东西:(如果(< a b)(f a)(f b))。哪个不是自下而上的评估,而是自上而下的评估,以便它可以根据第一种形式决定它应该对 F 进行的两个调用中的哪一个。

这些自上而下的形式有两种形式,特殊形式和宏,但对于初学者来说这并不重要。这些形式用于代替您在其他语言中找到的语法。评估者/编译者看一眼列表中的第一项,以确定它是一个简单的函数调用还是一些语法。

这让我们可以解释您在发帖中观察到的错误。评估者(或编译器)看到了((loop ...)...),其中的第一个术语是(loop ...)。这让评估者感到困惑。它希望看到一个符号。当然,错误消息是完全不透明的,但那是因为事情比我想象的要微妙一些。对于初学者来说,这并不重要。

形式 (cond ...) 是形式的另一个示例,它不是简单的函数调用,而是更像是语法。当它看到第一个元素时,即 cond,它知道期望 (cond (??? ...) (??? ...) ...etc...) 其中 ???是它将用来决定是否应该运行该分支的...

您的代码还有许多其他问题。我建议您使用 lisp REPL 并以更小的部分进行实验。回路坏了。 "((OR (..."遇到第一种形式不是符号的相同问题。看来您的调用字符串包含单个字符“字符”而不是字符串,这很俗气但可以容忍。

关于口齿不清错误 : should be lambda expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746775/

相关文章:

common-lisp - SBCL 内置可执行文件 : "When attempting to set the slot' s value to XXX (SETF of SLOT-VALUE), 对象中缺少插槽 YYY”?

heap-memory - 使用 SBCL 编译 lapack 系统时堆耗尽

macros - 编译后,假设程序可以在不调用 eval 的情况下运行吗?

lisp - 在 Notepad++ 中编译 lisp/scheme

common-lisp - Common Lisp 中 `set` 、 `setq` 和 `setf` 之间的区别?

common-lisp - flet 与 let+funcall 的区别

xml - 使用 emacs elisp 解析 XML 并查找嵌套属性

lisp - 根据函数 F 从列表 L 中返回最佳元素?

algorithm - 对 Lisp 程序的算法分析的建议?

common-lisp - 在我自己的包中使用 SBCL 的分析器