Что это за синтаксис # [] в REBOL? - PullRequest
2 голосов
/ 18 июня 2010

В другом вопросе я видел следующий синтаксис:

#[unset!]

Что это? Если я скажу type? #[unset!] в R3, это скажет мне unset!, но это не решит тайну того, что такое #[].

Так любопытно.

Ответы [ 4 ]

6 голосов
/ 21 июня 2010

#[] - это сериализованная форма для значений.Поиграйте с MOLD против MOLD / ALL на консоли, чтобы почувствовать это.

4 голосов
/ 17 июля 2010

«синтаксис» #[] на самом деле не является синтаксисом как таковым (не допустимый синтаксис, если вы попробуете его), только специальные случаи таких конструкций являются «допустимыми», как синтаксис #[unset!], синтаксис #[true], #[false] синтаксис, #[none!] синтаксис или #[datatype! unset!] синтаксис.

Что еще более интересно, так это значение #[unset!].Это бывает значение, которое имеет каждая «неинициализированная» переменная в REBOL (не в функциях, хотя локальные переменные функции инициализируются в #[none!]), а также результат таких выражений, как print 1, do [], () и т. Д.

Относительно «локальных переменных функции ... инициализированных #[none!]», я должен добавить, что только переменные, следующие за «неиспользованным уточнением» (т. Е. Та, которая не используется в реальном вызове) инициализируются в #[none!] вместе с уточняющей переменной.

Чтобы объяснить проблему далее, синтаксическая (диалект обмена данными) разница между true и #[true] состоит в том, что первое является словом,в то время как последнее является значением логики!тип.С семантической (до диалектной) точки зрения разница меньше, так как (глобальное) слово интерпретируется как переменная, которая ссылается на значение #[true].

2 голосов
/ 18 июня 2010

Похоже, это синтаксис построения значения для неустановленного экземпляра, в отличие от слова 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!

Похоже, что они зарезервировали синтаксис # [...] для большего количества таких конструкторов.

1 голос
/ 03 августа 2010

Посмотрите на приведенный ниже пример:

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!] является особенным, поскольку каждая неопределенная переменная действительно имеет это значение.

...