24
Глава 1. Построение абстракций с помощ ью процедур
щество пользователей Лиспа традиционно отвергало попытки провозгласить какое-либо
«официальное» описание языка. Вместе с гибкостью и изяществом первоначального за-
мысла такая эволюция позволила Лиспу, который сейчас по возрасту второй из широко
используемых языков (старше только Фортран), непрерывно адаптироваться и вбирать в
себя наиболее современные идеи о проектировании программ. Таким образом, сегодня
Лисп представляет собой семью диалектов, которые, хотя и разделяют большую часть
изначальных свойств, могут существен ным образом друг от друга отличаться. Тот диа-
лект, которым мы пол ьзуемся в этой книге, называется Scheme (Схема)
2
.
Из-за своего экспериментального характера и внимания к символьной обработке пер-
вое время Л исп был весьма неэффективен при решении вычислительных задач, по край-
ней мере по сравнению с Фортраном. Однако за прошедшие годы были разработаны
компиляторы Лиспа, которые переводят программы в машинный код, способный произ-
водить численные вычисления с разумной эффективностью. А для специализированных
приложений Лисп удавалось использовать весьма эффективно
3
. Хотя Лисп и не пре-
одолел пока свою старую репутацию безнадежно медленного языка, в наше время он
используется во многих приложениях, где эффективность не является главной заботой.
Напри мер, Лисп стал л юбимым языком для оболочек операционных систем, а также в ка-
честве языка расшир ения для редакторов и систем автоматизированного проектирования.
Но коль скоро Лисп не похож на типичн ые языки, почему же мы тогда используем его
как основу для нашего разговора о программировании? Потому что это т язык обладает
уникальными свойствами, которые делают его замечательным средством для изучения
важнейших конструкций программирования и с труктур данных, а также для соотнесения
их с деталями языка, которые их поддерживают. Самое существенное из этих свойств —
то, что лисповские описания процессов, называемые процедурами (procedures), сами по
себе могут представляться и обрабатываться как данные Лиспа. Важность этого в том,
что существуют мощные методы проектирования программ, которые опираются на воз-
можность сгладить традиционное различение «пассивных» данных и «активных» процес-
сов. Как мы обнаружим, способность Лиспа рассматривать процедуры в качестве данных
делает его одним из самых удобных языков для исследования этих методов. Способность
2
Большинство крупных Лисп-программ 1970х, были написаны на одном из двух диалектов: MacLisp (Moon
1978; Pitman 1983) , разработанный в рамках проекта MAC в MIT, и InterLisp (Teitelman 1 974), разработан-
ный в компании «Болт, Беранек и Ньюман» и в Исследовательском центре компании Xerox в Пало Альто.
Диалект Portable Standard Lisp (Переносимый Стандартный Лисп, Hearn 1969; Griss 1981) был спроектирован
так, чтобы его легко было переносить на разные машины. MacLisp породил несколько поддиалектов, например
Franz Lisp, разработанный в Калифорнийском университете в Беркли, и Zetalisp (Moon 1981), который осно-
вывался на специализированном процессоре, спроектированном в лаборатории Искусственного Интеллекта в
MIT для наиболее эффективного выполнения программ на Лиспе. Диалект Лиспа, используемый в этой книге,
называется Scheme (Steele 1975). Он был изобретен в 1975 году Гаем Льюисом Стилом мл. и Джеральдом
Джеем Сассманом в лаборатории Искусственного Интеллекта MIT, а затем заново реализован для использо-
вания в учебных целях в MIT. Scheme стала стандартом IEEE в 1990 году (IEEE 1900). Диалект Common Lisp
(Steele 1982; Steele 1990) был специально разработан Лисп-сообществом так, чтобы сочетать свойства более
ранних диалектов Лиспа и стать промышленным стандартом Лиспа. Common Lisp стал стандартом ANSI в
1994 году (ANSI 1994).
3
Одним из таких приложений был пионерский эксперимент, имевший научное значение — интегрирование
движения Солнечной системы, которое превосходило по точности предыдущие резул ьтаты примерно на два
порядка и продемонстрировало, что динамика Солнечной системы хаотична. Это вычисление стало возможным
благодаря новым алгоритмам интегрирования, специализированному компилятору и специализированному ком-
пьютеру; причем все они были реализованы с помощью программных средств, написанных на Лиспе (Abelson
et al. 1992; Sussman and Wisdom 1992).