Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[110]

(define (quoted? exp)

(tagged-list? exp quote))

(define (text-of-quotation exp) (cadr exp))

Quoted? определена посредством процедуры tagged-list?, которая распознает списки, начинающиеся с указанного символа:9

(define (tagged-list? exp tag) (if (pair? exp)

(eq? (car exp) tag)

false))

•Присваивания имеют форму (set! (переменная) (выражение)):

(define (assignment? exp) (tagged-list? exp set!))

(define (assignment-variable exp) (cadr exp))

(define (assignment-value exp) (caddr exp))

•Определения имеют вид (define (переменная) (значение)) или

(define ((переменная) (параметру) ... (параметрп)) (тело))

Вторая форма (стандартное определение процедуры) является синтаксическим сахаром для

(define (переменная)

(lambda ((параметру) ... (параметрп)) (тело)))

Соответствующие синтаксические процедуры выглядят так:

(define (definition? exp) (tagged-list? exp define))

(define (definition-variable exp) (if (symbol? (cadr exp)) (cadr exp) (caadr exp)))

(define (definition-value exp) (if (symbol? (cadr exp)) (caddr exp)

(make-lambda (cdadr exp)

(cddr exp))))

9В разделе 2.3.1 упоминается, что интерпретатор рассматривает закавыченное выражение как список, начинающийся с quote, даже если выражение напечатано через знак кавычки. Например, выражение а будет выглядеть для интерпретатора как (quote a). См. упражнение 2.55.


•Lambda-выражения являются списками, которые начинаются с символа lambda:

(define (lambda? exp) (tagged-list? exp lambda)) (define (lambda-parameters exp) (cadr exp)) (define (lambda-body exp) (cddr exp))

Мы приводим также конструктор для lambda-выражений. Он используется в вышеприведенной процедуре definition-value:

(define (make-lambda parameters body) (cons lambda (cons parameters body)))

•Условные выражения начинаются с if и имеют предикат, следствие и (необязательную) альтернативу. Если в выражении нет части-альтернативы, мы указываем в ее качестве false.10

(define(if? exp) (tagged-list? exp if))

(define(if-predicate exp) (cadr exp))

(define(if-consequent exp) (caddr exp))

(define(if-alternative exp)

(if (not (null? (cdddr exp)))

(cadddr exp)

false))

Мы предоставляем также конструктор для if-выражений. Его будет использовать процедура cond->if для преобразования выражений cond в выражения

if:

(define (make-if predicate consequent alternative) (list if predicate consequent alternative))

•Begin упаковывает последовательность выражений в одно выражение. В синтаксические операции над выражениями begin мы включаем извлечение самой последовательности из выражения begin, а также селекторы, которые возвращают первое выражение и остаток выражений в последовательности. 11

(define (begin? exp) (tagged-list? exp begin))

(define (begin-actions exp) (cdr exp))

(define (last-exp? seq) (null? (cdr seq)))

10Значение выражения if в случае, когда предикат ложен, а альтернатива отсутствует, в Scheme не определено; здесь мы решили сделать его ложным. Мы будем поддерживать переменные true и false в выполняемых выражениях путем связывания их в глобальном окружении. См. раздел 4.1.4.

"Эти селекторы для списка выражений, а также соответствующие им селекторы для списка операндов, не предназначаются для абстракции данных. Они введены в качестве мнемонических имен для основных списковых операций, чтобы легче было понимать вычислитель с явным управлением из раздела 5.4.


(define (first-exp seq) (car seq)) (define (rest-exps seq) (cdr seq))

Кроме того, мы даем конструктор sequence->exp (для использования в процедуре cond->if), который преобразует последовательность в единое выражение, используя, если надо, begin:

(define (sequence->exp seq) (cond ((null? seq) seq)

((last-exp? seq) (first-exp seq)) (else (make-begin seq))))

(define (make-begin seq) (cons begin seq))

• Вызов процедуры - это любое составное выражение, не попадающее ни в один из перечисленных типов. Его car - это оператор, а cdr - список операндов:

(define (application? exp) (pair? exp)) (define (operator exp) (car exp)) (define (operands exp) (cdr exp)) (define (no-operands? ops) (null? ops)) (define (first-operand ops) (car ops)) (define (rest-operands ops) (cdr ops))

Производные выражения

Некоторые особые формы языка можно определить через выражения, включающие другие особые формы, вместо того, чтобы задавать их напрямую. Как пример рассмотрим cond, который можно реализовать как гнездо выражений if . Например, задачу вычисления выражения

(cond ((> x 0) x)

((= x 0) (display zero) 0)

(else (- x)))

можно свести к задаче вычисления следующего выражения, состоящего из форм if и begin:

(if (> x 0)

x

(if (= x 0)

(begin (display zero)

0)

(- x)))



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196]