- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始尝试学习 Scheme 评估的内部结构,而准引用、取消引用、评估和 cons-cells 的一个方面让我感到困惑。如果您能就该主题推荐任何好的引用资料,我将不胜感激。
R7RS 草案在 4.2.8 节中关于准报价的部分有这个例子。
`(( foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))
(它也在 R4RS 规范中,所以这不是新事物。)
根据规范,这应该评估为:
((foo 7) . cons)
我无法理解其中的原因。在我看来,.从内部列表的开头删除反引号,这意味着它不会被评估为过程。
这里有一个更简单的表达式来说明同样的问题:
`(foo . ,(car '(bar)))
使用与上面相同的逻辑,这应该评估为:
(foo . bar)
事实上,它确实在我尝试过的 Scheme 系统上进行了评估。
但是,根据我的理解,它不应该对此进行评估,所以我想找出我哪里出错了。
我对 Scheme 评估的理解是(好吧,简化了)如果它是左括号后的第一个关键字,则调用该过程并将列表的其余部分作为参数。
我对规范的理解是,',' 完全等同于将下一个表达式包装在 '(unquote' 过程中。
我对点符号的理解是,为了一般显示目的,您可以删除点和左括号(以及匹配的右括号),如下所述:
所以:
`(foo . ,(car '(bar)))
同样可以呈现为:
(quasiquote (foo unquote (car (quote (bar)))))
(事实上,这就是 jsScheme 将在其日志窗口中呈现输入的方式。)
但是,在评估时:
(quasiquote (foo unquote (car (quote (bar)))))
为什么要对“unquote”求值(作为一个过程?),取消引用并求值 (car...) 列表?当然,它应该只被视为引号,因为它不在左括号之后?
我可以想到一些可能的答案 - “unquote”不是常规过程,“unquote”是在常规评估过程之外进行评估的,有一种不同的方式来指示要调用的过程,而不是'(' 后跟过程的符号 - 但我不确定哪个是正确的,或者如何挖掘更多信息。
我见过的大多数方案实现都是使用宏来处理这个问题,而不是使用与求值器相同的语言,而且我很难弄清楚应该发生什么。有人可以解释一下或向我展示有关该主题的任何好的引用资料吗?
最佳答案
你是正确的,因为涉及宏:特别是,quasiquote
是一个宏,unquote
和 unquote-splicing
是文字.这些都不是程序,因此不适用正常的评估规则。
因此,可以给予 (quasiquote (foo bar baz unquote x))
它需要的特殊处理,尽管 unquote
不是第一个语法元素。
关于scheme - 取消引用准引用点对中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13810236/
我正在尝试创建(在Java中)一个包含指定数量的整数k(例如,50、500、1000等)的整数数组,该数组不使用库函数或集合,但包含随机数范围内(即从 1 到 k)的数字分类,具有指定的重复百分比。
例如: MY_MESSAGE = 'Dear %s, hello.' # ... name = "jj" print MY_MESSAGE % name python 是否具有完成类似我上面的代码的功
我有一个使用 NUnit 3.4.1、NSubstitute 1.10.0 和 NCrunch 2.23.0.2 的文本夹具 此夹具中在任何时间点都有 2 个失败测试。每次我更改某些内容时,哪个测试失
我是一名优秀的程序员,十分优秀!