Common Lisp 案例和引用元素

2024-03-10

我正在用 CL 编写一个地下城爬行游戏,但在处理案例表单时遇到了问题。

两件事情:

  • Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement
  • (make-instance 'cl-rogue:tile tile-type 'wall)应打印为“#”,但无论我使用哪种图块类型,该对象都会打印为“”。

代码:

(in-package :cl-user)

(defpackage :cl-rogue
  (:use :common-lisp)
  (:export
    :*rows*
    :*cols*
    :*levels*
    :tile
    :tile-type
    :tile-contents
    :tile-hidden
    :tile-locked
    :tile-closed
    :main))

(in-package :cl-rogue)

(defparameter *cols* 80)
(defparameter *rows* 24)
(defparameter *levels* 26)

班上:

(defclass tile ()
  ((tile-type
    :initarg :tile-type
    :accessor tile-type
    :initform 'floor
    :documentation "Type of tile")
    (tile-contents
      :initarg :tile-contents
      :accessor tile-contents
      :initform '()
      :documentation "Any items the tile holds")
    (tile-hidden
      :initarg :tile-hidden
      :accessor tile-hidden
      :initform nil
      :documentation "Whether the tile is hidden or shown")
    (tile-locked
      :initarg :tile-locked
      :accessor tile-locked
      :initform nil
      :documentation "Whether the tile is locked")
    (tile-closed
      :initarg :tile-closed
      :accessor tile-closed
      :initform nil
      :documentation "Whether the tile is open or closed")))

打印方法:

