的语法 DEFUN 期待一个 普通的lambda-list ,这是最基本的形式 未评估 变量名称列表。您的代码如下所示:
DEFUN
(defun one-instruction '(state:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag) ...)
您有两个主要错误:
试图绑定非符号,(状态:ACC acc:PC pc:MEM mem:IN in:OUT out:FLAG flag)
这个错误有点奇怪,但请记住 '(a b c) 代表 (quote (a b c)) ,在一个的背景下 defun lambda-list被解析为一个两元素列表, quote 和 (a b c) 名单。第二个列表不是符号,这是在您的情况下检测到格式错误的lambda列表的方式。
'(a b c)
(quote (a b c))
defun
quote
(a b c)
该 :pc pc 语法用于传递关键字参数,而不是在函数中绑定它们。如果要正确定义函数,使用一个强制状态变量和关键字参数,则应编写:
:pc pc
(defun one-instruction (state &key acc pc mem in out flag) ...)
你可以这样称呼它:
(one-instruction my-state :acc 0 :pc 0 :mem big-table ...)
另外,你有:
((setf (nth pc mem) istruzione) ...)
这不是一个有效的表达式,表达式看起来像 (x ...) ,与 x 是的 setf 表达;但 (x ...) 在正常的评估环境中意味着 功能调用 ,和 (setf ...) 没有功能。
(x ...)
x
setf
(setf ...)
在:(setf(第n个pc内存)值)我想绑定(第n个pc内存)的结果,我是正确的它应该给我在“mem”列表中的值“pc” “,变量”值“
你没有引入变量 setf ,它只修改现有的绑定(更常见的是地方)。相反,你必须使用 LET :
LET
(let ((instruction (nth n mem))) ...)
内 ... , instruction 与通过评估获得的价值相关联 (nth n mem) 。
...
instruction
(nth n mem)
另请注意您的测试表达式 cond 表达式也是畸形的:
cond
(0 < istruzione < 99)
以上内容如下: 使用参数&lt;,istruzione,&lt;调用函数0和99 ;没有命名的功能 0 ,和 < 作为变量未绑定。你想要的是:
0
<
(< 0 istruzione 99)
以上就是一个电话 < 具有多个参数,当根据所有值进行排序时,这是正确的 < 。
另请注意,在下一个测试中,您有 100 < istruzione ,这意味着99和100都是你的cond没有处理的角落情况(除非是故意的,在这种情况下它是罚款)。
100 < istruzione