- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读 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)
所以:
最佳答案
在计算双反引号形式时,首先处理内部反引号,结果是单反引号形式。在评估内部反引号形式期间,仅评估前面有两个逗号的元素。但是,评估这些双未引用元素的结果仍然(单)未引用,因此在评估结果单反引号形式时再次评估。要仅以内部反引号形式实现评估,必须插入普通引号,从而生成 ,',
。
看看如何
(let ((tmp (gensym)))
``(lambda (,tmp ,,tmp ,',tmp) ()))
评估为
`(LAMBDA (,TMP ,#:G42 #:G42) nil)
关于macros - Common Lisp Double-Backquote, Unquote, Quote, Unquote 序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429521/
Sybase PowerDesigner Version 16.0.0.3514 Current DBMS mysql 5.0 生成SQL 事实上,我想在字段name周围添加反引号,就像这样 如何配
我遇到了一个错误Syntax error: EOF in backquote substitution 我一点也不知道为什么。有人介意快速浏览一下吗? #! /bin/sh # chkconfig 3
下面的一段代码给了我预期的结果: (let ((name 'test) (args '("arg1" "arg2"))) `(defun ,name ,@args)) ;; (D
我在 bash (Ubuntu) 中写了一个 MySQL 命令: [XXXX:~]$ mysql -h localhost -u XXXX -pXXXX -e "DROP DATABASE IF EX
我一直在关注 instructions为 Lisp 安装编码示例,但在尝试使用 Allegro CL 加载文件“aima.Lisp”时出现错误“逗号不在反引号内”。 这是文件的代码(未经编辑的代码 h
我能找到的在 Visual Studio Code 中处理自定义颜色的唯一选项是: "editor.tokenColorCustomizations": { "[Atom One Dark]"
有关修复 emacs 错误“检测到旧式反引号”的任何提示? 我确定错误来自我编写的一些古老的 lisp 代码。 谢谢。 最佳答案 您是否将旧代码与旧的或最新的 Emacs 版本(或两者)一起使用?如果
我是一名 emacs 新手,正在学习本教程:https://learnxinyminutes.com/docs/elisp/ 我写了这段代码: (defun hello (name) (inser
我是一名 emacs 新手,正在学习本教程:https://learnxinyminutes.com/docs/elisp/ 我写了这段代码: (defun hello (name) (inser
我在 crontab 中创建了一个新任务,如下所示: */2 * * * * mongodump --db prodys --out /backup/databases/mongoData
我正在阅读 Let Over Lambda,它涉及一些非常深层的宏创作。这很吸引人,我几乎都在设法跟上它。 在第 4 章中,Hoyte 为 CL-PPCRE 匹配和替换函数实现了读取器宏,这样您就可以
我正在尝试编译从 Git hub 下载的 Qt 项目。我在编译过程中遇到了以下错误。 /bin/sh: 1: 语法错误:反引号替换中的 EOF make: * [mainwindow.o] 错误 2
Heroku Deploy for Rails 应用程序当前失败。我收到以下错误消息。我没有更改任何 gems 或 Rails 代码,只是更改了一些静态 HTML 和 CSS 文件。 -----> R
我是一名优秀的程序员,十分优秀!