REBOL路径算子与除法歧义

时间:2011-03-07 12:48:43

标签: parsing rebol ambiguity

我开始研究REBOL,只是为了好玩,作为编程语言的粉丝,我真的很喜欢看到新的想法,甚至只是替代语法。 REBOL肯定充满了这些。我注意到的一件事是使用'/'作为路径操作符,可以类似于'。'使用。大多数面向对象编程语言中的运算符。我没有在REBOL中进行过广泛的编程,只是查看了一些示例并阅读了一些文档,但我不清楚为什么“/”运算符没有歧义。

x: 4
y: 2
result: x/y

在我的例子中,这应该是除法,但是如果x是对象或函数细化,它似乎很容易就像路径运算符一样。 REBOL如何处理歧义?它只是一个重载运算符和类型系统的问题,所以它直到运行时才知道?或者这是我在语法中缺少的东西,确实存在差异?

UPDATE 找到了一段很好的示例代码:

sp: to-integer (100 * 2 * length? buf) / d/3 / 1024 / 1024

似乎算术除法需要空格,而路径运算符不需要空格。是吗?

4 个答案:

答案 0 :(得分:3)

这个问题值得从句法的角度来回答。在Rebol中,实际上没有"路径运算符" x/y是一个名为path的语法元素。与此相反,独立/(由空格分隔)不是路径,它是一个单词(通常被解释为除法运算符)。在Rebol中,你可以检查这样的句法元素:

length? code: [x/y x / y] ; == 4
type? first code ; == path!
type? second code

等。

答案 1 :(得分:2)

代码指南说:

  

白色空间通常用于分隔(用于分隔符号)。

     

这一点尤为重要因为单词可能包含+和 - 等字符。

http://www.rebol.com/r3/docs/guide/code-syntax.html

作为REBOler的一个获得的技能是在其他语言通常不需要它的表达式中插入空格:)

答案 2 :(得分:2)

Rebol通常需要空间,但是这里和那里都有例外和#34;特殊"字符,例如分隔系列的字符。例如:

  • [a b c][ a b c ]
  • 相同
  • (a b c)( a b c )
  • 相同
  • [a b c]def[a b c] def
  • 相同

用于对句法元素进行内省的一些相当强大的工具是type?quoteprobe。引号运算符可以防止解释器为事物提供行为。所以,如果你尝试过类似的东西:

>> data: [x [y 10]]
>> type? data/x/y
>> probe data/x/y

" live"代码的性质将挖掘路径并为您提供integer!10。但是如果你使用引用:

>> data: [x [y 10]]
>> type? quote data/x/y
>> probe quote data/x/y

然后你结束了path!,其值只是data/x/y,它永远不会被评估。

在内部表示中,一个路径!非常类似于BLOCK!还是一个PAREN!它只是具有这种特殊的独特词汇类型,可以对它进行不同的处理。虽然您已经注意到它可以表现得像一个" dot"通过从一个对象或系列中挑选成员,这只是DO方言的使用方式。你可以发明自己的想法,让我们说你做出了#r; russell"命令:

russell [
    x: 10
    y: 20
    z: 30
    x/y/z
    (
        print x
        print y
        print z
    )
]

想象一下,在我的幻想示例中,这会输出301020 ...因为russell函数所做的是以路径为止的方式评估其块被视为转移价值观的指令。所以x/y/z表示x => y,y => z,z => x。然后括号中的任何代码都以DO方言运行。作业正常处理。

如果你想在如何表达自己方面构成一个有趣的新riff,Rebol会处理很多琐碎的工作。因此,例如,保证括号匹配得到paren!。你不必自己去寻找所有这些,你只需要从所有不同类型的构建块中建立你的方言......并勾勒出现有的行为(例如数学和一般基础知识的DO方言)计算,以及令人惊叹的PARSE方言,对于一些相当惊人的模式匹配肌肉)。

但是谈到"所有那些不同的类型",还有另一种可以创建另一种类型的斜线的怪异情况:

>> type? quote /foo

这称为refinement!,当你启动带斜杠的词法元素时会发生这种情况。您将在DO方言中看到它用于将可选参数集调出到函数中。但再一次,它只是零件盒中另一个象征性的乐高。你可以在你自己的方言中赋予它完全不同的意义......

答案 3 :(得分:0)

虽然我没有找到任何书面明确的澄清,但我也发现+, - ,*和其他字母都是有效的字符,所以显然它需要一个空格。

x*y

是有效的标识符

x * y

执行乘法运算。看起来路径运算符只是另一种情况。