На главную Назад Вперёд

Введение в язык Scheme

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

Структура программы

Программа на языке Scheme представляет собой последовательность S-выражений. Вот пример простейшей программы:

(display "Привет")
(newline)
(display "Два плюс два равно ")
(display (+ 2 2))

Грубо говоря, S-выражение – это одно из двух:

В вышеприведённой программе литералами являются

display, "Привет", newline, "Два плюс два равно ", + и 2

Программа исполняется последовательно (сверху вниз) путём вычисления значений S-выражений. Разные S-выражения вычисляются по разным правилам:

Аппликативный порядок

Последовательность (F X1 X2 ... Xn) вычисляется в два этапа:

  1. В произвольном порядке вычисляются F, X1, X2, … Xn.

  2. Если в результате вычисления 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))

Обратите внимание на две вещи:

  1. Названия аргументов, использующиеся при определении этой операции (в вышеприведённом примере это x и y), видны только в рамках этого определения.

  2. В отличии от первой разновидности define, разновидность, определяющая операции, никаких вычислений в момент определения не производит.

Для пояснения второго пункта приведём пример

;; это комментарий, он не является полноценной частью программы

(define Вася (display "Вася"))   ; напечатает "Вася"

(define (Петя) (display "Петя")) ; ничего не напечатает

(Петя)                           ; напечатает "Петя"

Упражнения

  1. Операция mod (в некоторых реализациях modulo) вычисляет остаток: (mod x y) – остаток при делении x на y. Реализуйте операцию последняя-цифра, результатом которой является последняя цифра поданного ей на вход числа.
;
  1. Специальная форма if имеет три входа: выглядит она так (if C A B). Она вычисляет сперва C. Если C оказывается равным специальному значению #f (расшифровывается “false”, т.е. “ложно”), то результатом является результат вычисления B. В противном случае вычисляется A. Реализуйте операцию абсолютная-величина, вычисляющую абсолютную величину числа. Операции “больше” и “меньше” записываются как > и <.
;
  1. Обычно истинные высказывания (например (> 3 1)) имеют значение #t, хотя любое значение, отличное от #f, трактуется как истина. Реализуйте операции не, и, или, вычисляющие, соответственно, логические отрицание, конъюнкцию и дизъюнкцию.
;

Краткая сводка

В этой главе были определены следующие термины:

Также были рассмотрены следующие специальные формы:

Полезно помнить следующие операции:

@ 2016 arbrk1, all rights reversed