REBOL中的这个语法#[]是什么?

时间:2010-06-18 06:48:57

标签: rebol

在另一个问题中,我看到了以下语法:

#[unset!]

那是什么?如果我在R3中说type? #[unset!],它会告诉我unset!,但它并没有解决#[]是什么的谜。

好奇。

4 个答案:

答案 0 :(得分:6)

#[]是值的序列化形式。在控制台中使用MOLD与MOLD / ALL一起玩,感受它。

答案 1 :(得分:4)

#[]“语法”实际上不是这样的语法(不是合法的语法,如果你尝试的话),只有这种结构的特殊情况是“合法的”,如#[unset!]语法, #[true]语法,#[false]语法,#[none!]语法或#[datatype! unset!]语法。

更有趣的是,#[unset!]值实际上是什么。它恰好是REBOL中每个“未初始化”变量的值(不是在函数中,函数局部变量初始化为#[none!]),以及像print 1这样的表达式的结果,{ {1}},do []

关于“函数局部变量...初始化为()”我应该补充说,只有“未使用的细化”之后的变量(即实际调用中未使用的变量)被初始化为{{ 1}}与细化变量一起使用。

为了进一步解释这个问题,#[none!]#[none!]之间的句法(数据交换方言)区别在于,前者是一个词,而后者是逻辑的值!类型。从语义(Do方言)的角度来看,差异较小,因为(全局)词被解释为变量,恰好引用true值。

答案 2 :(得分:2)

看起来它是未设置实例的值构造语法,而不是单词unset!

>> comparison: [unset! #[unset!]]
== [unset! unset!]

>> type? first comparison
== word!

>> type? second comparison
== unset!

>> second comparison
>> first comparison
== unset!

如果您处于程序化环境中,则可以使用to-unset执行此操作,但使用文字符号可以躲避reduce

>> comparison: reduce ['unset! to-unset none]
== [unset! unset!]

>> second comparison
>> first comparison
== unset!

看起来他们已经为更多这类构造函数保留了#[...]语法。

答案 3 :(得分:1)

请看下面的示例:

trace on
>> e: none
Trace:  e: (set-word)
Trace:  none (word) ;<<<<<

>> e: #[none]
Trace:  e: (set-word)
Trace:  none (none) ;<<<<<

none是第一个单词,但在第二个单词中,#[none]不是单词,它是数据类型none!的Rebol值。 与truefalse等其他值类似。 #[unset!]的情况很特殊,因为每个未定义的变量实际上都有这个值。