Lisp错误:应该是lambda表达式



我正在自己学习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

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

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

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

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

这就引出了下一件事,一个聪明的事情。在Lisp中,所有语法乍一看就像函数调用一样。你会得到这样的东西:(if (

这些自顶向下的表单有两种形式,特殊表单和宏,但对于初学者来说这并不重要。使用这些形式来代替在其他语言中找到的语法。求值器/编译器会浏览列表中的第一个项,以确定它是一个简单的函数调用还是一些语法问题。

让我们解释你在帖子中观察到的错误。求值器(或编译器)看到((loop…)…),其中的第一个项是(loop…)。这让评估者感到困惑。它希望看到一个符号。当然,错误消息是完全不透明的,但这是因为事情比我所描述的要微妙得多。对于初学者来说,这并不重要。

形式(cond…)是另一个形式的例子。这不是一个简单的函数调用,而是更像语法。当它作为第一个元素,即cond,它知道期待(cond) (???)…)(? ?等等)在哪里??是用来决定是否运行该分支的…

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

Lisp与大多数其他语言的不同之处在于括号很重要

具体来说,(foo)foo((foo))不同。

当你写(JERARQUIA (CARACTER))时,lisp认为你想在函数CARACTER的返回值上调用JERARQUIA,而不是变量CARACTER的值。

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

因此,为了避免此错误,您所需要做的就是删除额外的父元素,将((loop ...))替换为(loop ...)

最新更新