Common Lisp 中的 comma-comma-at

2024-01-26

我对 comma-comma-at 的作用感到困惑。

使用 comma-comma-at 的示例如下定义 Lisp 宏时是否需要使用双引号(双逗号)? https://stackoverflow.com/questions/17938242/is-there-a-use-for-double-unquote-double-comma-when-defining-a-lisp-macro

在我看来,这

(let ((parms '(x y)))
  ``(beg ,,@parms end))

扩展到或等于

`(beg ,x ,y end)

它是如何扩展到这一点的?

我在想,如果我评估双反引号形式,它会导致第二个逗号完成其工作,结果是:

`(beg ,<splice stuff here> end)

看起来 Lisp 解释器应该抱怨并说“我不知道在逗号之前拼接东西意味着什么”,因为当 Lisp 遇到

`,@abc

它可能会说“我不知道在反引号之前拼接内容意味着什么。不要再这样做了。”

但不知何故,口译员并没有抱怨,只是选择这样做

`(beg <splice stuff here and write comma in front of each of them> end)

这符合规则吗CLHS 反引号 http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm?


对于读者而言,答案后面的评论引用了旧版本的答案,并导致答案的更新。新读者无需阅读评论。


另请参阅CHLS“最里面的反引号形式应该首先扩展”含义 https://stackoverflow.com/questions/18008099/chls-innermost-backquoted-form-should-be-expanded-first-meaning


CLHS http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm状态:“如果反引号语法是嵌套的,则最里面的应首先扩展反引号形式。这意味着如果连续出现多个逗号,则最左边的逗号属于最里面的反引号。”

因此,第一个逗号取消引用第二个反引号;这,@然后拼接内容parms,因为所有报价均已撤消。取消引用不会按照您所描述的步骤“替换”表单 - 在决定如何评估所包含的表单时,逗号只是备份在反引号表单的结构中。

(let ((parms '(x y)))
  `(list 'beg ,@parms 'end))

显然评估为(list 'beg x y 'end),这就是你在这里所追求的;生成一个表单,该表单创建所需的结构作为其输出。附加的外部反引号只是此语法的简写,其方式与'(foo bar)是(除了平等问题)的简写(list 'foo 'bar).

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

Common Lisp 中的 comma-comma-at 的相关文章

  • 格式 - 帮助打印表格

    这个问题可能会以捂脸结束 但我已经尝试了一段时间 尽管阅读了超规范 但仍然卡住了 基本上我想做的是 format t 5d 1 23 2 312 23 456 1 7890 但不应该对 5 进行硬编码 而是应该从列表中计算 任何嵌套列表中最
  • 在 LISP 中使用“ash”执行二分查找?

    所以 我现在正在阅读 Land of Lisp 事实证明 Lisp 与我见过的其他编程语言有很大不同 无论如何 本书提供了一些我们要输入到 CLISP REPL 中的代码 defparameter small 1 defparameter
  • Common Lisp 重新启动到条件绑定

    我在空闲时间学习 Common Lisp 并对条件系统有疑问 当我们在 common lisp 中处理错误时 我们在处理程序中指定错误类型来确定要处理哪个错误 在引发和处理错误之间 我可以进行一些重新启动 例如使用 restart case
  • Common Lisp 中的属性列表是否引用某些全局状态?

    下面的代码有z作为局部变量 但它的行为就像全局变量一样 defun foo m let z stuff nil push m getf z stuff print z foo 1 foo 2 foo 3 我希望输出是 STUFF 1 STU
  • 如何理解clojure的lazy-seq

    我正在尝试理解 Clojurelazy seq运算符 以及惰性求值的一般概念 我知道这个概念背后的基本思想 表达式的求值被延迟 直到需要该值为止 一般来说 这可以通过两种方式实现 在编译时使用宏或特殊形式 在运行时使用 lambda 函数
  • 防止 LISP 中的终端输出

    我想运行一个函数 但不让它在终端中输出结果 例如 set A B 正常返回B在控制台中如下所示 gt gt gt set A B B gt gt gt A B 我不希望它返回任何东西 我仍然希望该函数能够完成它应该做的事情 只是默默地 gt
  • Lisp 当前内存使用情况

    我需要从 Common Lisp 程序中找出当前使用了多少内存 我知道没有可移植的方法 标准函数room以文本形式将信息打印到标准输出 而不是将其作为值返回 但是sb kernel dynamic usage在 SBCL 工作 其他 Com
  • Common Lisp 中的(随机)不那么随机?

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

    我在几个 Lisp 源文件中开发了一些 Common Lisp 函数 我希望这些函数可以轻松地供我编写的其他函数使用 或者如果我认为它们对其他人有用的话 可以在 github 上提供 现在 我只是将它们放在一些预定义的文件夹中并使用 req
  • LISP 中的变量和符号有什么区别?

    从范围上来说 内存中的实际实现 语法 例如 if let a 1 a 是变量还是符号 约尔格的回答指出了正确的方向 让我补充一点 我将讨论与 Common Lisp 类似的 Lisp 作为数据结构的符号 符号是 Lisp 中真实的数据结构
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 宏扩展可以包含(声明...)表达式吗?

    Common Lisp Hyperspec 规定 宏形式不能扩展为声明 声明表达式必须显示为它们引用的形式的实际子表达式 我对 扩展到 的含义感到困惑 由于显而易见的原因 如下宏将不起作用 defmacro optimize fully d
  • 人们可以放心地忽略宏和内置宏之间的区别吗?

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

    例如 我有这个包定义 它遮蔽了 COMMON LISP LISTEN defpackage shadows use common lisp shadow listen export listen 然后我想使用另一个包中的这个包 比如说 de
  • windows下无法用emacs + sbcl启动slime

    我想配置我的 emacs 以使用 SLIME 和 SBCL emacs 文件如下所示 add to list load path D app slime setq inferior lisp program sbcl require sli
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • gensym 在 Lisp 中做什么?

    我听到一些同学谈论他们如何使用该功能gensym为此 我问他们它做了什么 甚至在网上查了一下 但我真的无法理解这个函数的作用是什么两者都不为什么或何时最好使用它 特别是 我对它在 Lisp 中的作用更感兴趣 谢谢你们 独特且未被拘禁的符号
  • 为什么在 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

随机推荐

  • 打包(类型擦除)随机数生成器

    C 11 std 库有几个随机数生成器 RNG 每个都实现了这个概念统一随机数生成器 http en cppreference com w cpp concept UniformRandomNumberGenerator 然后可以将它们用作
  • 简单的 Linux 信号处理

    I have a program that creates many threads and runs until either power is shutdown to the embedded computer or the user
  • FileNotFoundException 与 NoSuchFileException

    我注意到另一个 Java 异常表明该文件不存在 NoSuchFileException 我的任务是重构某个 api 该 api 从不同的方法中抛出这两种情况 而我只想使用其中一种 我应该映射吗NoSuchFileException提交至Fi
  • PHP Carbon“month()”方法生成错误的日期时间

    我刚刚偶然发现了一些非常奇怪的事情 我使用 Carbon 包来生成 DateTime 对象 我使用以下代码创建 2016 年 9 月开始的日期时间字符串 Carbon create gt month 9 如果我使用 Laravel 的 dd
  • 使用 Java 6 注释处理器获取泛型类型的限定类名

    我正在使用 JDK 6 的注释处理 API 开发一个小型代码生成器 并且一直试图获取类中字段的实际泛型类型 为了更清楚起见 假设我有一个这样的课程 MyAnnotation public class User private String
  • 如何使用加密模块使用公私钥对进行加密和解密?

    我必须使用加密模块在 Node js 中编写代码 因为除了 MIT 许可之外 我不允许使用任何模块 我需要生成一个密钥对并使用公钥加密一些消息并使用私钥解密 第一部分 即密钥对的生成已完成 我没有得到任何线索如何使用加密模式使用相同的密钥对
  • ‘1004’: “排序参考无效。”

    我正在尝试对单独的工作表中的范围进行排序 然而 我不断收到这样的消息 1004 The sort reference is not valid Make sure it s within the data you want to sort
  • Apple 推送通知中的表情符号支持

    我正在开发名为 INTERSTIZIO 的 iPhone 应用程序 在这个应用程序中 我实现了用户之间聊天等功能 在此用户可以发送文本 位置和带有表情符号的文本 如果应用程序在接收端未处于打开模式 则从后端发送生成推送并显示给接收者 我可以
  • if 和 for 循环包含在 while 循环 VBA 中

    我正在尝试编写一些代码 循环在一个列中抛出一列数据 并将其与同一工作表中另一列中的数据进行匹配 当两个数据点匹配时 相应的数据将被复制到第一个数据点旁边 最简单的表达方式是我在 while 循环内的 for Staten 内有一个 if 语
  • 用于通过电子邮件发送活动电子表格的 Google Apps 脚本

    我在网上找到了一个脚本 它可以获取当前工作表 将其复制到临时的新电子表格中 将其转换为 PDF 并通过电子邮件发送 我能够让它工作 但尝试将其设置为仅发送特定范围 尝试了一下 但无论如何我都不是一个好的编码员 或者 我也有兴趣弄清楚如何让它
  • CGIHTTPRequestHandler 在 python 中运行 php 或 python 脚本

    我正在 Windows 上编写一个简单的 python Web 服务器 它可以工作 但现在我想运行动态脚本 php 或 py 而不仅仅是 html 页面 这是我的代码 from BaseHTTPServer import HTTPServe
  • Oracle数据库连接超时设置

    如果一段时间不活动 与 Oracle 数据库的连接会被断开 这会导致错误 gt end of file on communication channel 客户端计算机上是否有任何 Oracle 设置 sqlnet ora 或某种环境变量 可
  • 绑定和连接之间有什么关系?

    我的印象是 gt gt 由 Haskell 使用 和join 数学家更喜欢 是 相等的 因为一个可以用另一个来写 import Control Monad join join x x gt gt id x gt gt f join fmap
  • 是否值得对数据库中的电子邮件地址进行加密?

    我已经在使用了加盐哈希 http www matasano com log 958 enough with the rainbow tables what you need to know about secure password sch
  • 用vb6实现多线程

    我的任务是通过连接到电脑的多个串行端口实现自动化过程 我如何使用 vb6 实现多线程 以通过附加的串行端口独立执行一些自动化任务 提前致谢 不 vb6 不支持多线程 它通过破解 winapi 在 vb5 中工作 但在 vb6 中完全被破坏
  • JSF不支持跨域验证,有解决方法吗?

    JSF 2 0 只允许您验证一个字段上的输入 例如检查它是否具有特定长度 它不允许您有一个表格 其中显示 输入城市和州 或仅输入邮政编码 你是怎么解决这个问题的 我只对涉及 JSF 验证阶段的答案感兴趣 我对将验证逻辑放入托管 Bean 不
  • 交叉验证 SPARK 期间的自定义评估器

    我的目标是向 CrossValidator 函数 PySpark 添加基于排名的评估器 cvExplicit CrossValidator estimator cvSet numFolds 8 estimatorParamMaps para
  • Angular 2子路由会刷新父路由吗

    我有一个应用程序 在某些情况下 我在父路线的子路线之间进行路线 一个看起来像example com a 1 其他example com a 2 将从切换1 to 2触发页面的重新加载 渲染a 就像播放视频一样a并且有一个与该视频同级的路线出
  • equals 和 hashCode 的通用反射辅助方法

    我正在考虑为 equals 和 hashCode 创建一个反射辅助方法 在 equals 的情况下 辅助方法会通过反射 API 查找 objectA 的字段 并将它们与 objectB 的字段进行比较 对于 hashCode 辅助方法会检查
  • Common Lisp 中的 comma-comma-at

    我对 comma comma at 的作用感到困惑 使用 comma comma at 的示例如下定义 Lisp 宏时是否需要使用双引号 双逗号 https stackoverflow com questions 17938242 is t