首页 > 解决方案 > 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”?最后一个问题,我如何在一条指令中返回整个新状态并添加?非常感谢!(对不起英语不好,我是意大利人:))

标签: lispcommon-lisp

解决方案


的语法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 ...)xsetf表达式;但(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 不处理的极端情况(除非是故意的,在这种情况下很好)。


推荐阅读