(defmethod print-object ((object tile) stream)
  (with-slots (tile-type tile-contents tile-hidden tile-locked tile-closed) object
    (if tile-hidden
      (format stream " ")
      (let ((an-item (car tile-contents)))
        (if an-item
          (format stream "~a" an-item)
          (format stream (case tile-type
            ('wall "#")
            ('upstair "<")
            ('downstair ">")
            ('door (if tile-closed "+" "\\"))
            (otherwise " "))))))))

您不需要引用中的符号CASE.

实际上你不应该在中引用符号CASE条款。

See:

CL-USER 31 > (case 'quote
               ('not-quote 'oops-really-quote)
               ('quote 'it-is-a-quote))
OOPS-REALLY-QUOTE

以上是使用的意外后果'not-quote而不是正确的未引用的not-quote.

下列说法正确的是:

CL-USER 32 > (case 'quote
               (not-quote 'oops-really-quote)
               (quote 'it-is-a-quote))
IT-IS-A-QUOTE

Common Lisp 中 CASE 的语法

case keyform
  {normal-clause}*
  [otherwise-clause]

=> result*

normal-clause::= (keys form*) 
otherwise-clause::= ({otherwise | t} form*) 
clause::= normal-clause | otherwise-clause 
keys ::= object | (object*)

正如您所看到的,键要么是单个对象,要么是对象列表。不评估对象。

CASE 子句中的符号不​​被求值。

(case tile-type
  (wall ...)
  (door ...))

WALL and DOOR纯粹是符号,不作为变量进行计算。

Lisp 读者阅读'fooas (quote foo).

你写了:

(case tile-type
  ('wall ...)
  ('door ...))

这相当于:

(case tile-type
  ((quote wall) ...)
  ((quote door) ...))

但你不能引用一个符号CASE。您必须提供符号作为文字常量。

如果你写:

(let ((bar 'foo)
      (baz 'foo))
  (case bar
    (baz :we-have-a-foo-through-baz)
    (foo :we-really-have-a-foo)))

这返回:WE-REALLY-HAVE-A-FOO。因为CASE使用常量数据,而不是变量。

CASE接受项目列表。既然你有QUOTE作为 more than 子句中的符号,编译器显示警告。

正如我所说,不可能报价,因为这些物品没有经过评估。

As for CASE接受子句中的项目列表,如下所示:

(case tile-type
  ((door wall) ...)
  ((floor window painting) ...))

For the WALL符号,您需要在创建对象时确保它位于正确的包中。

最好使用关键字符号,例如:wall。这样您就不需要导出它,并且不会混淆该符号位于哪个包中。

关于代码的格式: 您有一个项目符号列表,紧随其后的是代码部分。这不会按照您的预期呈现。我在代码之前添加了文本“代码:”。然后渲染就按预期工作了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Common Lisp 案例和引用元素 的相关文章

  • SBCL:将 Hunchentoot 应用程序部署为可执行文件

    我开始使用 SBCL Common Lisp 并希望使用 Hunchentoot 开发一个小型 Web 应用程序 为了便于部署 我计划使用 sb ext save lisp and die 将所有内容保存在二进制文件中 因为我可以忍受大输出
  • 更改列表的第 n 个元素

    我想更改列表的第 n 个元素并返回一个新列表 我想到了三个相当不优雅的解决方案 defun set nth1 list n value let list2 copy seq list setf elt list2 n value list2
  • Common Lisp 中 do 循环中的多个值绑定

    如何在 do 循环内绑定从函数返回的多个值 下面的显然是非常错误的 但是这样的事情可能吗 do x y z 3 val fn 3 val fn equal y some val y values x y z 或者也许有一种方法可以使用多值绑
  • 通过 Django 管理站点添加数据时更改大小写(大写/小写)

    我正在配置我的新项目的管理站点 我有点怀疑我应该怎么做 通过管理站点添加数据时点击 保存 所有内容都转换为大写 编辑 好的 我知道 upper 属性 并且我做了一个视图 我知道该怎么做 但我想知道管理站点上是否有任何可用于字段配置的属性 P
  • 如何在 SLIME 的 REPL 中获得 Common Lisp 的语法高亮显示?

    我想学习 Common Lisp 并通过 emacs 包管理器安装了 emacs 24 3 和 slime 在 slime REPL 语法高亮中不起作用 另一方面 当我启动 Lisp Mode 在 slime REPL 中 时 表达式的值不
  • 在 OSX 上编译 clisp-2.49:未找到 LIBFFI

    TL DR Even if libffi似乎已安装 configure即使我给它添加 正确的 前缀 脚本也找不到它 这篇文章的最后一部分 是我陷入困境的地方 我仅提供其他信息来解释我如何到达那里 我对这篇长篇文章表示歉意 如果有些内容与您无
  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • 在 LISP 中使用“ash”执行二分查找?

    所以 我现在正在阅读 Land of Lisp 事实证明 Lisp 与我见过的其他编程语言有很大不同 无论如何 本书提供了一些我们要输入到 CLISP REPL 中的代码 defparameter small 1 defparameter
  • Lisp 内部引用工作

    口齿不清是如何做到的quote内部工作 例如 quote 1 1 2 似乎相当于 list 1 list 1 2 这意味着它是如何递归地象征 Head 值的 这个功能是内置的吗 Run equal quote 1 1 2 list 1 li
  • 如何在类Unix操作系统下方便的运行SBCL代码?

    David James 写了问题和答案 我将对其进行编辑以符合 Stackoverflow 标准 使用 SBCL 您可以将 Lisp 代码编译为机器代码 像 Java net C 甚至 C 一样 您将需要运行时 所以有两种方法来编译 Com
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • Common Lisp 中的(随机)不那么随机?

    好的 最后一个问题 我将用 Common Lisp 完成我的猜数游戏 D 每当游戏开始 或者在第一个游戏之后开始新游戏 时 都会调用以下函数 Play the game defun play If it s their first time
  • 如何定义和使用 Common Lisp 包(库)?

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • Coq案例分析和函数返回子集类型的重写

    我正在做一个关于使用子集类型编写经过认证的函数的简单练习 想法是先写一个前驱函数 pred forall n n nat n gt 0 m nat S m n 1 然后使用这个定义给定一个函数 pred2 forall n n nat n
  • 对于案例,这些表达案例的方法中哪种最好?

    这些都有效 defun testcaseexpr thecase case thecase foo format t matched foo bar format t matched bar funk format t matched fu
  • 使用包阴影符号

    例如 我有这个包定义 它遮蔽了 COMMON LISP LISTEN defpackage shadows use common lisp shadow listen export listen 然后我想使用另一个包中的这个包 比如说 de
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 评估 Common Lisp 宏的参数

    我想制作一个宏 其行为取决于它的参数之一 例如 defclass myvar l initarg l reader l defparameter mv1 make instance myvar l 10 defmacro mac1 v pr
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • gem 和/或 Ruby on Rails 突然崩溃了,有人知道发生了什么吗?

    我有一个 Ruby on Rails 应用程序 曾经可以工作 我已经有一个月左右没有使用它了 但今天尝试启动它rails s并收到以下错误 事实上 当我尝试时 我收到此错误rails h or rails v甚至gem h or sudo
  • java.lang.NoClassDefFoundError:以下 Lollipop 版本上的 com.parse.Parse$Configuration$Builder

    我在我的应用程序中使用 parse com sdk 它与 Lollipop 配合得非常好 但是当我在以下棒棒糖版本上运行该应用程序时 我收到此错误 java lang NoClassDefFoundError com parse Parse
  • EXE 或 DLL 映像基地址

    C Windows 中有没有办法获取 exe DLL 映像基地址 谢谢 如果您将二进制文件加载到您自己的进程中 您可以使用获取模块句柄 http msdn microsoft com en us library ms683199 VS 85
  • 如何在 Swift 中使用 CMAltitudeHandler?

    self altimeter startRelativeAltitudeUpdatesToQueue NSOperationQueue mainQueue withHandler CMAltitudeData altitudeData NS
  • 导入可出租运算符和可观察创建方法

    我正在升级到 Angular 5 和 RxJS 5 5 2 并尝试导入Observable of操作员 在可出租运营商之前 我们是这样做的 import rxjs add observable of Usage Observable of
  • 带表达式的 C++ 模板参数

    我在使用 C 时遇到了麻烦 我希望能够将表达式作为参数放入模板中 这是我的代码 include
  • 从 Java Web 应用程序控制 C 应用程序

    我有 C 应用程序将在不同站点的多台计算机上运行 现在我想控制和监视这些C应用程序 为此 我正在考虑使用 Servlet JSP 的 Java Web 应用程序 我认为 C 应用程序将通过 TCP 连接到 Java Web 应用程序 在我的
  • 如何使用 Wireshark 从 TCP 数据包中提取原始数据

    对 Wireshark 完全陌生 想知道如何从我在 Wireshark 上收到的 TCP 数据包中提取数据 我目前正在使用带有 Grove 传感器的树莓派并获取压力和温度值 我将这些值发送到云中的服务器并且它正在工作 我正在使用wiresh
  • 如何在javascript中打开没有任何栏(如地址栏、书签栏等)的浏览器窗口?

    我希望打开一个没有任何地址栏 书签栏的网址 html 文件 以便用户只看到应用程序窗口 有办法这样做吗 window open url window toolbar no menubar no resizable yes 您可以阅读这些以及
  • 顺序一致性和原子性有什么区别?

    我读到 java 易失性是顺序一致的 但不是原子的 对于原子性java提供了不同的库 有人可以用简单的英语解释两者之间的区别吗 我相信问题范围包括 C C 因此添加这些语言标签以获得更多受众 想象一下一个类中的这两个变量 int i 0 v
  • 为什么 GridView 内的 LinkBut​​ton 不会引发其 OnClick 事件?

    我在 GridView 中有一个 LinkBut ton 通过 TemplateField 无论我如何尝试 LinkBut ton 都不会调用其事件处理程序 我都尝试过 传统的事件处理程序 OnClick GridView 级别的 OnRo
  • 根据中心性对顶点着色

    我正在尝试更改 igraph 生成的图形中顶点的颜色 更具体地说 我有一个从邻接矩阵创建的 95 个节点图 我想根据它们的度数 介数 特征值中心性 接近度对它们进行着色 但我猜在我知道如何用它来做之后 我可以和其他人一起做 所以到目前为止我
  • ChartJS 不使用 Moment.js 显示时间数据

    我正在尝试按小时绘制给定日期的一系列数据点 并非每个小时都包含在数据集中 但我仍然想显示从 0 00 23 00 的时间并绘制可用的数据点 我的错误是 该方法未实现 要么找不到适配器 要么找不到适配器 提供了不完整的集成 然而 纵观文档 h
  • 在 Perl 中将 UTF8 字符串转换为 ASCII

    我已经尝试了 Google 和 StackOverflow 推荐的 我能找到的 所有内容 包括使用 Encode 我的代码可以工作 但它只使用 UTF8 并且我收到宽字符警告 我知道如何解决这些警告 但我没有将 UTF8 用于其他任何用途
  • 隐藏除前 4 个元素之外的所有元素

    有无穷无尽的元素 我想要做的是隐藏除前 4 个元素之外的所有元素 带有 not 选择器 我想让点击全部可见 这可以用CSS实现吗 ul li li li li li li li li li li must hide li li must h
  • 使用 Base64 图像的 HTML 到 PDF 会抛出 FileNotFoundException

    我正在使用 itextpdf 5 0 6 jar Java 8 当我尝试使用 base64 图像标签导出 html 代码时 出现文件未找到异常 如果我删除图像标签 一切都会很好 我发现了一些关于覆盖图像标签处理器的解决方案 但大多数都是旧的
  • 关闭 Selenium IDE 中新打开的选项卡或窗口

    在 Windows7 和 Firefox 中使用 Selenium IDE 自动单击链接可能会生成新选项卡或新窗口 close 关闭原始窗口或选项卡 而不是新窗口或选项卡 也许如果我有新创建的 ID 我可以选择它然后关闭它 但我不知道如何自
  • 对两个对象数组的数据求和

    我有两个对象数组 我想对具有相同键 在本例中为 id 的对象求和 如果没有匹配键 则只需创建一个新的 如果我是 我很抱歉没有解释清楚 我对 JavaScript Array Object 很陌生 var dataOne id 1 total
  • 将另一个声音添加到 .NET Speech 中

    如何将其他声音添加到 NET Speech 中 我想使用捷克语语音 我找到了一些 sis files Eliska22k sis但我不知道如何使用它 SpeechSynthesizer synth new SpeechSynthesizer
  • Common Lisp 案例和引用元素

    我正在用 CL 编写一个地下城爬行游戏 但在处理案例表单时遇到了问题 两件事情 Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement make instance cl rogue t