При изучении этой и последующих глав настоятельно рекомендуется вбивать приведённый здесь код в интерпретатор языка и смотреть, к чему это приводит.
Программа на языке Scheme представляет собой последовательность S-выражений. Вот пример простейшей программы:
(display "Привет")
(newline)
(display "Два плюс два равно ")
(display (+ 2 2))
Грубо говоря, S-выражение – это одно из двух:
В вышеприведённой программе литералами являются
display, "Привет", newline, "Два плюс два равно ", + и 2
Программа исполняется последовательно (сверху вниз) путём вычисления значений S-выражений. Разные S-выражения вычисляются по разным правилам:
display
, newline
, +
) преобразуются в объекты, определяемые этими словами;Последовательность (F X1 X2 ... Xn)
вычисляется в два этапа:
В произвольном порядке вычисляются F
, X1
, X2
, … Xn
.
Если в результате вычисления F
получилась некоторая операция, она применяется к X1
, X2
, … Xn
, результат её становится результатом вычисления всего выражения. В противном случае происходит ошибка.
Например, слово display
при вычислении преобразуется в операцию “вывода на экран” (или, как ещё говорят, операцию “печати”). Запустите следующую программу в интерпретаторе и вдумчиво осознайте, почему результат именно такой:
(display display) (newline)
(display +) (newline)
(display 2) (newline)
(display (display 2)) (newline)
Последняя строчка требует особого комментария. Результат вычисления (display 2)
– это совсем не 2, а некоторое “бессмысленное” значение, зависящее от конкретной реализации языка. Операцию display
применяют не ради значения, а ради т.н. “стороннего эффекта”: в процессе её вычисления аргумент операции display
оказывается напечатан. Если бы ни одна операция не имела сторонних эффектов, невозможно было бы взаимодействовать со “внешним миром”, к которому, в том числе, относится и пользователь программы, желающий получить от неё какой-то осязаемый результат.
Некоторые S-выражения имеют специальные правила вычисления, связанные с ними. Например, в программе
(define один 1)
(display (+ один один один))
порядок вычисления первой строчки явно не аппликативный (почему?).
S-выражения, которые вычисляются не в аппликативном порядке, носят название специальные формы. “Специальность” полностью определяется первым словом в S-выражении. В языке Scheme довольно мало специальных форм, и изучать мы их будем по очереди.
Одна из основных специальных форм – define
-форма. Она позволяет привязать к слову некоторый объект. Например:
(define плюс +)
(define фраза "Два плюс два равно: ")
(display фраза)
(display (плюс 2 2))
Обратите внимание на то, что подтекст "плюс"
текста "Два плюс два равно: "
вообще никакого отношения к слову плюс
не имеет.
Также define
позволяет определить новую операцию и привязать её к слову:
(define (плюс x y) (+ x y))
(display (плюс 1 2))
Обратите внимание на две вещи:
Названия аргументов, использующиеся при определении этой операции (в вышеприведённом примере это x
и y
), видны только в рамках этого определения.
В отличии от первой разновидности define
, разновидность, определяющая операции, никаких вычислений в момент определения не производит.
Для пояснения второго пункта приведём пример
;; это комментарий, он не является полноценной частью программы
(define Вася (display "Вася")) ; напечатает "Вася"
(define (Петя) (display "Петя")) ; ничего не напечатает
(Петя) ; напечатает "Петя"
mod
(в некоторых реализациях modulo
) вычисляет остаток: (mod x y)
– остаток при делении x
на y
. Реализуйте операцию последняя-цифра
, результатом которой является последняя цифра поданного ей на вход числа.if
имеет три входа: выглядит она так (if C A B)
. Она вычисляет сперва C
. Если C
оказывается равным специальному значению #f
(расшифровывается “false”, т.е. “ложно”), то результатом является результат вычисления B
. В противном случае вычисляется A
. Реализуйте операцию абсолютная-величина
, вычисляющую абсолютную величину числа. Операции “больше” и “меньше” записываются как >
и <
.(> 3 1)
) имеют значение #t
, хотя любое значение, отличное от #f
, трактуется как истина. Реализуйте операции не
, и
, или
, вычисляющие, соответственно, логические отрицание, конъюнкцию и дизъюнкцию.В этой главе были определены следующие термины:
Также были рассмотрены следующие специальные формы:
define
– определение констант и операцийif
– ветвлениеПолезно помнить следующие операции:
арифметические: +
, -
, *
, /
, mod
(или modulo
)
сравнение чисел: >
, <
, >=
, <=
, =
печать: display
, newline
@ 2016 arbrk1, all rights reversed