- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这里是 Paul Graham 的 On Lisp 一书中的简化示例(类似语法的方案)。
(define-macro (bar)
(let ((x 10) (y '(1 2 3)) (z 'foo))
`(list ,x `(,',z ,,@y))))
我知道 ,,@y
应该如何工作,但不确定 ,',z
究竟应该如何工作应该首先评估什么以及以什么顺序评估。 (我知道它应该评估为符号 foo,因为它以诡计返回 (10 (foo 1 2 3))
,但我不确定确切的步骤是什么)。
我在 JavaScript 中的 lisp 需要这个,我得到了结果:
(10 ((unquote z) 1 2 3))
因为它只是从左到右评估它(我只专门处理 ,,
和更多逗号)。你应该如何评估这个表达式。
书上也有这个例子:
(defmacro propmacro (propname)
`(defmacro ,propname (obj)
`(get ,obj ',',propname)))
应该如何评估',',
?这种情况下的步骤是什么?
是否还有其他带有反引号/准引号的奇怪边缘情况?您能否举出这些例子以及应该如何评估它们以及按什么顺序评估它们?
最佳答案
如何 ,',z
有效的是:
`(list ,x `(,',z ,,@y))))
^ ^
| `- this comma
`- belongs to this backquote
上面的逗号将表达式 ',z
插入到内部反引号中或 (quote ,z)
.那,z
, 又属于外反引号。
因此 z
的值被插入 (quote ,z)
制作(quote <value-of-z>)
.
然后,实际上,内部反引号的行为类似于 `(,'<value-of-z>)
.
具体来说,假设z
包含列表 (+ 2 2)
.那么我们可以理解为外层反引号插入(+ 2 2)
进入内部生产`(,'(+ 2 2) ...)
.这现在很容易理解:当计算内部反引号时,(+ 2 2)
被保护免于评估,导致对象 ((+ 2 2) ...)
.
图案 ,',',', ... ,',expr
用于获得 expr
的单个评估在最外层反引号的评估期间,这样该值然后通过剩余反引号嵌套的任意数量的评估轮传播而不进行进一步评估。这里有一种“反引号代数”在起作用,其中“逗号和引号相互抵消”。
您还可以可视化 ,',','...
作为一种钻头,可以挖掘嵌套层,使您可以在结构中的任何位置植入文字值。例如
(defmacro super-nested-macro (arg)
`(... `(.... `(.....`(we simply want arg down here ,',',',arg)))))
super-nested-macro
的作者只想保留 arg
的值进入模板,位于埋在其他三个反引号中的位置。因此通常,arg
不能使用:该逗号会被误解为属于最内层的反引号。
Are there any other weird edge cases with backquote/quasiquote?
反引号中的一个奇怪的边缘情况是试图拼接成一个点位置:
`(a b c . ,@foo) ;; not allowed
`(a b c . ,foo) ;; OK: equivalent to `(a b c ,@foo)
不确定各种实现如何处理点位置的反引号:
`(a b c . `(d e f))
这真的没有意义,我怀疑获得的实际结果将取决于反引号实现的内部结构。
并非所有对象都被遍历以取消引用:
`#c(,(sin theta) ,(cos theta)) ;; Not required by ANSI CL, oops!
这可以通过实现的扩展来实现。
关于macros - 这个反引号 "syntax"在 lisp 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56438808/
我有一个类似 ( www.bbcurdu.com) 的网站。现在我的问题是,当我添加一个带有引号或引号的新故事时,它不会保存在数据库中。如果我删除这些逗号或引号,那么它将保存在数据库中。并正确获取和显
我正在使用(并坚持使用)以下版本的 Ruby: ruby 1.8.7 (2012-06-29 patchlevel 370) [x86_64-linux] 我尝试了很多谷歌搜索,但找不到解决我的问题的
我有以下示例数据, 我想连接 string1 和 string2 以产生连接结果 "a""b" 使用连接函数 我在官方的microsoft excel文档中没有找到任何答案 https://suppo
我是 SQL-mySQL 方面的 super 新手,我想查询这些包含具有特定值的列的条目,但该值中已经有引号,它实际上看起来像这样,引号已经存在:“荷兰鹿特丹 Voor Land-en Volkenk
是否有一个简单的正则表达式来匹配所有 unicode 引号?还是必须像这样手动编码: quotes = ur"[\"'\u2018\u2019\u201c\u201d]" 感谢阅读。 布莱恩 最佳答案
我有下面的代码,禁止将特殊字符插入到 HTML 表单上提交的文本中。 可以看出,我需要禁用的特殊字符位于引号之间,而我需要禁用引号 " 本身,但我不能这样做,因为如果我添加另一个中间的引号然后读起来就
对于给定的输入字符串 abc,[def,ghi,ijk],lm,(no,pq,rs),[tu,vw,xy],zs,"as,as,fr"输出应该是 abc [def,ghi,ijk] lm (no,pq
下午好,快乐 4 我在处理一些 javascript 时遇到了问题....我是一个初学者,正在使用这个特定的在线示例来了解如何淡入和淡出多个引号... 我已经实现了 HTML/Javascript/C
我想在一段文本周围加上引号。文本不能超过 3 行:如果超过,我想要一个省略号(并且我仍然想要引号)。我附上我现在拥有的东西。我的解决方案使用 JS:虽然纯 CSS 解决方案是理想的,但可能的 CSS
我将它发送给一个函数,我想在下面的变量值周围加上双引号,例如 $var = "New York"(注意引号) $fq.=" + area:$state"; 所以当我回显 $state 时我想用双
这个问题在这里已经有了答案: How can I make Java print quotes, like "Hello"? (11 个答案) 关闭 9 年前。 我想在 java 中打印反引号。但是
我认为这是 F# 的一个众所周知的限制,但我找不到任何好的解决方法…… 所以,这里是代码(我试图让它尽可能简单,所以它可能看起来没有任何意义): [] type Human (makeAName: u
我在Windows 7上,在Apache 2.4上使用PHP 5.6.14版:我必须使用PHP在SQLite3数据库上构建查询选择。 NOTA:我是PHP的再见..... 我的代码如下 '; echo
在 jQuery 文档中,大多数字符串都是使用单引号“声明”的。包括documentation用于 jQuery UI。 那为什么不呢 $(".datepicker").datepicker({ da
我正在尝试在 Java 中使用以下正则表达式,它应该与任何 lang="2-char-lang-name" 匹配: String lang = "lang=\"" + L.detectLang(inp
我试图在 more 之后插入一个 block 引用指令,不接受任何参数: First paragraph. .. more:: Blockquote here! -- Author S
我从外部进程获得了一些我无法更改的 JSON,并且我需要修改此 JSON 字符串才能使下游 Java 进程正常工作。 JSON 字符串如下所示: {"widgets":"blah","is_dog":
我试图在从数据库读取数据后生成 CSV 文件。现在单个数据可以包含逗号、单引号和双引号。 请告诉我如何在正则表达式的帮助下处理这种情况。 最佳答案 您可以为 CSV 文件使用不同的分隔符吗?也许是一个
我尝试在 codemodel(Sun) 中创建下一个表达式: driver.findElement(By.xpath("//div[text()=\""+whatToclick+"\"]/pare
我需要知道报价和列表之间的区别。例如: cl-prompt> (equal (first (list * 1 2)) *) T cl-prompt> (equal (first '(* 1 2)) *
我是一名优秀的程序员,十分优秀!