为什么此映射会导致我的 REPL 冻结?

2023-12-06

In 这个非常有用的答案,建议我可以替换这段代码:

(defun describe-paths (location edges)
  (apply (function append) (mapcar #'describe-path
               (cdr (assoc location edges)))))

有了这个:

(defun describe-paths-mapcan (location edges)
  (mapcan #'describe-path
               (cdr (assoc location edges))))

我当然从概念上理解为什么这应该有效,但事实并非如此;第二种变体冻结了我的 REPL,并且 CL 提示永远不会返回。我必须重新启动 SLIME。所以我查了一下,我想知道 mapcan 是否不使用list, 反而nconc,是原因吗?因此,这些实际上不是功能相同的代码块?

为了好奇,我传递这个:

(describe-paths-mapcan 'living-room *edges*)

Where *edges* is:

(defparameter *edges* '((living-room (garden west door)
             (attic upstairs ladder))
            (garden (living-room east door))
            (attic (living-room downstairs ladder))))

And:

(defun describe-path (edge)
  `(there is a ,(caddr edge) going ,(cadr edge) from here.))

我认为这与describe-edges。它定义为:

(defun describe-path (edge)
  `(there is a ,(caddr edge) going ,(cadr edge) from here.))

那里的准引用我们可以macroexpand..你得到:

(macroexpand '`(there is a ,(caddr edge) going ,(cadr edge) from here.)) ; ==>
(CONS 'THERE
 (CONS 'IS
  (CONS 'A
   (CONS (CADDR EDGE) (CONS 'GOING (CONS (CADR EDGE) '(FROM HERE.)))))))

根据Mapcan 的文档连接是破坏性的。查看返回的最后一个元素describe-path将与其返回的下一个元素共享结构,因此nconc将会无限循环。

如果你要改变describe-edges以下它将起作用:

(defun describe-path (edge)
  (list 'there 'is 'a (caddr edge) 'going (cadr edge) 'from 'here.))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么此映射会导致我的 REPL 冻结? 的相关文章

  • 如何克服 emacs lisp 闭包缺少局部变量的问题

    我现在正在学习 Emacs Lisp参考手册 http www gnu org software emacs manual elisp html和 Common Lisp 来自LISP https rads stackoverflow co
  • Common Lisp 类型声明未按预期工作

    当我在 Common Lisp 中定义一个函数时 如下所示 defun foo n declare type fixnum n n 42 我期待一个像这样的电话 foo a 立即失败 但在调用时失败 是个declareform 不保证静态类
  • Common Lisp 中重置状态

    新手 Common Lisp 问题在这里 有没有办法重置环境状态 我的意思是 是否有一些命令可以使 REPL 恢复到启动后的相同状态 即取消所有变量 函数等 或者如果这不在 Common Lisp 标准中 是否有一些扩展在 SBCL 我使用
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • 展开方案中的函数

    Goal 实施unfold仅使用两个参数的函数 论据 第一个参数是 f 它接受某种类型 I 的初始值并返回 nil 或两个元素的 cons 对 这两个元素中的第一个是某种类型 A 的列表中的下一个元素 下一个初始值又是某些类型 I 第二个参
  • 任意类型说明符上的 Defmethod?

    我想做的是 defgeneric fn x defmethod fn x integer 1 Positive integer defmethod fn x integer 1 Negative integer 我想要一个可以与任意类型说明
  • 为什么在基于 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 不要生成程序错误
  • 在 Java Runtime.getRuntime().exec(...) 中使用引号和双引号

    我正在尝试在 Mac OSX 中从 Java 启动 Lisp 映像 使用控制台中的图像 我输入以下内容 lisp image eval package method some argument 一切都运行良好 在Java中 我在使用传递引号
  • Lisp / Clojure:编写函数生成宏是个好主意吗?

    这个问题 https stackoverflow com q 7852351 346587要求创建一个 Clojure 宏来生成多个函数 我们找到了一种方法来做到这一点 但仍被 这是一个好主意吗 的问题所困扰 我的第一反应是并不真地 有两个
  • Lisp 中的 (定义 (平均 ....))

    我只是在玩scheme lisp 并正在考虑如何纠正我自己的定义average 我不确定如何做一些我认为需要的事情 定义一个接受任意数量参数的过程 计算这些参数 将参数列表传递给 以将它们加在一起 有人有定义的例子吗average 我似乎对
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 使用局部特殊变量

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • 为什么我们在 Lisp 中需要 funcall?

    为什么我们必须使用funcall在 Common Lisp 中调用高阶函数 例如 为什么我们必须使用 defun foo test func args funcall test func args 而不是更简单的 defun bar tes
  • Common Lisp 相当于 format 函数中的 \r 吗?

    基本上 我想只使用 Common Lisp 而不是 Python 来执行以下操作 print Hello world r n 我可以做到这一点 但它只输出 newline字符和跳过 return format t Hello world 我
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat

