clisp:变量x没有值

clisp:变量x没有值,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我收到的错误是:在我的公共Lisp代码中,变量MAP没有值(我在Ubuntu终端中使用clisp shell)。我的代码如下所示(*map*只是一个关联列表,您可以跳过它): (setf*地图*)(海岸(星星在涟漪起伏的海面上投射倒影。 它让你充满了强烈但难以察觉的情感。) (东森林) (森林)树梢的屋顶遮住了太阳,有东西沙沙作响 在你身后。) (西海岸) (北悬崖) (你差点跌进一个又长又致命的深渊 大海在你下方很远的地方。你会感到一种奇怪的冲动,想扔东西 把你自己从壁架上弄下来。也许最明智的

我收到的错误是:在我的公共Lisp代码中,
变量MAP没有值(我在Ubuntu终端中使用clisp shell)。我的代码如下所示(
*map*
只是一个关联列表,您可以跳过它):

(setf*地图*)(海岸(星星在涟漪起伏的海面上投射倒影。
它让你充满了强烈但难以察觉的情感。)
(东森林)
(森林)树梢的屋顶遮住了太阳,有东西沙沙作响
在你身后。)
(西海岸)
(北悬崖)
(你差点跌进一个又长又致命的深渊
大海在你下方很远的地方。你会感到一种奇怪的冲动,想扔东西
把你自己从壁架上弄下来。也许最明智的做法是
离开这里。)
(南方森林)
(德芬步行方向(房间方向图)
(第二个(助理指挥部(cddr)(助理室地图‘‘‘)’))
(defmacro defspel(&rest rest)`(defmacro,@rest))
(拆卸步行至(方向房间地图)
`(步行方向、方向、房间地图)
(步行至东岸*地图*)
(对于那些对我可能犯下的任何怪事感到疑惑的人,我正在学习liserpati教程)

如果换成步行

(解缆步行至(方向室)
`(步行方向、方向、房间*地图*)

然后一切都很顺利。然而,这打破了我希望尽可能完整地保留的函数式编程的美丽惯例——更不用说我仍然不知道为什么我的代码不能工作。

步行到的定义在
映射之前缺少一个逗号。请看一下以下内容的输出:

(macroexpand-1 '(walk-to east shore *map*))
让我们来看看:

(defspel walk-to (direction room map)
  `(walk-direction ',direction ',room map))
在这里,符号映射位于后引号内,并且它不是无引号的。这意味着它只是一个文字数据。它与
walk to
拼写的
map
参数没有连接

生成的
walk direction
代码在
map
参数不再可见的环境中计算;它被视为一个自由变量引用,期望存在一个全局变量

当您将
map
更改为
*map*
时,您修复了部分问题;然后,生成的代码引用全局环境中的动态变量
*map*

但这仍然是错误的,因为
walk to
应该生成使用传入的
map
的代码,这不一定是全局映射(或者为什么要有参数)

你可能想要这个:

(defspel walk-to (direction room map)
  `(walk-direction ',direction ',room ,map))

例如,调用
(步行到北岸*地图*)
将生成代码
(步行方向“北”岸*地图*)
walk to
宏为您引用方向和房间符号,但不应引用
*map*
,因为这是Lisp变量,我们需要对它所表示的地图对象求值,而不是像
north
这样的游戏符号。我想他只是不确定如何格式化它。Max,不要使用
标记等。只需粘贴普通代码,突出显示它,然后按
{}
工具栏按钮,它将把它标记为一个代码块。