Понимание взаимосвязи между печатью и символами в блоках

Сценарий 1:

red>> sizes: [small medium large]
== [small medium large]
red>> print sizes
*** Script error: small has no value
*** Where: print

Сценарий 2:

red>> print first sizes
small

Я ожидал, что сценарии 1 и 2 будут иметь одинаковое поведение (либо ошибка при оценке, либо будет рассматриваться как символ).

Я пытаюсь понять, относится ли следующий сценарий к print или концепция Red/Rebol, которую я должен понять.

Я понимаю, что все слова в блоке обрабатываются как символы, и для их оценки требуется функция (при необходимости). Так что сценарий 1 имеет смысл. Но если мы извлечем слово из блока (используя first) это остается символом?

3 ответа

Решение

Хороший вопрос!

Я пытаюсь понять, является ли следующий сценарий специфичным для печати или концепция Red/Rebol, которую я должен понять.

Ответ "оба". Основная концепция Red/Rebol, которую нужно понять, заключается в том, что вы можете определить поведение функций для отправки с помощью своего рода полиморфизма на основе типа, который был передан. И PRINT, как написано в данный момент, интерпретирует блок! параметр как своего рода "печатный диалект"... который он оценивает перед печатью. Если вам удастся подсунуть это слово! значение, он напечатает написание этого слова.

Вам удалось подсунуть слово! как значение, не оценивая его, выбирая его из блока, так что это был результат функции. Оценщик делает только один шаг на каждом проходе, поэтому после запуска FIRST он не считает своей задачей его поиск... возвращенное СЛОВО! это данные, а не код:

red>> sizes: [small medium large]
red>> print first sizes
small

Вы могли бы сделать это и с помощью буквального слова, которое на этом единственном этапе превращается в СЛОВО в поведение оценщика! и (опять же) идти не дальше:

red>> print 'small
small

Это также может быть результатом функции QUOTE, которая является "особенной", потому что она цитирует свой аргумент (см. help quote для спецификации, и этот очень интересный лакомый кусочек о двух разных "видах цитирования параметров"... тонкое, но изящное различие)

red>> print quote small
small

Но цитирование параметров является исключением, а не нормой. Поэтому обычно, если вы видите что-то вроде SMALL без кавычек и неблокированных в такой последовательности... вы ожидаете, что оценщик увидит это, отыщет и задохнется, если не сможет его найти:

red>> print small
*** Script error: small has no value

Потому что решение PRINT принимает, когда оно передается БЛОК! чтобы оценить этот блок и объединить результаты оценки, когда вы пишете:

red>> sizes: [small medium large]
red>> print sizes
*** Script error: small has no value

... поскольку PRINT не заключает в кавычки свой параметр, оценка делает его фактически эквивалентным, если бы вы написали:

red>> print [small medium large]
*** Script error: small has no value

PRINT видит блок и для верхнего уровня этого блока предполагает, что вы хотите оценить то, что может быть оценено в дальнейшем. (Строковые литералы, например, находятся в конце пути оценки, и оценка их не допускается). Если оставить в стороне пробелы и переводы строк, это немного похоже на то, что вы набрали:

red>> print small
*** Script error: small has no value

red>> print medium
*** Script error: medium has no value

red>> print large
*** Script error: large has no value

(За исключением того, что останавливается на первой ошибке, конечно.)

Что возвращает нас к вопросу о том, является ли "следующий сценарий специфичным для печати". Именно так PRINT выбирает интерпретацию параметра блока. Вы можете представить себе что-то, похожее на PRINT, которое не будет оцениваться, если что-то не будет в PAREN! блокировать или иметь любое другое поведение, которое вы хотели... что является ключом к "диалекту". (Текущий PRINT несколько упрощен по сравнению с альтернативными предложениями, и простая вещь, которую он делает, эффективно СОКРАЩАЕТ блок, который ему дан).

Но принятие PRINT как-это те же самые шаги, которые работают вне блока, чтобы обмануть оценщика. Вот три разных способа:

red>> print ['small quote medium third [small medium large]]
small medium large

(Быстрый плагин: многие другие вариации на эту тему возможны и сегодня на практике в Ren Garden. Это не новый оценщик, но у него новая ПЕЧАТЬ... и это верхушка айсберга...)

Ваше понимание верно, и поведение в этих двух сценариях printили, в частности, reduce (reduce альтернативный метод оценкиdo). print по сути, это трехступенчатый процесс: reduce, form, затем отправьте полученную строку system/ports/output,

>> message: "Hello"
== "Hello"

Сокращает message:

>> reduce message
== "Hello"

Уменьшает блок:

>> reduce [message]
== ["Hello"]

Сокращает 'message (оценивает к слову message):

>> reduce 'message
== message

Сокращает first [message] (оценивает к слову message):

>> reduce first [message]
== message

В вашем сценарии вы можете избежать оценки, подавив сокращение блока:

>> reduce form [small medium large]
== "small medium large"

>> print form [small medium large]
small medium large

Если вы хотите напечатать блок строк, которые не были определены, лучше использовать эти "{}" скобки. Функции печати / печати распечатывают его без оценки.

Например, Prin {маленький большой большой}

Другие вопросы по тегам