Parsing REBOL路径运算符与除法模糊度

Parsing REBOL路径运算符与除法模糊度,parsing,rebol,ambiguity,Parsing,Rebol,Ambiguity,我开始研究REBOL,只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。REBOL绝对是充满了这些。我注意到的一件事是使用“/”作为路径操作符,在大多数面向对象编程语言中,它可以类似地使用“.”操作符。我没有广泛地使用REBOL编程,只是看了一些示例并阅读了一些文档,但我不清楚为什么“/”运算符没有歧义 x: 4 y: 2 result: x/y 在我的示例中,这应该是除法,但如果x是对象或函数,那么它似乎也可以是路径操作符。REBOL如何处理这种模糊性?这仅仅是一

我开始研究REBOL,只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。REBOL绝对是充满了这些。我注意到的一件事是使用“/”作为路径操作符,在大多数面向对象编程语言中,它可以类似地使用“.”操作符。我没有广泛地使用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