Что это за синтаксис # [] в REBOL?

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

#[unset!]

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

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


person Gregory Higley    schedule 18.06.2010    source источник


Ответы (4)


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

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

person HostileFork says dont trust SE    schedule 18.06.2010
comment
Кстати, ознакомьтесь с некоторыми из моих безумных соревнований Rebol-vs-Perl в Code Golf. :) stackoverflow.com/questions/2527477 / - person HostileFork says dont trust SE; 18.06.2010
comment
Становится легче, но вот один, который я сделал вчера вечером перед тем соединением точки, от которого я выгорел и не хотел продвигаться вперед до точки победы ... конечно, это можно улучшить, если вы хотите поиграть: ) stackoverflow.com/questions/3034331/code-golf -вращающийся-лабиринт / - person HostileFork says dont trust SE; 18.06.2010

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

person Gregg Irwin    schedule 21.06.2010

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

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

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

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

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

person endo64    schedule 03.08.2010