InteLib Lisp в обучении программированию на Лиспе

Андрей Викторович Столяров, Елена Игоревна Большакова, Наталья Валерьевна Баева

Обучение функциональному программированию: выбор языка

Изучение основ функционального программирования [1] чрезвычайно важно при обучении студентов программистских специальностей и является необходимой компонентой образования в области computer science. Функциональное программирование может изучаться на основе многих современных языков программирования (Scheme, OCaml, Haskell и т. п.). С нашей точки зрения, наиболее удобным для изучения основ функционального программирования является классический язык Лисп, позволяющий освоить основные приёмы функционального программирования, такие как рекурсия и функции высших порядков, а также гетерогенные структуры данных.

Перед преподавателями встаёт проблема выбора диалекта языка и системы программирования. Такие диалекты Лиспа, как Common Lisp [2], громоздки; в них включены, в числе прочих, и императивные конструкции, что провоцирует императивный стиль программирования и мешает освоению функциональных приёмов. Другие диалекты (например, MuLisp) не столь громоздки, однако сам факт использования при обучении заведомо устаревшего программного обеспечения создаёт у студентов ложное впечатление устарелости языка Лисп как такового.

С другой стороны, многие современные системы программирования на Лиспе для MS Windows слабо подходят для обучения Лиспу, поскольку отвлекают внимание студента на вопросы, связанные с синтезом пользовательского интерфейса (это отмечается, например, в статье [3]).

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

Практикум по языку программирования Лисп

Любой теоретический курс по программированию должен дополняться практикумом. На кафедре алгоритмических языков факультета ВМиК МГУ был разработан практикум по функциональному программированию на базе языков Рефал и Лисп.

Практикум на языке Лисп начинается с простых этюдов на программирование вспомогательных функций обработки списков. При их выполнении разрешается использование только базового алгоритмически полного набора функций (CONS, CAR, CDR, COND, ЕQ, ATOM, QUOTE, EVAL), четырёх арифметических функций и средства определения новых функций. Несмотря на минимальность набора допустимых встроенных функций, он позволяет освоить программирование разных видов рекурсии и функций высших порядков.

На следующих этапах обучения студенту предлагается на выбор решение более сложных задач, призванных продемонстрировать студентам практическую ценность языка Лисп. Среди предлагаемых вариантов заданий — различные виды символьной обработки, такие как преобразования формул математической логики или восстановление текста регулярной грамматики по заданному конечному автомату. При выполнении этих заданий допускается использование более широкого множества встроенных функций (всего около пятидесяти).

Таким образом, для проведения практикума желателен инструмент, позволяющий гибко настраивать используемый диалект Лиспа.

Пакет InteLib

Указанная гибкость может быть достигнута использованием пакета InteLib [4,5], изначально разработанного для интеграции различных парадигм программирования в рамках одного языка (C++). Развившийся в рамках проекта InteLib диалект Лиспа, названный InteLib Lisp, предназначался для использования в качестве дополнительного языка. Поэтому получившийся диалект не перегружен посторонними для традиционного Лиспа возможностями. Текущая версия пакета InteLib предоставляет около 150 встроенных Лисп-функций и включает в себя интерактивный интерпретатор языка InteLib Lisp.

Важно, что средствами пакета легко можно построить дополнительный интерпретатор, поддерживающий ограниченное множество встроенных функций Лиспа, например, минимально необходимое при выполнении простых этюдов на программирование.

Недостатком интерпретатора, реализованного в рамках пакета InteLib, является его сравнительно низкая эффективность по времени исполнения, но для учебных задач это не столь существенно. Вместе с тем, для студентов, желающих приобрести дополнительные навыки программирования, InteLib предоставляет как возможность дописывания дополнительных функций на C++ для их использования в Лисп-программе, так и возможность включения фрагментов на Лиспе в программы на C++, что дополнительно иллюстрирует практическую применимость Лиспа.

Указанные особенности пакета делают реализованный диалект Лиспа перспективным кандидатом на роль учебного диалекта.

Литература

  1. Field A. J. and Harrison P. G. Functional Programming//Addison-Wesley, Reading, Massachusets, 1988.

  1. Steele G. L., Jr. Common Lisp the Language//Digital Press, Burlington MA, second edition, 1990.

  1. Головин И. Г., Столяров А. В. Мультипарадигмальный подход к преподаванию программирования и роль свободного ПО//Тезисы докладов II конференции разработчиков свободных программ «на Протве», г. Обнинск, июль 2005. С. 114–120.

  1. Головин И. Г., Столяров А. В. Объектно-ориентированный подход к мультипарадигмальному программированию.//Вестник МГУ, сер. 15 (ВМиК), 2002. N 1. С. 46–50.

  1. Официальный сайт проекта InteLib. http://www.intelib.org