lisp错误:应该是lambda表达式

时间:2014-05-19 20:36:47

标签: lisp common-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

2 个答案:

答案 0 :(得分:2)

很明显,你很惊讶SEXpressions是如何组合起来创建有效的Common Lisp程序的。这对初学者来说很常见。让我试着给你一个非常简短的介绍。

最简单的是原子。像Alpha,+,12,-23.4;这四个分别是两个符号,两个数字。加号是一个符号,就像alpha。

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

相关联

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

这给我们带来了下一件事,一件聪明的事情。在Lisp中,所有语法都像第一个函数调用一样出现。所以你得到的结果如下:(if(< a b)(f a)(f b))。哪个不是自下而上评估,而是自上而下,以便它可以根据第一个表单决定它应该对F进行两次调用。

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

这让我们可以解释您在发布中发现的错误。评估者(或编译器)看到((循环...)...),其中的第一个术语是(循环...)。这让评估员感到困惑。它希望看到一个符号。当然,错误信息是完全不透明的,但这是因为事情比我做出更微妙的事情。对于一个无关紧要的初学者。

表单(cond ...)是表单的另一个例子,这不是一个简单的函数调用,而是更像语法。当它瞥了一眼第一个元素,即cond时,它知道期待(cond(??? ...)(??? ...)......等......)???是用来决定是否应该运行该分支的表格......

您的代码还有许多其他问题。我建议您获得一个lisp REPL,并用更小的部分进行实验。循环被打破了。 "((OR(..."遇到同样的问题,第一种形式不是符号。看来你的调用字符串包含一个字符"字符"而不是字符串,这是俗气但可以容忍的。

答案 1 :(得分:0)

Lisp与括号中的大多数其他语言不同重要

具体而言,(foo)foo((foo))不同。

当您编写(JERARQUIA (CARACTER))时,lisp认为您要在函数JERARQUIA的返回值上调用CARACTER,而不是变量CARACTER的值。< / p>

同样,当您编写((loop ...) ...)时,lisp必须将(loop ...)解释为函数指示符,它可以是符号或lambda表达式(或(setf ...))。

因此,为避免此错误,您需要做的就是删除一组额外的parens,将((loop ...))替换为(loop ...)