Почему Rebol 3 не учитывает параметры функции в кавычках, которые заключены в скобки?

Диалект DO использует серию категории PAREN! для приоритета, и обычно выкипает базовую структуру скобок до вызова функции.

Однако в Rebol 2 раньше можно было указать в определении функции, что вы хотите, чтобы она подавляла вычисление скобок на месте вызова. Вы сделали это с помощью апострофной метки "буквальное слово" на параметре:

evaluated: func [param] [probe param]

non-evaluated: func ['param] [probe param]

>> evaluated (1 + 2)
3

>> non-evaluated (1 + 2)
(1 + 2)

Так что вы получите серию! тип категории, класса PAREN!... в данном случае с тремя символическими элементами внутри: 1, +, 2, Это не работает в Rebol 3:

>> non-evaluated (1 + 2)
3

Это ошибка или целеустремленное дизайнерское решение? Есть ли обходной путь? Обратите внимание, что размещение оператора цитирования на месте вызова не будет работать, потому что тогда это символическое слово quote что цитируется, а потом парен! оценивается самостоятельно, чтобы стать окончательным значением выражения:-/

>> non-evaluated quote (1 + 2)
quote
== 3

1 ответ

Решение

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

quote: make function! [[
    "Returns the value passed to it without evaluation."
    :value [any-type!]
][
    :value
]]

Это снова улучшение по сравнению с R2, где такая функция на самом деле не ведет себя точно так же.

И в случае, если вы действительно хотите передать парен! к вашей функции, не желая изменять ее определение для использования "действительно неоцененной передачи аргументов", вы можете попробовать это:

non-evaluated (quote (1 + 2))
Другие вопросы по тегам