Использование шаблонов стандартных конструкций Лиспа

Для облегчения ввода конструкций Лиспа поддерживается аппарат шаблонов. Шаблон - это обычный текстовый файл в директории \Patt, с именем "pattern.patt". Этот текстовый файл содержит шаблоны всех конструкций (функций) HomeLisp-a, описанных в этом руководстве. Функции сгруппированы по типам, а в пределах типа отсортированы по алфавиту. Пользователь HomeLisp-а может добавлять свои шаблоны или менять существующие. Вставку шаблонов можно использовать как при работе в среде разработки, так и при написании функций-обработчиков событий в экранном дизайнере.

О г л а в л е н и е
  Вставка шаблонов функции при вводе S-выражений
  Создание своих шаблонов функций
Вставка шаблонов функции при вводе S-выражений  

Для вставки шаблона следует нажать кнопку 11 (для среды разработки) или кнопку 6 (для экранного дизайнера). В обоих случаях режим активизируется кнопкой с одной и той же иконкой:

Пользователю будет показана форма выбора шаблона:


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

После выбора группы функций, необходимо выбрать конкретную функцию из списка, расположенного на форме. При этом можно использовать средства поиска. Для этого следует ввести контекст поиска в поле ввода, заключенное в рамку "искать". Станут доступны две кнопки, расположенные правее поля ввода. Первая кнопка начинает поиск с начала группы функций, вторая - продолжает его.


Если галочка "Сохранить в буфере обмена" включена, то вставляемый текст сохраняется в буфере обмена Windows и может быть использован в дальнейшем. После нажатия кнопки OK шаблон вставляется в область ввода с текущего положения курсора.

Автор предлагает читателю рассмотреть аппарат шаблонов на конкретном примере: давайте составим функцию, которая будет брать на вход один аргумент целого типа, а возвращать атом Чет, если значение аргумента четно, и атом Нечет в противном случае.

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


Назовем нашу функцию ЧетНечет. Это имя вносим вместо слова "Атом" в конструкции DEFUN на приведенном выше рисунке. Поскольку список параметров нашей функции состоит из единственного аргумента, меняем первое слово "Список" на (x). Тело функции должно быть написано нами. Очевидно, что оно должно представлять собой вызов COND. Убираем второе слово "Список" и оставляем курсор под списком (x):

Вызываем режим Вставка шаблна, выбираем группу Функции классического ЛИСПа и находим функцию COND, и вставляем ее в область ввода так, как описано выше. При этом должно получиться следующее:

Первое условие предложения COND будет фиксировать четное значение аргумента, а устовие "по умолчанию" будет фиксировать нечетное значение аргумента. Заготовки остальных условий просто стираются. Все это на Лиспе реализуется так, как показано на нижеследующем рисунке:


Пользователь должен установить курсор после последней скобки и нажать Enter. Функция будет обработана ядром интерпретатора. В области ответа пользователь должен увидеть:



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



Автор надеется, что читатель вполне уяснил, как пользоваться стандартными шаблонами.

Создание собственных шаблонов функций  

Для добавления своих функций в файл "pattern.patt" нужно знать структуру этого файла. Структура проста: включаемые шаблоны группируются по типам функций (классический Лисп, работа с BLOB-ами, работа с файлами и т.д.).

Заголовок группы начинается двумя символами двоеточия. Остальная часть строки служит заголовком. Строки заголовка помещаются в выпадающий список групп функций. После заголовка группы в файл помещаются описания функций.

Описание функции состоит из заголовка и шаблона вызова функции. Заголовок описания функции содержит в первой позиции один символ двоеточия, далее располагается описание функции (наименование и краткая суть выполняемых лействий). Следует отметить, что строки, содержащие в первых позициях символы :# при обработке пропускаются. Они служат для зрительного выделения заголовков групп.

После заголовка описания идет шаблон вызова, который может занимать несколько строк. Далее идет описание следующей функции и т.д. Все это проще показать, чем описывать. Ниже приводится фрагмент файла "pattern.patt", описывающий функции работы с BLOB-ами.


:#############################################################
::Работа с BLOB-объектами
:#############################################################
:BIT2BLO Занести в BLOB битовую шкалу
(bit2blo  BLOB    // BLOB
          BITS    // битовая шкала
          FIXED   // с какой позиции заносить
          FIXED   // длина шкалы (1, 2, 3, 4 байтов)
)
:BLO2BIT Извлечь битовую шкалу из BLOBа 
(blo2bit  BLOB    // BLOB
          FIXED   // с какой позиции извлекать
          FIXED   // длина шкалы (1, 2, 3, 4 байтов)
)
:BLO2FIX Извлечь из BLOBа число типа FIXED 
(blo2fix    BLOB    // BLOB
            FIXED   // с какой позиции извлекать
            FIXED   // длина числа (1, 2, 3, 4 байтов)
)
:BLO2FLO Извлечь из BLOBа число типа FLOAT
(blo2flo    BLOB    // BLOB
            FIXED   // с какой позиции извлекать
            FIXED   // длина числа (4 или 8 байтов)
)

Из врезки видно, как устроен описываемый файл. Редактировать его можно любым редактором (кроме, естественно, Word-а!). Рекомендуется перед редактированием сделать резервную копию файла.