Node:Особые вычисления, Previous:Вычисление процедур, Up:Вычисления

[Показать/скрыть оригинал] [Показать/скрыть перевод] [Переключить перевод и оригинал]


14.3.1.4 Evaluating Special Syntactic Expressions
14.3.1.4 Вычисление специальных синтаксических выражений

When a procedure invocation expression is evaluated, the procedure and all the argument expressions must be evaluated before the procedure can be invoked. Special syntactic expressions are special because they are able to manipulate their arguments in an unevaluated form, and can choose whether to evaluate any or all of the argument expressions.

Когда вычисляется выражение с вызовом процедуры, сама процедура и все её аргументы должны быть вычесленны до момента вызова. Специальные синтаксические выражения называются специальными, потому что позволяют манипулировать своими аргументами без вычисления, и самостоятельно указывать какие именно аргументы следует вычислять.

Why is this needed? Consider a program fragment that asks the user whether or not to delete a file, and then deletes the file if the user answers yes.

Зачем это нужно? Рассмотрим участок программы, который спрашивает пользователя, удалять ли файл, и в случае положительного ответа удаляет его.

(if (string=? (read-answer "Should I delete this file?")
              "yes")
    (delete-file file))

If the outermost (if ...) expression here was a procedure invocation expression, the expression (delete-file file), whose side effect is to actually delete a file, would already have been evaluated before the if procedure even got invoked! Clearly this is no use -- the whole point of an if expression is that the consequent expression is only evaluated if the condition of the if expression is "true".

Если код внешнего выражения (if ...) был бы вызовом процедуры, выражение (delete-file file), чей сторонний эффект выражается в удалении файла (!), будет вычесленно (и выполненно!) до того, как будет проивзедена проверка ответа пользователя в if! Очевидно, что такое поведение if категорически бесполезно, ведь основное его назначение, вычислять последующее (consequent) выражение только в случае, если оказалось истиным (true) выражение в условии.

Therefore if must be special syntax, not a procedure. Other special syntaxes that we have already met are define, set! and lambda. define and set! are syntax because they need to know the variable name that is given as the first argument in a define or set! expression, not that variable's value. lambda is syntax because it does not immediately evaluate the expressions that define the procedure body; instead it creates a procedure object that incorporates these expressions so that they can be evaluated in the future, when that procedure is invoked.

Потому if имеет особый синтаксис и не является процедурой. Помимо if к специальному синтаксису относятся ранее объяснённые define, set!, lambda. Define и set! относятся к специальным, потому что должны принимать первый параметр в качестве имени переменной, а не хранящегося в этой переменной значения. Labda относится к специальному синтаксису потому, что не производит вычисления выражения в теле процедуры, а создаёт специальный объект, включающий в себя выражения из тела процедуры, так чтобы они могли быть вычисленны в момент вызова процедуры в дальнейшем.

The rules for evaluating each special syntactic expression are specified individually for each special syntax. For a summary of standard special syntax, see See Syntax Summary.

Правила для вычисления каждого специального синтаксического выражения задаются раздельно. Для списка специальных синтаксических выражений см. Краткое описание синтаксиса.


> > далее > >