Lisp-“;试图绑定一个非符号“;错误

Lisp-“;试图绑定一个非符号“;错误,lisp,common-lisp,Lisp,Common Lisp,我是Lisp的新手,我正在为大学做一个项目。该项目是对LMC(小人计算机)的模拟。我有一个状态,它是一个列表(状态:ACC ACC:PC PC:MEM MEM:IN IN IN:OUT:FLAG FLAG),“ACC”“PC”和“FLAG”是值,“MEM”“IN”和“OUT”是列表 one指令将state作为参数,并应返回一个新状态,具有不同的值,因为根据(第n个pc mem)的结果,我必须执行某些操作。这里举个例子,如果(n个pc mem)的结果在100到199之间,我调用函数do add,它

我是Lisp的新手,我正在为大学做一个项目。该项目是对LMC(小人计算机)的模拟。我有一个状态,它是一个列表(状态:ACC ACC:PC PC:MEM MEM:IN IN IN:OUT:FLAG FLAG),“ACC”“PC”和“FLAG”是值,“MEM”“IN”和“OUT”是列表

one指令将state作为参数,并应返回一个新状态,具有不同的值,因为根据(第n个pc mem)的结果,我必须执行某些操作。这里举个例子,如果(n个pc mem)的结果在100到199之间,我调用函数do add,它应该为新状态的acc提供一个新值(有些控件尚未实现)

(定义一条指令)(状态:ACC ACC:PC PC:MEM MEM:IN IN:OUT:FLAG)
((setf(第N个pc成员)istruzione)
(条件((0
编译和加载时,会出现以下错误:

**++++一条指令中的错误

尝试绑定非符号(状态:ACC ACC:PC PC:MEM MEM:IN IN:OUT:FLAG FLAG),对“do add”也会发生同样的情况

所以我在两个函数中传递状态作为参数的方式是错误的?或者,如果没有getf,我就不能使用“pc”和“mem”? 最后一个问题,我如何在一条指令中返回整个新状态并进行添加? 谢谢!(很抱歉英语不好,我是意大利人:)

的语法需要一个普通的lambda列表,它的最基本形式是一个未赋值的变量名列表。您的代码如下所示开始:

(defun one-instruction '(state:ACC acc :PC pc  :MEM mem :IN in :OUT out :FLAG flag)
   ...)
(one-instruction my-state :acc 0 :pc 0 :mem big-table ...)
您有两个主要错误:

  • 你引用了名单
  • 你的lambda列表格式不正确
尝试绑定非符号,(状态:ACC ACC:PC PC:MEM MEM:IN IN:OUT:FLAG)

这个错误有点奇怪,但是请记住,
'(abc)
代表
(quote(abc))
,在
defun
lambda列表的上下文中,它被解析为两个元素的列表,
quote
(abc)
列表。第二个列表不是符号,这是在您的案例中检测到格式错误的lambda列表的方式

:pc
语法用于传递关键字参数,而不是在函数中绑定它们。如果您想使用一个强制状态变量和关键字参数正确定义函数,您应该编写:

(defun one-instruction (state &key acc pc mem in out flag)
  ...)
你可以这样称呼它:

(defun one-instruction '(state:ACC acc :PC pc  :MEM mem :IN in :OUT out :FLAG flag)
   ...)
(one-instruction my-state :acc 0 :pc 0 :mem big-table ...)
此外,你有:

((setf (nth pc mem) istruzione) ...)
这不是有效的表达式,该表达式类似于
(x…
,其中
x
setf
表达式;但是在正常的求值上下文中,
(x…
表示函数调用,
(setf…
不是函数


In:(setf(第n个pc mem)值)我想将(第n个pc mem)的结果绑定到变量“value”上,如果我是正确的,它应该给我列表“mem”中“pc”位置的值

您不使用
setf
引入变量,它只修改现有绑定(更一般地说,是位置)。相反,您必须使用:

内部,
指令
绑定到通过计算
(n个mem)
获得的值

还要注意,
cond
表达式中的测试表达式的格式也不正确:

(0 < istruzione < 99)

上面是一个使用多个参数的调用,当所有值都按照
进行排序时,这是正确的。我建议阅读的一章,了解定义函数参数的正确语法。在
SETF
表单之前还有一些额外的括号(位置和值似乎也颠倒了),在
COND
测试中混合了一些中缀语法。非常感谢,这真的很有帮助。因此,当我定义函数时,我只需编写(state&key x1 x2..),然后仅当我调用时,我必须使用(:acc 0 pc:0..)之类的关键字参数?对于setf问题,老师建议将nth和setf结合起来。In:(setf(nth pc mem)value)我想将(nth pc mem)的结果绑定到变量“value”上,如果我是正确的,它应该给我列表“mem”中位于“pc”位置的值。这样做是不可能的?再次感谢你@埃莉亚,谢谢。您必须使用LET,请参见编辑。非常感谢,现在一切都清楚了!今晚我将尝试用这些信息重写这个项目!所以老师的建议是使用setf和nth组合,这不适用于这种情况?或者,在我做了两个(let((value(nth…))和(let((addendo(nth…))之后,我必须使用“do add”中的setf来更改新状态的“acc”的值,比如(setf acc(+acc addendo))?
(< 0 istruzione 99)