在另一个问题中,我看到了以下语法:
#[unset!]
type? #[unset!]
,它会告诉我unset!
,但它并没有解决#[]
是什么的谜。
好奇。
答案 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值。
与true
,false
等其他值类似。 #[unset!]
的情况很特殊,因为每个未定义的变量实际上都有这个值。