随机推荐

  • TCP服务器IP地址

    当启动H2 tcp服务器并且主机有多个IP地址时 我如何定义服务器将绑定以侦听连接的IP 我们可以定义 tcp 端口 但似乎没有办法定义 ip 地址 谢谢你 奥斯卡 http www h2database com html advanced
  • QueryOver:从子查询中选择列

    如何从不同表的子查询中选择 投影值到我的主查询中 我有一个像这样的 NH 模型 Serializable public class MyModel public virtual int Id get set more mapped valu
  • 在 sed 中查找并替换文本文件中的多个字符串[重复]

    这个问题在这里已经有答案了 下面是一个玩具文本文件 其中包含样本和特征信息以及测量值 Sample3 trait1 8 5 Sample6 trait2 2 2 Sample7 trait1 9 2 Sample3 trait2 1 3 S
  • 向空手道框架添加自定义步骤定义

    我需要提取从 复杂 响应标头解析的字段 并在稍后的测试中使用该值 看来空手道中的 header 关键字是为了设置请求头而设置的 而不是解析响应头 有没有办法添加自定义步骤定义来维护对场景变量存储的访问 看来变量存储在StepDefs类 并且
  • 从小写转换为大写

    我正在尝试从小写转换为大写 我知道这很容易做到 SUB AL 20H 但我得到了另一种解决方案 AND AL 0DFH 请帮助我理解这一点 谢谢 查看位模式 答 0x41 0100 0001 一个 0x61 0110 0001 中号 0x4
  • 如何在 Three.js 中获取蒙皮网格顶点的全局位置?

    在 Three js 中 我们现在能够获取 a 顶点的全局位置不带皮的网格感谢这个问题 但是我怎样才能获得 a 顶点的全局位置skinned与骨骼和变形目标进行网格划分 例如 如何打印 2 5 1 5 0 5 在以下情况下 mesh geo
  • 注意:如果您发送了值,则被调用的函数应该是付费的,并且您发送的值应该小于您当前的余额

    我正在尝试使用 openzeppelin 的 ERC20 实现 但出现错误 tokenAddress 是现有 ERC20 代币的地址 例如 USDC 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 im
  • 在 PIL 中使用 TIFF G4 图像

    我编写了一个纯 python TIFF G4 解压缩以供使用tifffile py 我知道有一些方法可以添加libtiff自定义 PIL 但我永远无法让它在混合 virtualenv 中很好地工作 我想在PIL中操作图像 我正在寻找将我的减
  • 没有端口的 HTTP X 转发主机行为

    我发现X Forwarded Host对于端口而言 HTTP 标头没有很好地定义 也许这就是为什么不同的实现在涉及这个标头时表现不同的原因 通常 此标头可以包含端口 例如b com 123这很简单 但如果真的发生了怎么办NOT包含端口并且服
  • Swift:IOS7 设备上的核心数据 -> 第二个实体上的entityForName 为零

    我已经使用 Xcode 6 beta 2 在一个小型 iPhone 项目上测试了 swift 该项目使用核心数据来访问数据模型中的 2 个实体 用户 合同 在 IOS 模拟器中一切正常 问题 当我为 IOS7 构建应用程序并在 iPhone
  • 请参阅场景大纲示例中定义的变量[重复]

    这个问题在这里已经有答案了 Feature Test Type Background url host def name test name def label name Scenario Outline Test 2 Given url
  • 判断两个矩形是否重叠?

    我正在尝试编写一个 C 程序 它接受用户的以下输入来构造矩形 2 到 5 之间 高度 宽度 x 位置 y 位置 所有这些矩形都将平行于 x 和 y 轴存在 即它们的所有边都将具有 0 或无穷大的斜率 我试图实现中提到的内容this问题 但我
  • 是否可以声明一个同时适用于数字和 bigint 的打字稿函数?

    在普通的无类型 JavaScript 中 编写一个可以对数字或 bigint 进行操作的函数并不难 具体取决于传入的参数 const sumOfSquares a b gt a a b b sumOfSquares 3 4 returns
  • DynamoDB 突发容量和自适应扩展

    我正在浏览 AWSblog从那里开始AWS re Invent 视频了解 DynamoDB 的自适应扩展和突发概念 我理解WCU和RCU的概念 以及突发桶堆积长达300秒的想法 并且分区的峰值WCU RCU是1000 3000 视频开始时间
  • c# DataSet.Fill Firebird 2.5 可怕的性能问题

    REMARK我完全重写了这个问题 因为在探索选项和获得见解时 我意识到问题的根源根本不是我想象的那样 我使用 Firebird 作为数据库引擎和标准 Net 提供程序 v 5 11 0 来使用以下代码获取数据 myBlob1 is BLOB
  • PHP计算两个日期之间的天数

    我正在开发一个围绕日期的网络应用程序 例如 我需要根据经过的天数计算数字 伪代码 count only array monday wednesday friday count only these days start date 12985
  • 如何确定 TensorFlow 中的占位符依赖性

    给定一些要获取的符号变量 我需要知道哪些占位符是依赖项 在 Theano 中 我们有 import theano as th import theano tensor as T x y z T scalars xyz u v x y y z
  • Java 中的布尔函数

    String s1 hi String s2 hi boolean b1 true boolean b2 false 1 System out println s1 s2 true 2 System out println s1 s2 s1
  • Webstorm:ColdFusion 语法

    有没有办法在 Web Storm 8 中获得 ColdFusion 语法高亮显示 有人在这方面取得过成功吗 如果不是 从哪里开始 或者可以采取什么措施来获得此选项 我目前使用 Web Storm 处理所有事情 它是一个很棒的编辑器 但目前我
  • 为什么此映射会导致我的 REPL 冻结?

    In 这个非常有用的答案 建议我可以替换这段代码 defun describe paths location edges apply function append mapcar describe path cdr assoc locati