Rebol 中通常需要空格,但“特殊”字符也有例外,例如那些分隔系列。例如:
[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
代码的“实时”性质将挖掘路径并为您提供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 方言中用于调用函数的可选参数集。但再一次,它只是零件盒中的另一个象征性乐高积木。你可以用你自己的方言赋予它完全不同的意义......