Скачиваний:
8
Добавлен:
01.05.2014
Размер:
10.73 Кб
Скачать

Шаг 29. Среда программирования muLISP81     На этом шаге мы рассмотрим порядок создания программ в muLISP81. Эти сведения будут полезны при создании программ в более поздних версиях.

Этап кодирования и выполнения

Этап тестирования

Этап трансляции

    Расмотрим наиболее важные составные части среды программирования muLISP81 в порядке их использования на этапах разработки программы.     Этап кодирования и выполнения.     Текст программы сначала помещается в файл с помощью текстового редактора.     При вводе выражения в систему muLISP81 пустые строки и пробелы игнорируются. Пробел употребляется, когда необходимо отделить аргументы функции, причем вместо единичного пробела всегда может быть использовано несколько пробелов.     В текст программы можно включать комментарии, которые заключаются в символы %. Например: % Это комментарий... % Интерпретатор загружается из операционной системы MS-DOS командой C:\>LISP После этого на экране дисплея вы увидете следующее: muLISP-80 2.12 (07/09/81) Copyright (C) 1981 MICROSOFT Licensed from The SOFT WAREHOUSE $     Символ "$" - это так называемое приглашение, при помощи которого интерпретатор дает знать, что он выполнил вычисление значения предыдущего выражения и ждет нового выражения.     После символа приглашения "$" вы можете обратиться к следующим функциям muLISP81 (таблица 1): Таблица 1. Функции muLISP81 Функция Назначение (RDS FILENAME EXT) Загружает в память компьютера программу, хранящуюся в файле FILENAME.EXT. (SAVE FILENAME) Сохраняет в файле FILENAME.SYS текущее состояние памяти (рабочую обстановку). (LOAD FILENAME) Восстанавливает из файла записанную до этого на диск рабочую обстановку (функции и переменные) из файла FILENAME.SYS. То же можно сделать в командной строке: C:\>LISP FILENAME. (SYSTEM) Возвращение в операционную систему.     Если определения функций были синтаксически верны и сообщения об ошибке не последовало, то можно начать тестирование их работы.     Этап тестирования.     Для тестирования программ в систему muLISP81 включена функция TRACE. С помощью трассировки вы можете отследить вычисление тестируемой функции (или функций) с целью локализации и исправления ошибок. Если некоторая функция помечается как трассируемая, то система информирует об имени функции и значениях аргументов каждый раз при входе в функцию и соответственно выводит значение функции, как только оно вычислено.     Трассировка включается с помощью вызова: $ (TRACE) NIL Далее, пометим нужные нам функции как "трассируемые": (TRACE Имена_трассируемых_функций) Имена трассируемых функций разделяются пробелами. Например: $ (TRACE PLUS1 PLUS2) NIL После этого интерпретатор трассирует вычисление функций PLUS1 и PLUS2.     Трассировку можно отменить директивой UNTRACE: $ (UNTRACE PLUS1) Найденные ошибки исправляются в текстовом редакторе.     Приведем исходные тексты функций TRACE и UNTRACE. % File: TRACE.LIB (c) 06/26/80 The Soft Warehouse % % Аргументами функции TRACE являются имена функций, кото- рые мы хотим трассировать. Трассировка содержит имена вы- зываемых функций и аргументов и возвращаемое значение после вычислений. Трассируются только функции, определен- ные с помощью LAMBDA и NLAMBDA % (PROG1 "" (PUTD DEFUN (QUOTE (NLAMBDA (FUNC DEF) (PUTD FUNC DEF) FUNC ))) ) % --------------------------------------------------- % (DEFUN TRACE (LAMBDA LST (SETQ INDENT 0) (MAPC LST (QUOTE (LAMBDA (FUN BODY FUN#) (SETQ BODY (GETD FUN)) (SETQ FUN# (PACK (LIST FUN #))) (MOVD FUN FUN#) ((MEMBER (CAR BODY) (QUOTE (LAMBDA NLAMBDA))) (PUTD FUN (LIST (CAR BODY) (CADR BODY) (LIST EVTRACE FUN (CADR BODY) FUN#) )) ) (PRIN1 FUN) (PRINT " is not a LAMBDA defined function") )) ) )) % ---------------------- % (DEFUN UNTRACE (LAMBDA LST % Функция UNTRACE отменяет трассировку % (MAPC LST (QUOTE (LAMBDA (FUN FUN#) (SETQ FUN# (PACK (LIST FUN #))) ( (GETD FUN#) (MOVD FUN# FUN) (MOVD NIL FUN#) ) )) ) )) % ----------------------------------- % (DEFUN EVTRACE (NLAMBDA (FUN ARGS FUN#) (PRTARGS FUN ARGS) (PRTRSLT FUN (APPLY FUN# (MAKARGS ARGS))) )) % ----------------------------- % (DEFUN PRTARGS (LAMBDA (FUN ARGS) (SPACES INDENT) (SETQ INDENT (PLUS INDENT 1)) (PRIN1 FUN) (PRIN1 " [") ( (NULL ARGS) (PRINT "]") ) ( LOOP ( (ATOM ARGS) (SETQ ARGS (EVAL ARGS)) ( LOOP (PRIN1 (CAR ARGS)) (SETQ ARGS (CDR ARGS)) ( (ATOM ARGS) ) (PRIN1 ", ") ) ) (PRIN1 (EVAL (CAR ARGS))) (SETQ ARGS (CDR ARGS)) ( (NULL ARGS) ) (PRIN1 ", ") ) (PRINT "]") )) % ----------------------------- % (DEFUN PRTRSLT (LAMBDA (FUN RSLT) (SETQ INDENT (DIFFERENCE INDENT 1)) (SPACES INDENT) (PRIN1 FUN) (PRIN1 " = ") (PRINT RSLT) RSLT )) % ------------------------- % (DEFUN MAKARGS (LAMBDA (ARGS) ( (NULL ARGS) NIL) ( (ATOM ARGS) (EVAL ARGS) ) (CONS (EVAL (CAR ARGS)) (MAKARGS (CDR ARGS))) )) % -------------------------- % (DEFUN MAPC (LAMBDA (LST FUNC) (LOOP ( (NULL LST) NIL) ( FUNC (CAR LST) ) ( SETQ LST (CDR LST) ) ) )) (RDS)     Часто при создании текста программы вы случайно набираете на клавиатуре "русский" символ, весьма похожий на латинский... Как обнаружить такую ошибку? Приведем полезную утилиту, позволяющую сделать это: (DEFUN LIKE (LST) % Построение списка тех атомов из списка атомов LST, ко-% % торые в своем имени содержат русские буквы А, В, Е, % % К, М, Н, О, Р, С, Т, Х, похожие по написанию на % % латинские % (COND ( (NULL LST) NIL ) ( (RUS_LETTER (UNPACK (CAR LST))) (CONS (CAR LST) (LIKE (CDR LST))) ) ( T (LIKE (CDR LST)) ) ) ) % -------------------- % (DEFUN RUS_LETTER (LST) % Предикат, возвращающий T, если в имени атома встреча- % % ется одна из следующих русских букв: % % А В Е К М Н О Р С Т Х % (COND ( (NULL LST) NIL ) ( (MEMBER (CAR LST) '(А В Е К М Н О Р С Т Х)) T) ( T (RUS_LETTER (CDR LST)) ) ) ) Адаптированный для muLISP85 текст этой функции можно взять здесь.     Тестовый пример: $ (LIKE '(АВ АА AA)) (АВ АА) В первых двух атомах списка использовались русские буквы.     Этап трансляции.     Оттестированную программу можно транслировать с помощью интерпретатора muLISP81 при помощи функции SAVE. Интерпретатор создает вариант программы на машинном языке, требующий меньше памяти и работающий значительно быстрее, чем интерпретируемая версия. Разница, как правило, составляет один порядок, но зависит, естественно, от транслируемой программы.

    На следующем шаге мы приведем правила работы с системой программирования muLISP85.

Этап кодирования и выполнения Этап тестирования Этап трансляции

Предыдущий шаг Содержание Следующий шаг

Соседние файлы в папке Язык программирования ЛИСП