lisp - Lisp - “尝试绑定非符号”错误
问题描述
我是 Lisp 的新手,我正在为大学做一个项目。该项目是 LMC(小人计算机)的模拟。我有一个状态是事物列表(状态:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG 标志),“acc”“pc”和“flag”是值,“mem”“in " 和 "out" 是列表。
单指令将状态作为参数并应返回具有不同值的新状态,因为根据 (nth pc mem) 的结果,我必须执行某些操作。例如,如果 (nth pc mem) 的结果在 100 和 199 之间,我调用函数 do-add 应该为新状态的 acc 提供一个新值(还有一些尚未实现的控件)。
(defun one-instruction '(state:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag)
((setf (nth pc mem) istruzione)
(cond ( (0 < istruzione < 99) (do-halt '(state :ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag))))
( (100 < istruzione < 199) (do-add '(state :ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag)))))))
...
(defun do-add '(state :ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag)))
((setf (nth pc mem) value)
((setf (nth (- value 100) mem) addendo)
(setf (+ acc addendo) newacc))))
当我编译并加载时出现以下错误:
**++++单指令错误
尝试绑定非符号(状态:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG 标志),“do-add”也是如此。
那么我在两个函数中将状态作为参数传递的方式是错误的吗?或者也许我不能在没有 getf 的情况下使用“pc”和“mem”?最后一个问题,我如何在一条指令中返回整个新状态并添加?非常感谢!(对不起英语不好,我是意大利人:))
解决方案
的语法DEFUN
需要一个普通的 lambda-list,它的最基本形式是一个未计算的变量名列表。您的代码开始如下:
(defun one-instruction '(state:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG flag)
...)
您有两个主要错误:
- 你引用了清单
- 您的 lambda 列表格式错误
尝试绑定非符号,(状态:ACC acc :PC pc :MEM mem :IN in :OUT out :FLAG 标志)
这个错误有点奇怪,但请记住,它'(a b c)
代表(quote (a b c))
,在 lambda 列表的上下文中,它defun
被解析为一个二元素列表,quote
而(a b c)
列表。第二个列表不是符号,这就是在您的情况下检测到格式错误的 lambda-list 的方式。
该: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 ...)
不是函数。
在:(setf(nth pc mem)值)我想绑定(nth pc mem)的结果,如果我是正确的,它应该在“pc”位置给我列表“mem”中的值", 到变量 "value"
您不使用 引入变量setf
,这只会修改现有绑定(更一般地说,位置)。相反,您必须使用LET
:
(let ((instruction (nth n mem)))
...)
在里面...
,instruction
绑定到通过评估获得的值(nth n mem)
。
另请注意,您在表达式中的测试表达式cond
也是格式错误的:
(0 < istruzione < 99)
上面的内容为:调用函数 0 并带有参数 <、istruzione、< 和 99;没有名为 的函数0
,并且<
未绑定为变量。你想要的是:
(< 0 istruzione 99)
上面是一个<
带有多个参数的调用,当所有值都根据 排序时,这是正确的<
。
另请注意,在下一个测试中,您有100 < istruzione
,这意味着 99 和 100 都是您的 cond 不处理的极端情况(除非是故意的,在这种情况下很好)。
推荐阅读
- algorithm - 我如何有效地找到这个约束系统中变量的最小值和最大值?
- python - _pickle.UnpicklingError: unpickling 堆栈下溢
- ios - JSON 访问数组内的多个实例
- amazon-web-services - 将 json 传递给 lambda 函数
- python - 如何将单词映射到数字以输入到 Tensorflow 神经网络
- php - 替换部分url htaccess后重定向所有url
- batch-file - 老派“Commodore 64”BASIC - Peek/Poke 命令;批处理形式是否有等价物?
- .net - 发布在不同的机器上部署依赖
- node.js - Express 应用程序的访问源问题
- node.js - 超级代理安全漏洞