我正在尝试将方案解析器编写为练习,但我不确定如何实现向量语法。 specification似乎表示输入向量的方式为'#(1 2 3)
,此类向量应评估为#(1 2 3)
。但是,当我在几个Scheme实现中进行实验时,#(1 2 3)
也被接受为有效输入。这是规范的普遍实现的扩展吗?
答案 0 :(得分:1)
根本不普遍。例如,Chicken将不允许您评估未加引号的向量。
#;1> #(1 2 3)
Error: illegal non-atomic object: #(1 2 3)
#;1> '#(1 2 3)
#(1 2 3)
答案 1 :(得分:1)
有关标准和实施的有趣事项。只要不与规范冲突,实现就可以为您提供许多功能。因此,一个实现需要对#(1 2 3)进行评估,就像它是自我评估一样,并且没关系,因为无论如何,这将永远不会发生在符合R5RS的程序中。在R5RS中,运行非符合R5RS的程序,如
(define test "hello")
(string-set! test 0 #\H)
未定义。它可能会失败,不会默默地更改测试或更改测试。 R6RS也是如此,但实现可能会发出错误信号 - 但仍然没有。
AFAIK racket
拥有最严格的R5RS,但即使他们的实施仍有额外的som。例如。它们允许规范中不允许的符号和they have symbols defined in their report-environment在球拍的模块系统中提升R5RS。但是,与所有实现一样,在给出符合R5RS的程序时几乎没有错误。
答案 2 :(得分:1)
根据R 5 RS规范,必须引用载体:
请注意,这是矢量的外部表示,而不是评估矢量的表达式。与列表常量一样,必须引用向量常量:
'#(0 (2 2 2 2) "Anna")
有些实现已选择允许评估未加引号的向量,但任何此类扩展都是非标准的,并且具有"特征"该特定实施。
对于它的价值,即将到来的R7RS spec明确要求载体进行自我评估:
向量常量是自我评估的,因此不需要在程序中引用它们。