【发布时间】:2019-05-26 22:53:39
【问题描述】:
我是 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”? 最后一个问题,我如何在一条指令中返回整个新状态并添加? 非常感谢! (抱歉英语不好,我是意大利人:))
【问题讨论】:
-
我建议阅读Practical Common Lisp 的5. Functions 章节,了解定义函数参数的正确语法。
SETF形式之前还有一些额外的括号(位置和值似乎也颠倒了),并且在COND测试中混合了一些中缀语法。
标签: lisp common-lisp