我是一名新的Scheme / Racket学生,所以请原谅任何明显的语法错误 .
今天课堂上出现了方案列表 '(a, b, c)
应该无效,但是当我们运行它时,它返回:
>'(a . b . c)
(b a c)
这毫无意义 . Afaik,翻译应该创建一个带有'a和cdr'b'的cons单元格,'c应该是无效的 . 也就是说,翻译在这里做了一些非常奇怪的事情 . 这适用于#lang方案,#lang racket等 . 我们使用DrRacket作为翻译 .
有趣的是,
>'(a . b . c . d)
抛出异常并死亡 .
我非常好奇,很想能够理解这一点,因为我不熟悉这门语言 . 谷歌非常无益(可能因为搜索条件有点含糊不清)谢谢!
编辑:可能是因为 '(a . b . c)
被解释为b作为中缀运算符 . 例如: >(4 . + . 6)
返回10.也许解释器使用b像运算符?即 (b a c)
,如 (+ 4 6)
,infix-wise .
实验说:
>(define b +)
>(define a 4)
>(define c 6)
>(a . b . c)
10
所以我认为这解决了这个问题,但我仍然不完全理解“ . ”的使用 . 在这种情况下运算符 . 我想我们已经解决了这个问题,但我们将非常感谢您的见解!
2 回答
简短的回答:你明白了 . 有关此Racket特定点的使用的更多信息,请参阅Racket文档中的infix文档 .
这是Racket读者的一个特色 . (见约翰的回答 . )
对于其他实现,您可以使用readable S-expressions reader来读取中缀表达式 . 它使用花括号 . 例如,
{3 + 4}
被读入为(+ 3 4)
. 更特别的(比Racket的中缀阅读器),你可以使用{3 + 4 + 5}
或{3 + 4 + 5 + 6}
;他们将分别读作(+ 3 4 5)
和(+ 3 4 5 6)
.