Х. Абельсон, Дж. Дж. Сассман, Дж. Сассман - Структура и интерпретация компьютерных программ (1108516), страница 31
Текст из файла (страница 31)
Это образование должно было отличаться и от узкогообразования коммерческих школ. По словам Роджерса:Повсеместно проводимое разделение между практическим и научным работником совершеннобесполезно, и весь опыт нашего времени показывает его полную несостоятельность.Роджерс был президентом MIT до 1870 года, когда он ушел в отставку по состоянию здоровья. В 1878году второй президент MIT Джон Ранкл оставил свой пост из-за финансового кризиса, вызванного биржевойпаникой 1873 года, и напряженной борьбы с попытками Гарварда поглотить MIT.
Роджерс вернулся и оставалсяна посту президента до 1881 года.Роджерс умер от приступа во время своей речи перед студентами MIT на выпускной церемонии 1882 года.В речи, посвященной его памяти и произнесенной в том же году, Ранкл приводит последние его слова:«Стоя здесь и видя, чем стал Институт, . .
. я вспоминаю о начале научных исследований. Явспоминаю, как сто пятьдесят лет назад Стивен Хейлс опубликовал статью на тему о светящемсягазе, где он утверждал, что его исследования показали, что 128 гран битумного угля. . . »«Битумный уголь» — были его последние слова в этом мире. Он склонился вперед, как будтосправляясь со своими заметками, которые лежали перед ним на столе, затем медленно выпрямился, поднял руки, и был перенесен со сцены своих земных забот и триумфов в «завтра смерти»,где решены тайны жизни, и бестелесный дух находит неизмеримое наслаждение в созерцанииновых и по-прежнему необъяснимых загадок бесконечного будущего.По словам Фрэнсиса А.
Уокера (третьего президента MIT):Всю свою жизнь он провел с огромной верой и героизмом, и умер так, как, наверное, и долженбыл желать столь превосходный рыцарь, в полном вооружении, на своем посту, и во времясамого акта исполнения общественных обязанностей.Глава 2. Построение абстракций с помощью данных134...........................................................................................................................................................................................................
...................................................................................................................... ........................... ...................... .......... .......... ....... ............................................................................ ............... .................. ........ ..... ....................... .......................................................................................................
................ ............................. ............... ................................................................................................................................................................. ............. .. ............................................................................. ......................................................................................................... ............... ...............
......................... ............................. . .......... ......................... ............ ....... .................. ........... .......... .... .... ....... ............ .... ...... ...................... ...... ............. ........ ..... ............................................................. ................. ........... .................... ....................... .............. ................................................................... ................ ............. ..
......................................................................................................... ................ .................................................. .. .............. ........... ........................................... .................................... ... ........................ ................ .... ............ .......
............ ......................... ... ..... ..... .......... ..... ... ................. ... ... ........... ........ ....... ... ........ ..... .... .................. ..... ... ......... ... .......... ......... .................. ........................ .... ................................................. .......................................................................................................................................................................................................
...................................................................................... .................... ................................................ .................... .................................. ............................................................................ ............................ ...........................................................................................................................
............. ... ...................................Рис. 2.10. Изображения, порожденные рисовалкой wave по отношению к четырем различным рамкам. Рамки, показанные пунктиром, не являются частью изображений.торая рисует изображение первой рисовалки в левой половине рамки, а изображениевторой рисовалки в правой половине рамки. Подобным образом, below принимает дверисовалки и порождает составную рисовалку, рисующую изображение первого аргументапод изображением второго аргумента. Некоторые операции преобразуют одну рисовалку и получают другую.
Например, flip-vert получает рисовалку и порождает новую,рисующую изображение вверх ногами, а flip-horiz порождает рисовалку, рисующуюизображение исходной в зеркальном отображении.На картинке 2.12 показан результат работы рисовалки, называемой wave4, которыйстроится в два этапа, начиная с wave:(define wave2 (beside wave (flip-vert wave)))(define wave4 (below wave2 wave2))Строя таким образом составные рисовалки, мы используем тот факт, что рисовалкизамкнуты относительно средств комбинирования нашего языка. Beside или below отдвух рисовалок само является рисовалкой; следовательно, мы можем ее использоватькак элемент при построении еще более сложных рисовалок.
Так же, как при построении2.2. Иерархические данные и свойство замыкания135Рис. 2.11. Изображения Уильяма Бартона Роджерса, основателя и первого президентаMIT, нарисованные по отношению к тем же четырем рамкам, что и на рисунке 2.10(первоначальное изображение печатается с разрешения музея MIT).136Глава 2. Построение абстракций с помощью данных(define wave2(beside wave (flip-vert wave)))(define wave4(below wave2 wave2))Рис. 2.12. Построение составного изображения, начиная с рисовалки wave с рисунка 2.10списковых структур с помощью cons, замкнутость наших данных относительно средствкомбинирования служит основой способности строить сложные структуры при помощивсего лишь нескольких операций.Раз мы можем комбинировать рисовалки, нам хотелось бы уметь выделять типичныесхемы их комбинирования.
Операции над рисовалками мы реализуем как процедурыязыка Scheme. Это означает, что нам в языке изображений не требуется специальногомеханизма абстракции: поскольку средства комбинирования являются обычными процедурами Scheme, у нас автоматически есть право делать с операциями над рисовалкамивсе то, что мы можем делать с процедурами. Например, схему построения wave4 мыможем абстрагировать в виде(define (flipped-pairs painter)(let ((painter2 (beside painter (flip-vert painter))))(below painter2 painter2)))и определить wave4 как пример применения этой схемы:(define wave4 (flipped-pairs wave))Мы можем определять и рекурсивные операции. Вот пример, который заставляетрисовалки делиться и ветвиться направо, как показано на рисунках 2.13 и 2.14:(define (right-split painter n)(if (= n 0)painter(let ((smaller (right-split painter (- n 1))))(beside painter (below smaller smaller)))))2.2.
Иерархические данные и свойство замыканияright-splitn-1identityright-splitn-1right-split nupsplitn-1137upsplitn-1identitycorner-splitn-1right-splitn-1right-splitn-1corner-split nРис. 2.13. Рекурсивные планы для right-split и corner-split.Можно порождать сбалансированные узоры, наращивая их не только направо, но и вверх(см. упражнение 2.44 и рисунки 2.13 и 2.14):(define (corner-split painter n)(if (= n 0)painter(let ((up (up-split painter (- n 1)))(right (right-split painter (- n 1))))(let ((top-left (beside up up))(bottom-right (below right right))(corner (corner-split painter (- n 1))))(beside (below painter top-left)(below bottom-right corner))))))Соответствующим образом расположив четыре копии corner-split, мы получаем схему под названием square-limit, применение которой к wave и rogers показано нарисунке 2.9:(define (square-limit painter n)(let ((quarter (corner-split painter n)))(let ((half (beside (flip-horiz quarter) quarter)))(below (flip-vert half) half))))Упражнение 2.44.Определите процедуру up-split, которую использует corner-split.
Она подобна rightsplit, но только меняет местами роли below и beside.Операции высших порядковВ дополнение к абстрагированию схем комбинирования рисовалок, мы можем работать и на более высоком уровне, абстрагируя схемы комбинирования операций надрисовалками. А именно, мы можем рассматривать операции над рисовалками в качествеэлементов, подлежащих манипуляции, и писать средства комбинирования этих элементов — операции, которые принимают операции над рисовалками как аргументы и создаютновые операции.138Глава 2. Построение абстракций с помощью данных(right-split wave 4)(right-split rogers 4)(corner-split wave 4)(corner-split rogers 4)Рис. 2.14.