在 Lisp 中打印 defstruct

2023-12-13

我在 Lisp 中定义了一个非常简单的数据结构:

;;Data structure for a person

(defstruct person
  (name nil)
  (age 0)
  (siblings nil :type list))   ;; Siblings is a list of person objects

然后我继续实例化一些人员对象:

(setf person-a (make-person :name 'Tim :age 23))
(setf person-b (make-person :name 'Sally :age 21))
(setf person-c (make-person :name 'Louis :age 24))

然后我将兄弟姐妹联系起来(假设他们都是彼此的兄弟姐妹):

(setf (person-siblings person-a) (list person-b person-c))
(setf (person-siblings person-b) (list person-a person-c))
(setf (person-siblings person-c) (list person-b person-a))

然后我如何打印有关我已实例化和修改的对象的信息?我已经研究了关于打印对象和打印函数的 defstruct 选项,但我不知道如何正确打印我的对象。使用类似的东西:

(print person-a)

让我的 ACL 解释器陷入无限循环。


Common Lisp 有一个变量可以控制递归结构的打印:*print-circle*。在你的 Lisp 中它可能是 false (nil)默认情况下(就像在 SBCL 和 clisp 中一样 - 我不熟悉 ACL),这可能会导致无限循环。如果您将其设置为t,你的结构应该打印:

(setf *print-circle* t)

我用以下文件对此进行了测试:

(defstruct person
  (name nil)
  (age 0)
  (siblings nil :type list))

(setf person-a (make-person :name 'Tim :age 23))
(setf person-b (make-person :name 'Sally :age 21))
(setf person-c (make-person :name 'Louis :age 24))

(setf (person-siblings person-a) (list person-b person-c))
(setf (person-siblings person-b) (list person-a person-c))
(setf (person-siblings person-c) (list person-a person-b))

(setf *print-circle* t)
(format t "~a~&" person-a)
(format t "~a~&" person-b)
(format t "~a~&" person-c)

(print person-a)
(print person-b)
(print person-c)

这是运行该代码的记录:

> sbcl
This is SBCL 1.0.55, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (load "defstruct.lisp")

#1=#S(PERSON
        :NAME TIM
        :AGE 23
        :SIBLINGS (#2=#S(PERSON
                         :NAME SALLY
                         :AGE 21
                         :SIBLINGS (#1#
                                    #3=#S(PERSON
                                          :NAME LOUIS
                                          :AGE 24
                                          :SIBLINGS (#1# #2#))))
                   #3#))
#1=#S(PERSON
      :NAME SALLY
      :AGE 21
      :SIBLINGS (#2=#S(PERSON
                       :NAME TIM
                       :AGE 23
                       :SIBLINGS (#1#
                                  #3=#S(PERSON
                                        :NAME LOUIS
                                        :AGE 24
                                        :SIBLINGS (#2# #1#))))
                 #3#))
#1=#S(PERSON
      :NAME LOUIS
      :AGE 24
      :SIBLINGS (#2=#S(PERSON
                       :NAME TIM
                       :AGE 23
                       :SIBLINGS (#3=#S(PERSON
                                        :NAME SALLY
                                        :AGE 21
                                        :SIBLINGS (#2# #1#))
                                  #1#))
                 #3#))

#1=#S(PERSON
      :NAME TIM
      :AGE 23
      :SIBLINGS (#2=#S(PERSON
                       :NAME SALLY
                       :AGE 21
                       :SIBLINGS (#1#
                                  #3=#S(PERSON
                                        :NAME LOUIS
                                        :AGE 24
                                        :SIBLINGS (#1# #2#))))
                 #3#)) 
#1=#S(PERSON
      :NAME SALLY
      :AGE 21
      :SIBLINGS (#2=#S(PERSON
                       :NAME TIM
                       :AGE 23
                       :SIBLINGS (#1#
                                  #3=#S(PERSON
                                        :NAME LOUIS
                                        :AGE 24
                                        :SIBLINGS (#2# #1#))))
                 #3#)) 
#1=#S(PERSON
      :NAME LOUIS
      :AGE 24
      :SIBLINGS (#2=#S(PERSON
                       :NAME TIM
                       :AGE 23
                       :SIBLINGS (#3=#S(PERSON
                                        :NAME SALLY
                                        :AGE 21
                                        :SIBLINGS (#2# #1#))
                                  #1#))
                 #3#)) 
T
* (sb-ext:quit)

如果我离开*print-circle* nil,然后我收到堆栈溢出错误(SB-KERNEL::CONTROL-STACK-EXHAUSTED在 sbcl 中)。

HTH,

Kyle

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

在 Lisp 中打印 defstruct 的相关文章

  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 为什么在基于 Lisp 的语言中习惯上将许多右括号放在一行上?

    通常代码如下所示 one thing another thing arg1 f arg5 r another thing arg1 f arg5 r 为什么不喜欢这样 one thing another thing arg1 f arg5
  • 人们可以放心地忽略宏和内置宏之间的区别吗?

    我从 Clojure 开始 这也是我的第一个 lisp 显然有很多东西需要吸收 为了减轻认知负担 我尝试找到我可以安全地忽略的部分 目前 人们能否安全地以相同的方式处理带有宏的表单和带有内置函数的表单 或者是否会出现以后出现的陷阱 换句话说
  • 用通用函数替换普通函数

    我想将 elt nth 和 mapcar 等名称与我正在原型设计的新数据结构一起使用 但这些名称指定普通函数 因此我认为需要将其重新定义为通用函数 重新定义这些名称可能是一种不好的形式 有没有办法告诉 defgeneric 不要生成程序错误
  • 为什么 LISP 中符号名称中的连字符是约定俗成的?

    这个推荐的理由是什么 为什么不与使用下划线的其他编程语言保持一致 我认为 LISP 使用连字符有两个原因 历史 和 因为你可以 History LISP 是一种古老的语言 在早期输入下划线可能会很困难 例如 我用于 LISP 的第一个终端是
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 学习 LISP 的最佳方法是什么? [关闭]

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

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • SLIME 和 SWANK 入门:Lisp 连接意外关闭:连接被远程对等点断开

    我试图使用 slime connect 函数通过 sbcl 访问远程服务器 我遵循了 slime mov 电影中的所有步骤马可 巴林格 http www guba com watch 30000548671但在为 slime 创建 ssh
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • 我为什么要学习 Lisp? [关闭]

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

    为什么我们必须使用funcall在 Common Lisp 中调用高阶函数 例如 为什么我们必须使用 defun foo test func args funcall test func args 而不是更简单的 defun bar tes
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 更改 Common Lisp REPL 中文本的颜色

    我想控制 Common Lisp 中显示的文本的颜色 像这样的伪代码 print color red hello blue world 有什么办法可以做到这一点吗 我使用 SBCL 我的 repl 位于 emacs 内 谢谢 您可以使用AN
  • 关于onlisp中的广义变量

    我不确定这里发生了什么 文中的宏观示例 基本上不知道如何使用get setf 方法 一个内置宏 也许是函数 具体来说 如果某些返回值是这样的情况呢 get setf 方法为零 例如 get setf 方法 x NIL NIL NEW 306
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • defvar、defparameter、setf 和 setq 之间有什么区别

    我找到了一个类似问题 https stackoverflow com questions 3855862 setq and defvar in lisp 但我不太明白这个解释 所以我尝试使用以下示例运行 clisp 1 gt defvar
  • Common Lisp:循环列表中连续对的最佳方法是什么?

    有时我需要循环遍历列表中的连续对 我现在的做法是 loop for x on lst while not null cdr x do something on car x and cadr x 我想知道是否有更好的 内置的方法来做到这一点
  • LISP 非常简单的列表问题

    我正在学习 lisp 而且我对此还很陌生 所以我想知道 如果我这样做 defparameter list 1 list 1 2 defparameter list 2 list 2 3 defparameter list 3 append

随机推荐

  • 按具有相同索引的另一个键数组对 [key => value] 数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个索引数组 我想对其他数组进行排序 order 7 2 1 4 array 1 gt O 2 gt T 4 gt F 7 gt S 我怎样才能订购 array基于 order数组 因此输出是 array 7
  • 如何在 Python 中将数据框作为参数传递给 SQL 查询?

    我有一个由一列值组成的数据框 我想将其作为参数传递以执行以下 sql 查询 query SELECT ValueDate Value FROM Table WHERE ID in 所以我尝试了 以及其他许多事情 以下内容 df pd rea
  • 如何将 jQuery 安装到 Nuxt.js 中?

    我试图在我的项目中添加 jQuery 尽管我收到一个错误 指出它未定义 plugins src plugins js svgSprite js mode client src plugins vendor jquery jquery min
  • 仅在提交或用户输入时验证表单字段

    我有使用验证的表单字段required 问题是 呈现表单时会立即显示错误 我希望它仅在用户实际在文本字段中输入或提交后显示 我怎样才能实现这个 Use dirty仅在用户与输入交互后才显示错误的标志 div div
  • string.search() 忽略重音字符?

    我需要将重音字符视为与非重音字符相同 这是我的代码 var re new RegExp string i if target search re 0 它目前忽略字符的大小写 我如何也忽略字符是否重音 我认为你必须先删除重音符号 然后再进行正
  • 如何从排除另一个元素的元素中获取 html() ?

    抱歉问了一个真正愚蠢的问题 但无论哪种方式都不起作用 div class content BEFORE div class dontgrab div div
  • 如何从json字符串中提取值?

    我有一个文件 其中有一堆列和一个名为jsonstring是字符串类型 其中包含 json 字符串 假设格式如下 key1 value1 key2 level2key1 level2value1 level2key2 level2value2
  • Java 大文件上传抛出 java.io.IOException: Map failed

    我正在使用 Spring 和 Hibernate 并尝试上传大文件 但是当我尝试上传时 超过 150 Mb 那么它会生成错误 例如 Caused by java lang OutOfMemoryError Map failed at sun
  • 在准备好的语句中重用匿名参数

    我正在自定义 hibernate 生成的插入 SQL 但遇到了问题 当 Hibernate 自己生成查询时 它会将数据插入表的前两列 但这会导致数据库错误 因为表的所有四列都是不可为空的 为了正确执行插入 必须将相同的数据插入到新记录的两列
  • 在 opencart 中添加“加”“减”代替“添加到购物车”

    我想用 OpenCart 2 0 1 1 中的 2 个加号和减号按钮替换添加到购物车 现在我无法正确编码减号按钮 我在中添加了加号和减号按钮catalog view theme template module featured tpl并拨打
  • C++ 图像处理库

    我需要一个可以检测图像中的对象的库 使用边缘检测 这与验证码无关 我正在开发一个使用 OCR 且可以在任何屏幕分辨率下工作的 MTGO 机器人 为了使其能够移植到任何屏幕分辨率 我的想法是扫描结果页面上的狭窄范围 玩家拥有的卡牌可以在文本行
  • 转换二维数组

    What is selectMany ToArray 方法 它是一个内置方法吗C 我需要将二维数组转换为一维数组 如果你的意思是jagged array T SelectMany是你的朋友 但是 如果您的意思是矩形的 array T 那么你
  • Android 浏览器上未引发 JavaScript 按键事件

    我创建了一个简单的代码来处理keypress event var counter 0 input on keypress function div text key pressed counter JSFiddle 但移动浏览器 Andro
  • 如何将 html 链接添加到图像标题

    我实际上需要在 longdesc 属性中包含 html 链接 我已经将 Prettyphoto 更改为使用 longdesc 而不是图像标题 但我需要在这些描述中包含 html 链接 我知道字符代码是可能的 我只是不记得那些是什么 Than
  • 如何使用 CMake 生成 Windows DLL 版本信息?

    这非常类似于 如何使用 CMake 生成 Windows DLL 版本控制信息 但我想我可能会再问一次 因为从那以后事情可能发生了变化 使用以下 CMakeLists txt 文件 https github com malaterre GD
  • AsyncTask 取消不起作用

    我正在学习如何取消 asyncTask 因此下面的代码没有用处 我尝试调用 asyncTask 并执行它 然后取消它并执行它 MyAsyncTask asyncTask new MyAsyncTask Log i cancel cancel
  • 使用 python 查找 HTML 代码中的特定注释

    我在 python 中找不到具体的注释 例如 我的主要原因是找到 2 个特定评论中的所有链接 像解析器之类的东西 我尝试过这个Beautifulsoup import urllib over urlopen www gamespot com
  • Java中如何比较int数组? [复制]

    这个问题在这里已经有答案了 当我尝试比较两个 int 数组时 即使它们完全相同 里面的代码if one two 仍然没有被执行 为什么是这样 Object one 1 2 3 4 5 6 7 8 9 Object two 1 2 3 4 5
  • 循环遍历集合中的 jQuery 对象,而不为每次迭代初始化新的 jQuery 对象

    我发现自己一直在这样做 myElements each function index currentHtmltmlElement var currentJqueryElement currentHtmltmlElement Working
  • 在 Lisp 中打印 defstruct

    我在 Lisp 中定义了一个非常简单的数据结构 Data structure for a person defstruct person name nil age 0 siblings nil type list Siblings is a