0

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

x: 4
y: 2
result: x/y

在我的示例中,这应该是除法,但如果 x 是一个对象或函数细化,它似乎也很容易成为路径运算符。REBOL 如何处理歧义?这只是重载运算符和类型系统的问题,所以它直到运行时才知道?或者它是我在语法中遗漏的东西,真的有区别吗?

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

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

看起来算术除法需要空格,而路径运算符不需要空格。是这样吗?

4

4 回答 4

3

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

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

, ETC。

于 2013-01-25T00:18:34.447 回答
2

代码指南说:

空白通常用于定界(用于分隔符号)。

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

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

成为 REBOler 的一项后天技能是掌握在其他语言通常不需要的表达式中插入空格的窍门 :)

于 2011-03-08T06:12:32.493 回答
2

Rebol 中通常需要空格,但“特殊”字符也有例外,例如那些分隔系列。例如:

  • [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

代码的“实时”性质将挖掘路径并为您提供integer!价值10。但如果你使用报价:

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

然后你会得到一个path!简单的值data/x/y,它永远不会被评估。

在内部表示中,一个 PATH! 与 BLOCK 非常相似!或PAREN!。它只是具有这种特殊的独特词汇类型,因此可以区别对待。尽管您已经注意到它可以通过从对象或系列中挑选成员来表现得像一个“点”,但这只是 DO 方言使用它的方式。您可以发明自己的想法,假设您制作了“russell”命令:

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

想象一下,在我的奇特示例中,它输出30, 10, 20... 因为 russell 函数所做的是以这样一种方式评估其块,即路径被视为移位值的指令。所以x/y/z表示 x=>y、y=>z 和 z=>x。然后括号中的任何代码都以 DO 方言运行。作业正常处理。

当你想创作一段关于如何表达自己的有趣的新即兴演奏时,Rebol 会处理很多繁重的工作。因此,例如,括号可以保证匹配到一个paren!. 您不必自己去寻找所有这些,您只需从所有这些不同类型的构建块中构建您的方言......并与现有行为挂钩(例如用于数学和一般计算等基础知识的 DO 方言,和令人费解的 PARSE 方言,用于一些相当惊人的模式匹配肌肉)。

但是说到“所有这些不同的类型”,斜线还有另一种奇怪的情况可以创建另一种类型:

>> type? quote /foo

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

于 2013-01-25T18:14:12.463 回答
0

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

x*y

是一个有效的标识符

x * y

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

于 2011-03-07T14:57:04.857 回答