lisp错误:应为lambda表达式

lisp错误:应为lambda表达式,lisp,common-lisp,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

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

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

具体来说,foo与foo和foo不同

在编写JerraQuia-CARACTER时,lisp认为需要调用函数CARACTER的返回值,而不是变量CARACTER的值

同样,当你写循环时。。。,lisp必须解释循环。。。作为函数指示符,可以是符号、lambda表达式或setf


因此,要避免此错误,您只需删除额外的参数集,替换循环。。。使用loop…

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

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

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

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

这给我们带来了下一件事,一件聪明的事。在Lisp中,所有语法乍一看就像函数调用一样。所以你会得到这样的结果:if 这些自上而下的表单有两种风格,特殊表单和宏,但对于初学者来说这并不重要。使用这些形式来代替其他语言中的语法。计算器/编译器浏览列表中的第一个术语,以确定它是一个简单的函数调用还是一点语法

这让我们来解释你在发帖中观察到的错误。求值器或编译器saw循环。。。,其中的第一项是循环。。。。这让评估者感到困惑。它希望看到一个符号。当然,错误信息是完全不透明的,但那是因为事情比我想象的要微妙一些。对于初学者来说,这并不重要

形式条件。。。这不是一个简单的函数调用,而是更像语法。当它扫视为第一个元素时,即cond,它知道期望cond。。。等在哪里???这些表格将用于决定是否运行该分支机构的


您的代码还有许多其他问题。我建议您使用lisp REPL,并用更小的片段进行实验。线圈断了。或。。。同样的问题是第一种形式不是符号。似乎您的调用字符串包含单个字符而不是字符串,这很俗气,但可以容忍。

Jerraquia caracter,而不是Jerraquiacracter。。。函数的参数没有额外的括号。你是对的,谢谢,但仍然得到了相同的错误:/Why the double paren before LOOP?我编写double paren是因为我希望push-caracter-pilatemp位于第二个条件的内部,而不是在循环内部。我不知道这是否正确:/problem duplicate of Note,该duplicate是Google上搜索的第一个结果应该是lambda expression site:stackoverflow.com。我写了双参数,因为我希望push caracter pilatemp位于第二个条件的内部,而不是循环的内部。如果我只写一个paren也没关系,就像我说的,foo,foo和foo是完全不同的东西。请删除多余的参数。请使用emacs正确格式化代码。这将为您精确定位错误,而无需在中进行评估Lisp@user3654129CommonLisp要求正确使用括号。这与您可能使用的其他语言不同。括号可以更改程序的含义。您不能添加或删除它们,因为您喜欢它。它们从来都不是可选的或无意义的。如果你想在一个cond中有多个动作,你可以将它们包装在一个PROGN…,但碰巧cond有一个隐式PROGN,所以在这个特定的例子中,额外包装PROGN不会有任何作用。非常感谢,现在我对Lisp有了更多的了解,并且我重新构造了我的程序: