2014-11-21 2 views
4

Я просто наткнулся на этот синтаксис в Rebol построить несколько значений:Что цель # [типов данных] конструктора в Rebol

>> #[email! "[email protected]"] 
== [email protected] 

Это, кажется, что эквивалентно

>> to email! "[email protected]" 
== [email protected] 

и этот

>> #[string! "hello"] 
== "hello" 

Хотя эти ошибки из:

>> #[integer! 1] 
** Syntax Error: Invalid construct -- #[ 
** Near: (line 1) #[integer! 1] 
>> #[decimal! 1] 
** Syntax Error: Invalid construct -- #[ 
** Near: (line 1) #[decimal! 1] 
>> #[string! 1] 
== [string! 1] 

Интересно, для чего это? какие выгоды он приносит?

+0

Для тех, кому может быть интересно, см. Также '# <...>' предложение в [Curecode issue # 2188] (http://curecode.org/rebol3/ticket.rsp?id=2188) – HostileFork

ответ

4

Эта синтаксическая структура называется "construction syntax" (см. Также CureCode issue #1955). Его смысл заключается в том, чтобы разрешить литературные формы для значений, которые в противном случае не могли быть непосредственно представлены.

Существует два основных класса ситуаций, требующих синтаксиса построения.

  1. Значения, которые (кроме синтаксиса конструкции) не имеют отдельной лексической формы, но создаются только путем оценки.
  2. Значения с обычной литеральной формой, но где особое значение является «специальным», поскольку значение больше не может быть записано напрямую.

(1) Строительство Синтаксис для прямого значения Представление

Одним из ярких примеров этого класса является объектом !. Объекты Rebol обычно создаются с кодом, например make object! [a: 42]. Это не прямое литеральное представление результирующего значения объекта, а скорее код, который при оценке (на диалекте DO) создает ожидаемое значение объекта. Синтаксис конструкции позволяет прямое представление значения: #[object! [a: 42]].

Другие типичные примеры #[none!] и несколько нерегулярный (строительство-синтаксисом-накрест) #[true] и #[false] (обратите внимание на недостающую !). Обертывание головы вокруг разницы между, например, #[none!] и none приведут к более глубокому пониманию семантики Rebol (и, таким образом, она оставлена ​​в качестве упражнения для читателя).

(2) Строительство Синтаксис, как «Escape механизм»

Типичным примером в этом случае является обратный URL, например, значение, которое вы получаете от reverse http://stackoverflow.com. Если результирующее значение будет сериализовано как простой URL-адрес!, Сериализованные форма больше не будет синтаксически действительными:

>> /moc.wolfrevokcats//:ptth 
** Script error: // does not allow unset! for its value2 argument 

синтаксис Конструкция обеспечивает механизм выхода для этой ситуации:

>> #[url! "/moc.wolfrevokcats//:ptth"] = reverse http://stackoverflow.com/ 
== true 

Этот конкретный пример также указывает на проблемную ситуацию:

>> reverse http://stackoverflow.com/ 
== /moc.wolfrevokcats//:ptth 

Возможно, этот вывод (произведенный на основе mold) неверен: результат, как показано, не является допустимым лексическим представлением соответствия значение.

Есть несколько ошибок, отслеживающих конкретные экземпляры этого класса проблем (например, CureCode issue #2010 для URL!). Одно предложение на столе в направлении более общего решения состоит в том, чтобы в один из вариантов MOLD была встроена проверка «туда и обратно»: всякий раз, когда НАГРУЖЕНИЕ результата синтаксиса неконструкции MOLD приводит к значению, отличному от исходного значения, это MOLD вариант вернется к сериализации к синтаксису конструкции.

 Смежные вопросы

  • Нет связанных вопросов^_^