我开始研究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 :(得分: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?
,quote
和probe
。引号运算符可以防止解释器为事物提供行为。所以,如果你尝试过类似的东西:
>> 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
)
]
想象一下,在我的幻想示例中,这会输出30
,10
,20
...因为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
执行乘法运算。看起来路径运算符只是另一种情况。