Parsing REBOL路径运算符与除法模糊度
我开始研究REBOL,只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。REBOL绝对是充满了这些。我注意到的一件事是使用“/”作为路径操作符,在大多数面向对象编程语言中,它可以类似地使用“.”操作符。我没有广泛地使用REBOL编程,只是看了一些示例并阅读了一些文档,但我不清楚为什么“/”运算符没有歧义Parsing REBOL路径运算符与除法模糊度,parsing,rebol,ambiguity,Parsing,Rebol,Ambiguity,我开始研究REBOL,只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。REBOL绝对是充满了这些。我注意到的一件事是使用“/”作为路径操作符,在大多数面向对象编程语言中,它可以类似地使用“.”操作符。我没有广泛地使用REBOL编程,只是看了一些示例并阅读了一些文档,但我不清楚为什么“/”运算符没有歧义 x: 4 y: 2 result: x/y 在我的示例中,这应该是除法,但如果x是对象或函数,那么它似乎也可以是路径操作符。REBOL如何处理这种模糊性?这仅仅是一
x: 4
y: 2
result: x/y
在我的示例中,这应该是除法,但如果x是对象或函数,那么它似乎也可以是路径操作符。REBOL如何处理这种模糊性?这仅仅是一个重载运算符和类型系统的问题,所以直到运行时它才知道?或者是我在语法上遗漏了什么,而且真的有区别
UPDATE找到了一段很好的示例代码:
sp: to-integer (100 * 2 * length? buf) / d/3 / 1024 / 1024
似乎算术除法需要空格,而路径运算符不需要空格。是吗?虽然我没有找到任何明确的书面澄清,但我也发现+、-、*和其他字符在一个单词中是有效的字符,因此显然它需要一个空格
x*y
是有效的标识符
x * y
执行乘法运算。看起来路径操作符只是另一种情况。代码指南中说:
空白通常用于分隔(用于分隔符号)
这一点尤其重要,因为单词可能包含+和-。
作为一个重新引导者,一项必备技能是在其他语言通常不需要的表达式中插入空格:)这个问题应该从语法角度得到答案。在Rebol中,实际上没有“路径操作符”。
x/y
是一个称为path的语法元素。与独立的/
(由空格分隔)不是路径相反,它是一个单词(通常被解释为除法运算符)。在Rebol中,您可以检查如下语法元素:
length? code: [x/y x / y] ; == 4
type? first code ; == path!
type? second code
等。Rebol中通常需要空格,但对于“特殊”字符(如分隔序列的字符)也有例外。例如:
与[abc]
[abc]
与(abc)
(abc)
与[a b c]def
[a b c]def
type?
、quote
和probe
。quote操作符阻止解释器对事物给出行为。因此,如果您尝试以下方法:
>> data: [x [y 10]]
>> type? data/x/y
>> probe data/x/y
代码的“活动”特性将挖掘路径,并为您提供一个整数代码>值10
。但如果您使用quote:
>> data: [x [y 10]]
>> type? quote data/x/y
>> probe quote data/x/y
然后你会得到一条路径
的值只是数据/x/y
,它永远不会被计算
在内部表示中,一个路径!很像一个街区!或是一个帕伦!。它只是有这种特殊的独特的词汇类型,这使得它可以被不同的对待。虽然您已经注意到,它可以通过从对象或序列中选取成员来表现为“点”,但这只是DO方言使用它的方式。你可以发明你自己的想法,比如说你做了“russell”命令:
想象一下,在我想象中的例子中,这会输出30
,10
,20
…因为russell函数所做的是以这样一种方式计算其块,即路径被视为移位值的指令。所以x/y/z
意味着x=>y,y=>z,z=>x。然后括号中的任何代码都以DO方言运行。作业处理正常
当你们想编一段关于如何表达自己的有趣的新歌时,Rebol会处理很多繁重的工作。因此,例如,保证括号匹配以获得paren代码>。你不必自己去寻找所有这些,你只需从所有这些不同类型的构建块中构建你的方言…并连接到现有的行为中(例如数学和通用计算等基础知识的DO方言,以及一些相当惊人的模式匹配肌肉的令人费解的解析方言)
但说到“所有这些不同的类型”,slash还有另一种奇怪的情况,可以创建另一种类型:
>> type? quote /foo
这就是所谓的优化代码>,并在以斜杠开始词法元素时发生。您将看到它在DO方言中用于调用函数的可选参数集。但再一次,它只是零件盒中另一个象征性的乐高玩具。你可以用完全不同的方言来解释它的意思…啊,谢谢。我在看的教程中没有看到这一点,但是,是的,这显然是正在发生的事情。出于好奇,你觉得这很烦人,还是没什么大不了的?我并不完全相信,放松命名单词的规则是一个很好的折衷办法,可以在表达式中强制使用额外的空格……但这很容易记住。“我真的很喜欢看到新的想法,甚至只是另类的语法。REBOL绝对充满了这些。”-这里说的是实话。:-)欢迎加入我们,如果您仍然对这个主题感兴趣,它已经作为开源发布了!
>> type? quote /foo