2011-03-07 61 views
0

我已经开始关注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 

似乎算术除法需要的空白,而操作者路径不需要空格。是吗?

+0

*“我真的很喜欢看到新的想法,甚至只是替代语法,REBOL肯定是充满了这些。”* - 在这里说真话。 :-)如果您仍然对这个主题感兴趣,请随时加入我们的[StackOverflow Rebol聊天室](http://chat.stackoverflow.com/rooms/291/),它已经以开源形式发布! – HostileFork 2013-01-25 18:17:19

回答

2

的代码引导说:

白空间通常用于限定(用于分离符号)。

这是特别重要的,因为单词可能包含字符如+和 - 。

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

的是一个REBOler一个获得的技能是获得表达式插入空格的窍门,而其他语言通常不要求它:)

+0

啊,谢谢。我在看的教程中没有看到它,但是,是的,这显然是发生了什么。 – 2011-03-08 13:23:28

+0

出于好奇,你是否觉得这很烦人,或者不是什么大不了的事? – 2011-03-08 13:24:55

+0

我不完全相信命名单词的宽松规则是表达式中强制性额外空格的良好折衷......但是它很容易记住。 – Sunanda 2011-03-08 14:38:57

0

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

x*y 

是一个有效的标识符

x * y 

执行乘法。它看起来像路径运算符只是另一个例子。

3

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

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

等通常需要在雷博尔

2

空间,但在这里和那里也有例外的“特”字,如划定系列。例如:

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

代码的“活”性将通过路径挖掘,给你的价值10integer!。但是如果你使用报价:

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

然后你风与path!,其值就是data/x/y,它永远不会被评估。

在内部表示中,PATH!与BLOCK非常相似!或者PAREN !.它只是有这种特殊的独特的词汇类型,这使得它可以被区别对待。尽管你已经注意到它可以通过从一个对象或系列中选出成员来表现得像一个“点”,但这只是DO方言使用它的方式。你可以创造自己的想法,让我们说你做“罗素”命令:

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

试想一下,在我的奇特的例子,这个输出301020 ...因为什么罗素函数的作用是评估其以这种方式阻止路径被视为移位值的指令。所以x/y/z表示x => y,y => z,并且z => x。然后括号中的任何代码都在DO方言中运行。分配正常处理。

如果您想为如何表达自己做一个有趣的新即兴表演,Rebol会处理很多烦琐的工作。因此,例如括号保证匹配达到paren!。你不必自己去寻找所有的东西,你只需从所有这些不同类型的构建块中构建你的方言......并且与现有的行为挂钩(比如数学和一般计算等基础知识的DO方言,以及一些令人惊叹的模式匹配肌肉的弯曲PARSE方言)。

但是,“所有这些不同的类型”的讲话,还有却为斜线另一个怪人情况,可以创建另一个类型:

>> type? quote /foo 

这就是所谓的refinement!,以及发生在你开始词法元素用斜线。你会看到它在DO方言中使用,为可选参数集调用一个函数。但再一次,这只是另一个符号乐高在零件盒。你可以用你自己的方言来描述它的意思,这是完全不同的......