В другом вопросе я увидел следующий синтаксис:
#[unset!]
Это что? Если я скажу type? #[unset!]
в R3, это скажет мне unset!
, но это не решит загадки того, что такое #[]
.
Так любопытно.
В другом вопросе я увидел следующий синтаксис:
#[unset!]
Это что? Если я скажу type? #[unset!]
в R3, это скажет мне unset!
, но это не решит загадки того, что такое #[]
.
Так любопытно.
Похоже, это синтаксис построения значения для неустановленного экземпляра, в отличие от слова 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!
Похоже, они зарезервировали синтаксис # [...] для других типов конструкторов.
#[]
- это сериализованная форма для значений. Поиграйте с MOLD вместо MOLD / ALL в консоли, чтобы почувствовать это.
#[]
"синтаксис" на самом деле не является синтаксисом как таковым (не юридическим синтаксисом, если вы попробуете его), только особые случаи таких конструкций являются "допустимыми", например синтаксис #[unset!]
, синтаксис #[true]
, синтаксис #[false]
, синтаксис #[none!]
или #[datatype! unset!]
синтаксис.
Что еще более интересно, так это то, каково на самом деле значение #[unset!]
. Это значение, которое имеет каждая "неинициализированная" переменная в REBOL (но не в функциях, локальные переменные функции инициализируются значением #[none!]
), а также результат таких выражений, как print 1
, do []
, ()
и т. Д.
Что касается «локальных переменных функции ... инициализированных в #[none!]
», я должен добавить, что только переменные, следующие за «неиспользованным уточнением» (то есть той, которая не используется в фактическом вызове), инициализируются в #[none!]
вместе с переменной уточнения.
Чтобы объяснить проблему дальше, синтаксическая разница (диалект обмена данными) между true
и #[true]
заключается в том, что первое - это слово, а второе - значение логики! тип. С семантической точки зрения (диалект Do) разница меньше, поскольку (глобальное) слово интерпретируется как переменная, которая относится к значению #[true]
.
Посмотрите на пример ниже:
trace on
>> e: none
Trace: e: (set-word)
Trace: none (word) ;<<<<<
>> e: #[none]
Trace: e: (set-word)
Trace: none (none) ;<<<<<
none
- это слово в первом, но во втором #[none]
- это не слово, это значение Rebol типа данных none!
. Аналогично для других значений, таких как true
, false
. Случай #[unset!]
особенный, поскольку каждая неопределенная переменная фактически имеет это значение.