Common Lisp 双反引号、反引号、引号、反引号序列?

2023-12-29

我正在阅读 Let Over Lambda,它涉及一些非常深入的分层宏创作。这很有趣,我基本上都能跟上它的步伐。

在第 4 章中,Hoyte 为 CL-PPCRE 匹配和替换功能实现了读取器宏,这样您就可以执行以下操作:

(#~m/(foo|bar)\d+/ "Some foo99")    ; matches!
(#~s/foo(\d+)/bar\1/, "Some foo99") ; "Some bar99

为了实现这一点,我们定义了一个使用双反引号的宏,因为它实际上是由包装宏扩展的,而包装宏需要带引号的值(它返回 lambda 形式)。在准引用列表中,有一些使用以下序列,',varname,我无法理解。最初的作用是什么,'在这里做吗?

(defmacro! pcre/match-lambda-form (o!args)
  "Expands to a lambda that applies CL-PPCRE:SCAN"
  ``(lambda (,',g!str)
      (cl-ppcre:scan ,(car ,g!args)
                     ,',g!str)))

事实上,我最好将其提炼成仅使用的东西defmacro,为了清楚起见,如果您还没有读过这本书。str是一个符号并且args是一个列表:

(defmacro pcre/match-lambda-form (args)
  "Expands to a lambda that applies CL-PPCRE:SCAN"
  ``(lambda (,',str)
      (cl-ppcre:scan ,(car ,args)
                     ,',str)))

引号基本上是双引号内部部分,以便结果可以被取消引用两次吗?有效地投入'str变成扩展形式,而不仅仅是str?

编辑|感谢 Terje D. 和 REPL 中的一些尝试,情况大致如下:

(defvar a 42)

(equal ``(,,a)  '(list 42)) ; T
(equal ``(,a)   '(list a))  ; T
(equal ``(,',a) ''(42))     ; T
(equal ``(a)    ''(a))      ; T (obviously)

So:

  • 双引号不加引号,形式已完全展开。
  • 单引号,形式不扩展。
  • 不使用逗号引用,形式完全展开并引用结果。

在评估双反引号形式时,首先处理内部反引号,结果是单反引号形式。在评估内部反引号形式期间,仅评估前面有两个逗号的元素。然而,评估这些双反引用元素的结果仍然是(单)未引用的,因此当评估所得的单反引用形式时再次评估。为了仅以内部反引号形式实现求值,必须插入普通引号,从而导致,',.

怎么看

(let ((tmp (gensym)))
    ``(lambda (,tmp ,,tmp ,',tmp) ()))

评估为

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

Common Lisp 双反引号、反引号、引号、反引号序列? 的相关文章

  • windows下无法用emacs + sbcl启动slime

    我想配置我的 emacs 以使用 SLIME 和 SBCL emacs 文件如下所示 add to list load path D app slime setq inferior lisp program sbcl require sli
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • (cons 'a (cons 'b 'c)) 和 (cons 'a '(b.c)) 之间的 Lisp 区别

    有什么区别 cons a cons b c A B C and cons a b c A B C 我需要使用 cons 创建以下列表 a b c 所以我试图理解 是什么 代表 L E 我有以下内容 cons cons a b c 但它产生
  • 宏和后置增量

    这是一些更奇怪的宏观行为 我希望有人能够阐明 define MAX a b a gt b a b void main void int a 3 b 4 printf d d d n a b MAX a b 输出为 4 6 5 b 的值增加两
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 宏未产生所需的结果

    我是 C 新手 之前来自 Python 我对这部分代码感到困惑 include
  • 是否可以从外部文件运行 openoffice 宏?

    我想从外部文件运行 OpenOffice 宏 喜欢 vlad leo soffice macro home vlad q vbs 并不是真正的答案 只是一个评论 以便提出这个问题 并希望得到答案 这可能与必须显式设置宏的权限有关 例如 编辑
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 使用局部特殊变量

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • 如何编写 Clojure 宏来从字符串创建正则表达式?

    我正在创建一个方便的宏 部分便利在于可以仅使用字符串来指定正则表达式 而不是使用 re 表示法 我无法弄清楚的一部分是如何让宏获取字符串并将其重写为 Clojure 正则表达式 例如 生成 re 符号 我认为这是一个语法 转义问题 我的第一
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 在 clojure 中,使用递归实现宏时如何进行代码模板化

    我正在尝试实现一个宏 以递归地将中缀列表转换为前缀列表 我遇到一个问题如下 this works defmacro recursive infix form list second form first form if not seq nt
  • 使用 Scala 宏或反射实例化类

    在我的 scala 代码中 我希望能够实例化一个新类 例如 假设我有以下代码 class Foo def foo 10 trait Bar val bar 20 理想情况下 我希望能够做类似的事情 def newInstance A lt
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 避免函数内装箱/拆箱

    对于数字密集型代码 我编写了一个具有以下签名的函数 def update f Int Int Double gt Double Unit 然而 因为Function3不是专门的 每个应用程序f结果对 3 个参数和结果类型进行装箱 拆箱 我可
  • SLIME 和 SWANK 入门:Lisp 连接意外关闭:连接被远程对等点断开

    我试图使用 slime connect 函数通过 sbcl 访问远程服务器 我遵循了 slime mov 电影中的所有步骤马可 巴林格 http www guba com watch 30000548671但在为 slime 创建 ssh
  • 递归分割列表函数 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
  • 如何定义所有成员均为给定类型的列表

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

随机推荐

  • 具有任意顺序的 JavaScript 依赖解决方案包括

    问题是这样的 我包含一个脚本 它使用另一个脚本 但是如果该依赖项还需要准备另一个脚本怎么办 这意味着加载它是不够的 但我还需要确保在执行之前调用了它的初始化回调 如果允许依赖项需要更多依赖项并在加载后显示它们 则 DOM 中脚本标签的顺序可
  • 小数和百分比行高有什么区别

    这个问题最初引用了w3c学校 我已经更正了该引用 根据w3c http www w3 org TR CSS21 visudet html propdef line heightCSSline height值可以设置如下
  • SQL Azure - 如何从 SQL Azure 中的主数据库中选择 sysdatabases 表?

    在 SQL Azure 中 我尝试这样做 从 master dbo sys 数据库中选择 并得到这个错误 此版本的 SQL Server 不支持引用 master dbo sysdatabases 中的数据库和 或服务器名称 我应该怎么做才
  • “最终一致性”与“强最终一致性”与“强一致性”?

    我遇到了 强最终一致性 的概念 它是否应该比 最终一致性 强但比 强一致性 弱 有人可以用适用的例子解释这三个概念之间的区别吗 http en wikipedia org wiki Eventual consistency Strong E
  • 如何禁止 easy_install 压缩 Egg?

    我必须投入什么distutils cfg防止easy install安装压缩的egg 压缩是一个很好的想法 但我喜欢能够 grep 并调试该代码 我引入了一些依赖项python setup py develop 仔细观察发现它也接受 alw
  • C# 自定义代码片段函数

    我有一个像这样的代码片段结构 private type lowercaseName public type uppercaseName get return lowercaseName set lowercaseName value 它会生
  • 使用自定义双括号格式进行 Python 模板安全替换

    我正在尝试替换格式中的变量 var 与Python的模板 from string import Template class CustomTemplate Template delimiter pattern r P
  • Qt 如何制作和安装插件?

    我想使用这里提到的 Qt Quick Components for Desktop http labs qt nokia com 2011 03 10 qml components for desktop http labs qt noki
  • 运行时按路径加载共享库

    我正在构建一个 Java 应用程序 该应用程序使用用 C 编写并针对不同操作系统进行编译的共享库 问题是 这个共享库本身依赖于它通常在适当的环境变量下找到的附加库 PATH LIBRARY PATH or LD LIBRARY PATH 我
  • 如何撤消剥离 -即将符号添加回剥离的二进制文件

    我有一个剥离的二进制文件和符号文件 是否可以将符号添加回二进制并创建未剥离的二进制 我的用例是使用这个二进制文件和 valgrind 对于那些不支持单独的调试信息文件的工具 您可以将调试部分粘回原始二进制文件 您可以按照这些思路做一些事情
  • 如何在 Angular API 请求的标头中传递 x-api-key? [复制]

    这个问题在这里已经有答案了 我正在尝试发送x api keyheaders中的header如下图 服务 ts import Injectable from angular core import Http Headers RequestOp
  • 安装 APK 时出现 DELETE_FAILED_INTERNAL_ERROR 错误

    I am using Android Studio 2 2 Preview I am facing the issue 失败 安装失败无效的apk 错误 安装 apk 时 我已经在 build gradle 中进行了更改 但无法重新跟踪它
  • ng-grid 支持虚拟滚动吗?

    我想在我的应用程序中使用 Slickgrid 来实现网格功能 但由于我大部分时间都使用 AngularJS 我认为 ng grid 是可行的方法 但不确定它是否支持虚拟滚动 我尝试查看他们的文档和没有找到任何有关虚拟滚动支持的信息 如果可能
  • 如何在一定时间限制后调用另一个活动

    如何为将一项活动调用另一项活动设定时间限制 我想在给定的时间限制内调用另一个活动 例如 将 A 类呼叫到 B 类 我使用了alarmManager 但我的应用程序不可能也使用线程 每当我给出Thread sleep时 它都不会执行操作 直到
  • 为什么使用单例而不是静态方法?

    对于这些有关帮助器 实用程序类的简单问题 我从未找到好的答案 为什么我要创建一个单例 无状态 而不是使用静态方法 如果对象没有状态 为什么还需要对象实例 通常 单例用于引入某种全局状态到一个应用程序 老实说 这种情况经常超出真正必要的范围
  • 函数声明中缺少“虚拟”限定符

    在搜寻一些旧代码时 我遇到了类似于以下内容的内容 class Base public virtual int Func class Derived public Base public int Func Missing virtual qu
  • 使用 Apache CXF 的 JAX-RS 文件上传

    我正在尝试使用 JAX RS 和 TomEE 的 Apache CXF 实现 2 6 14 上传文件 但上传的文件始终为空 这是代码 POST Path upload Consumes MediaType MULTIPART FORM DA
  • 使用 XAML 将故事板完成时元素的可见性设置为折叠

    我有一个故事板动画 它使用不透明度属性使控件淡出视图 完成后 我想将控件的可见性设置为折叠 我也希望能够执行相反的操作 将可见性设置为可见 然后使用故事板将控件淡入视图中 我知道我可以连接事件 但我想在 XAML 中完成这一切 是否可以 你
  • 如何从 git 存储库加载最新的 Clojure 库

    我想使用最新的开发版本clojure data xml 我正在使用 Leiningen 来管理依赖项 但是 存储库中没有 SNAPSHOT 版本Central http search maven org search 7Cgav 7C1 7
  • Common Lisp 双反引号、反引号、引号、反引号序列?

    我正在阅读 Let Over Lambda 它涉及一些非常深入的分层宏创作 这很有趣 我基本上都能跟上它的步伐 在第 4 章中 Hoyte 为 CL PPCRE 匹配和替换功能实现了读取器宏 这样您就可以执行以下操作 m foo bar d