При изучении этой и последующих глав настоятельно рекомендуется вбивать приведённый здесь код в интерпретатор языка и смотреть, к чему это приводит.
Программа на языке 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