Лекции в ворде (1086314), страница 7
Текст из файла (страница 7)
+
Для трассировки функций перед их запуском необходимо ввести команду
(rds ‘debug)
(trace <список имен функций, входящих в состав выполняемой функции>).
РЕДАКТОР muLISP.
Для подготовки программ можно использовать текстовый редактор системы mulisp.
Резидентный редактор значительно сокращает время на разработку программ за счет интерактивной структуры LISP. Используя экранно-ориентированный редактор muLISP, можно создавать программы, тестировать их и полностью отлаживать в среде muLISP.
Загрузка редактора
Для запуска редактора надо набрать:
$(rds ed)
$ (ed)
После нескольких секунд ввода система спрашивает, с каким редактором хочет работать пользователь: с WorldStar-like или Emacs-like. Следует ответить W.
Если же muLISP уже был загружен, введите команду:
(load ed)
вслед за знаком доллара; команда обеспечит загрузку редактора и начало его работы. Однако следует отметить, что команда LOAD вызывает перезапись текущей среды muLISP, включая все определения функций, свойств и т.д.
Далее появится вопрос : какую использовать систему команд? Для использования системы команд редактора Wordstar на вопрос надо ответить , нажав W.
В верхней строке экрана появится горизонтальное меню:
Edit - редактирование файла
Lisp - возврат к интерпретатору
Quit - выход в DOS
Если нажать E, то редактор запросит имя файла (автоматически добавляет расширение .LSP). После чего можно редактировать выбранный файл. По окончании редактирования нужно набрать CTRL K. В верхней строке экрана появится другое меню. Здесь можно выбрать следующее:
A - не сохранять изменения
D - записать редактируемый файл
S - записать и вернуться к редактированию.
После записи в верхней строке появится исходное меню. Для запуска созданного файла нужно набрать L (появится приглашение) и затем команду:
$ (RDS имя-файла)
и далее вызвать необходимую функцию. Если во время выполнения программы произойдет ошибка, то в ответ на выведенное интерпретатором сообщение для возврата к редактированию нужно набрать Т (Top-Level).
При нормальном завершении программы для возврата в редактор в ответ на приглашение нужно набрать:
$ (return)
Для выхода из интерпретатора используйте:
$ (system)
Команды редактора
Команды управления курсором
Ctrl-K | Завершение редактирования и выход в меню |
(Ctrl-D) | Перемещение вправо на символ |
(Ctrl-S или клавиша Bacspace) | Перемещение влево на символ |
(Ctrl-E) | Перемещение курсора вверх на строку |
(Ctrl-X) | Перемещение курсора вниз на строку |
Ctrl-A | Перемещение вправо на слово |
Ctrl-F | Перемещение влево на слово |
Ctrl-Q D | Перемещение в конец строки |
Ctrl-Q S | Перемещение в начало строки |
Ctrl-Q E | Переход в начало экрана |
Ctrl-Q X | Переход в конец экрана |
Команды ввода текста
Существуют два типа ввода текста: тип Replace и тип Insert. <Ctrl-V> - это переключатель с одного типа ввода на другой. Имя текущего типа ввода всегда указывается в строке состояния редактора в верхней правой части окна редактора. Первоначально редактору всегда устанавливается тип Insert (вставки).
При типе Replace (замещения) символы и пробелы под курсором и справа от него будут замещаться на новые вводимые символы. Это самый простой способ первоначального ввода текста.
Ошибочные символы могут быть исправлены путем простой замены их на правильные с клавиатуры, а текст может быть затерт путем замещения его пробелами. При типе Insert символы и пробелы под курсором и справа от него сдвигаются вправо, освобождая слева от себя место для новых вставляемых перед ими символов
пробелы | Уничтожение текста |
Ctrl-Z | Сдвиг текста на строку вверх |
Ctrl-W | Сдвиг текста на строку вниз |
Ctrl-N или <Enter> | Вставка строки |
Ctrl-G | Уничтожает символ под курсором |
Ctrl-_ или Del | Уничтожает символ слева от курсора |
Ctrl-T | Уничтожает символ справа от курсора |
Ctrl-Y | Уничтожает строку, на которой располагается курсор |
Ctrl-U | Восстанавливает предыдущее изменение текста |
Блочные команды
Ctrl-K+B | Отмечает начало блока |
Ctrl-K+K | Отмечает конец блока |
Ctrl-K+V | Перемещает блок в положение курсора |
Ctrl-K+Y | Уничтожает текущий блок |
Ctrl-K+R | Требует введения имени файла для чтения |
Ctrl-K+W | Требует введения имени файла для записи |
Команды списковых структур | |
Alt-D | Перемещает вперед курсор на одно S-выражение |
Alt-S | Перемещает назад курсор на одно S-выражение |
Alt-F | Устанавливает курсор в конце списка |
Alt-X | Устанавливает курсор после первой скобки «(« |
Alt-C | Перемещает курсор к началу следующего определения |
Alt-R | Перемещает курсор к началу предыдущего определения |
Alt-T | Уничтожает S-выражение под курсором |
Alt-L | Закрывает редактор и передает управление в окно вычисления. Для возврата в редактор нажать Enter |
Alt-! | Выдает в окно результат вычисления S-выражения |
Alt-C | Перемещает курсор к началу следующего определения |
Alt-R | Перемещает курсор к началу предыдущего определения |
Alt-T | Уничтожает S-выражение под курсором |
Alt-L | Закрывает редактор и передает управление в окно вычисления. Для возврата в редактор нажать Enter |
Alt-! | Выдает в окно результат вычисления S-выражения |
Приложение 2
КРАТКОЕ ОПИСАНИЕ ФУНКЦИЙ muLISP
1. Функции выборки
№ | Функция | Значение функции, примеры |
1. | CAR [S] | 1.S-список.CAR выдает первый элемент списка |
$ (CAR '(A B C D)) A | ||
2.S-точечная пара.CAR выдает левую часть часть точечной пары $ (CAR '((A . B) . C) (A . B) | ||
3.S-атом.CAR выдает значение атома, присвоенное ему специальными функциями присваивания $ (SETQ X 7) $ (CAR 'X) 7 В случае если у атома значение отсутствует, выдается имя атом | ||
2. | CDR [S] | 1.S-список.CAR возвращает список без первого эл-та |
$(CDR '(A B C D)) | ||
(B C D) | ||
2.S-точечная-пара.CDR возвращает правую часть точечной пары (на верхнем уровне) | ||
$ (CDR '((A . B) . C)) | ||
С | ||
3.S-атом.CDR возвращает список свойств атома | ||
$ (PUT 'JOE 'SEX 'MALE) | ||
MALE | ||
$ (CDR 'JOE) | ||
((SEX . MALE)) | ||
3. | LAST [L] | LAST возвращает список, в котором убраны все эл-ты, кроме последнего |
$ (LAST '(A B C D)) | ||
(D) | ||
$ LAST '(A B C . D)) | ||
(C . D) | ||
$ (LAST 'A) | ||
NIL | ||
4. | NTHCDR [N L] | NTHCDR возвращает N-й CDR от списка L |
$ (NTHCDR 0 '(A B C D)) | ||
(A B C D) | ||
$ (NTHCDR 1 '(A B C D)) | ||
(B C D) | ||
$ (NTHCDR 2 '(A B C D)) | ||
(C D) | ||
$ (NTHCDR 5 '(A B C D)) | ||
NIL | ||
$ (NTHCDR 2 '(A B . C)) | ||
С | ||
5. | NTH [N L] | NTH возвращает N-й элемент списка (отсчет ведется c нуля |
$ (NTH 0 '(A B C D)) | ||
0 | ||
$ (NTH 3 '(A B C D)) | ||
D | ||
$ (NTH 4 '(A B C D)) | ||
NIL | ||
6. | SUBLIST[L N M] | SUBLIST копирует и возвращает подсписок с N по M-й элементы (отсчет ведется c нуля) $ (SUBLIST '(A B C D E) 2 4) (C D E) $ (SUBLIST '(A B C D E) 2 2) (C) $ (SUBLIST '(A B C D E) 2) (C D E F) |
10. | ASSOC[K AL] | ASSOC осуществляет поиск в ассоциативном списке (AL) по значениям ключа (К) соответствующего свойства $ (SETQ CAPITALS ((USA . WASHINGTON)(FRANCE . PARIS)(JAPEN . TOCIO))) $ (ASSOC 'FRANCE CAPITALS) (FRANCE . PARIS) $ (ASSOC 'AUSTRALIA CAPITALS) NIL |
2. Конструирующие функции
№ | Функция | Значение функции, примеры |
1. | CONS[S1 S2] | 1.S2-список.CONS возвращает список S2, первым элементом которого добавлен аргумент S1 $(CONS 'A '(B C D)) (A B C D) 2.S2-атом.CONS возвращает точечную пару, левая часть которой S1, а правая - S2 $(CONS 'A 'B) (A . B) |
2. | LIST[S1..Sn] | LIST kонструирует и возвращает список, из элементов S1, S2,...Sn. При отсутствии аргументов возвращает NIL $ (LIST 'A 'B 'C 'D) (A B C D) $ (LIST 'A '(B C) 'D) (A (B C) D) $(LIST) NIL |
3. | APPEND[L1...LN] | APPEND конструирует и возвращает список из элементов списков L1, L2 ... Ln $(APPEND '(A B C) '(D E F)) (A B C D E F) $(SETQ FOO '(1 2 3)) (1 2 3) $(APPEND '(A B C) FOO '(K L M)) (A B C 1 2 3 K L M) |
4. | REVERSE [L] | REVERSE возвращает список L, с элементами в обратном порядке) $(REVERSE '(A B C D E)) (E D C B A) $(REVERSE '(A B C) '(1 2 3)) (C B A 1 2 3) $(REVERSE '(A B C) 'D) (A B C . D) |
5. | LENGTH[S] | 1.S-список.LENGTH возвращает число элементов в списке L $ (LENGTH '(A B C D E)) 5 |
2.S-атом.LENGTH возвращает число символов в атоме $ (LENGTH 'TIME) 4 3.S-число.LENGTH возвращает количество байтов занимаемых числом в памяти $ (LENGTH -13) 1 |
3. Функции распознавания
№ | Функция | Значение функции, примеры |
1. | NUMBERP [S] | Т, если S - целое число, ниаче NIL |
$ (NUMBERP 32) T | ||
$ (NUMBERP 'D) NIL | ||
2. | ATOM [S] | Т, если S - атом, иначе NIL |
$ (ATOM 'KOT) T | ||
$ (ATOM '(A B C)) NIL | ||
$ (ATOM NIL) T | ||
3. | LISTP [S] | Т, если S - список, иначе NIL |
$ (LISTP 'DOG) NIL | ||
$ (LISTP '(A B C)) NIL | ||
$ (LISTP NIL) T | ||
4. | NULL [S] | | Т, если S - пустой список, иначе NIL |
$ (NULL NIL) T | ||
$ (NULL ()) T | ||
$ (NULL '(A B C)) NIL | ||
5. | ZEROP [S] | Т, если S - нуль, иначе NIL |
$ (ZEROP 0) T | ||
$ (ZEROP 12) NIL | ||
$ (ZEROP 'DOG) NIL | ||
6. | PLUSP [S] | T, если S - положительное число |
$ (PLUSP 12) T | ||
$ (PLUSP -4) NIL | ||
$ (PLUSP 0) NIL | ||
$ (PLUSP 'DOG) NIL | ||
7. | MINUSP [S] | Т, если S - отрицательное число |
$ (MINUSP 12) NIL | ||
$ (MINUSP -4) T | ||
$ (MINUSP 0) NIL | ||
$ (MINUSP 'DOG) NIL | ||
8. | ODDP [S] | Т, если S - нечетное число, ниаче NIL |
$ (ODDP 12) NIL | ||
$ (ODDP -41) T | ||
$( ODDP 0) NIL | ||
9. | EVENP [S] | Т, если S - четное чмсло, иначе NIL |
$( EVENP 12) T | ||
$( EVENP -41) NIL | ||
$ (EVENP 0) T |
4. Функции сравнения
№ | Функция | Значение функции, примеры |
1. | EQUAL[S1 S2]| | T, если S1 равно S2, иначе NIL |
$ (EQUAL 'A 'A) T | ||
$(EQUAL '(A B C) '(A B C)) T | ||
$ (EQUAL '(A B C '(C B A)) NIL | ||
2. | MEMBER[S L] | Если S является элементом списка L, тогда значением функции будет часть списка L, начиная с первого вхождения S, иначе NIL $ (MEMDER 'A '(B C D)) NIL $ (MEMBER 'A '(B A D)) (A D) |
3. | = [N1...Nn] | Т, если N1=N2=N3...=Nn, иначе NIL $ (= 5 9) NIL $ (= 3 3.0) T |
4. | /= [N1...Nn] | T, если N1=N2 и N2=N3 и т.д., иначе NIL |
$ (/= 5 9) T | ||
$ (/= 4 4 -7) NIL | ||
$ (/= 3 3.0) NIL | ||
$ (/= 6 2 6) T | ||
5. | < [N1...Nn] | Т, если N1<N2 и N2<N3 и т .д., иначе NIL |
$ (< 5 9) T | ||
$(< 4 -7) NIL | ||
$ (< 3 3.0) NIL | ||
6. | > [N1...Nn] | T, если N1>N2 иN2>N3 и т.д., иначе NIL |
$ (> 5 9) NIL | ||
$ (> 4 -7) T | ||
$ (> 3 3.0) NIL | ||
7. | <= [N1...Nn] | T, если N1<N2 и N2<N3 и т.д., иначе NIL |
$ (<= 5 9) T | ||
$ (<= 4 -7) NIL | ||
$ (<= 3 3.0) T | ||
8. | >= [N1...Nn] | T, если N1>N2 и N2>N3 и т.д., иначе NIL |
$ (>= 5 9) NIL | ||
$ (>= 4 -7) T | ||
$ (>=3 3.0) T |
5. Логические функции
№ | Функция | Значение функции, примеры |
1. | NOT [S] | NOT возвращает Т, если S имеет значение NIL иначе NIL |
$ (NOT NIL) T | ||
$ (NOT 'FOO) NIL | ||
$ (NOT (EQUAL 'DOG 'CAT)) T | ||
2. | AND[S1...S2] | AND слева направо вычисляет значения S1...Sn и возвращает значение T, если все аргументы неNIL, иначе вычисление проводится до первого NIL и возвращается NIL |
$ (AND (EQ 'DOG 'CAT)(< 2 3)) NIL | ||
$ (AND (EQ 'DOG 'DOG)(< 2 3)) T | ||
3. | OR[S1...S2] | Вычисляются аргументы S1...Sn слева направо, пока не будет получен результат, отличный от NIL, он и будет результатом работы OR.Если все результаты NIL, тогда функция OR возвращает NIL |
$ (OR (EQ 'DOG 'CAT)(< 2 3)) T | ||
$ (OR (EQ 'DOG 'CAT)(< 3 2)) NIL |
6. Функции присваивания
№ | Функция | Значение функции, примеры |
1. | SET [A S] | Значению А присваивается значение S. Значение А атом. SET возвращает значение второго аргумента |
$ (SET 'PET 'DOG) DOG | ||
$ (SET PET 'ANIMAL) ANIMAL | ||
$ DOG ANIMAL | ||
$ PET DOG | ||
2. | SETQ[A1 S1..An Sn] | Aргументы A1...An квотируются и им присваиваются значения аргументов S1...Sn (соответственно). SETQ возвращает последнее присвоенное значение |
$ (SETQ FOO '(D E F)) (D E F) | ||
$ FOO (D E F) | ||
$ (SETQ SUM 5) 5 | ||
$ (SETQ SUM (+ 3 4) SQR (* SUM SUM)) 49 | ||
$ SUM 7 | ||
$ SQR 49 |
7. Примитивы определения функций
№ | Функция | Значение функции, примеры |
1. | GETD [А] А -имя функции | Выводит на экран определение функции с именем А. Значение функции- соответствующее лямбда выражение |
$ (GETD FACTORIAL) | ||
(LAMBDA (N) (COND ((ZEROP N) 1) | ||
(T (* (FACTORIAL (SUB1 N)))))) | ||
2. | MOVD [A1 A2] A1 -старое имя функии А2 -новое имя функции | Функции с именем А1 присваивается еще одно имя - А2.Значение функции - новое имя $ (MOVD 'CAR 'FIRST) FIRST $ (FIRST '(A B C D E)) A |
3. | REMD [A] А -имя функции | Из оперативной памяти убирается пользовательская функция с именем А. Значение функции – имя убираемой функции |
(DEFUN FACTORIAL (N) | ||
(COND ((ZEROP N) 0) | ||
(T (FACTOPIAL (SUB1 N))) ) ) | ||
FACTORIAL | ||
$ (GETD FACTORIAL) | ||
(LAMBDA (N) (COND ((ZEROP N) 1) | ||
(T (* (FACTORIAL (SUB1 N)))))) | ||
$ (REMD 'FACTORIAL) | ||
FACTORIAL | ||
$ (GETD FACTORIAL) | ||
NIL | ||
4. | DEFUN [A L F1...FN] A -имя функции | Позволяет определить функцию пользователя. Значение функции – имя созданной функции |
$ (DEFUN FACTORIAL (N) | ||
(COND ((ZEROP N) 0) | ||
(T (FACTORIAL (SUB1 N)))) ) | ||
FACTORIAL | ||
DEFUN[A(ft L F1..F2)] | Позволяет определить функцию пользователя. Значение функции–имя созданной функции (DEFUN FACTORIAL (LAMBDA (N) (COND ((ZEROP N) 0) | |
(T (FACTORIAL (SUB1 N))) ) ) ) | ||
FACTORIAL | ||
GETD [A,tf] | Pезультат - тело функции А |
8. Арифметические функции
№ | Функция | Значение функции, примеры |
1. | MAX[N1...Nn] | Возвращает mаксимальное из чисел N1... Nn |
(MAX 5 -7 4) 5 | ||
2. | MIN[N1...Nn] | Возвращает минимальное из чисел N1...Nn |
(MIN 5 -7 4) -7 | ||
3. | + [N1...Nn] | Возвращает сумму чисел N1+N2+...+Nn |
(+ 2 3 4 -5) 4 | ||
4. | - [N1...Nn] | Возвращает разность между N1 и N2+N3+...+Nn |
(- 12 5 -2) 10 | ||
5. | * [N1...Nn] | Возвращает произведение чисел: N1*N2*...*Nn |
(* 3 4 5) 60 | ||
6. | / [N1...Nn] | Возвращает результат от деления N1 на про изве-дение N2*N3*...*N4 |
(/ 12 5 -3) 0.8 | ||
7. | ADD1 [N] | Возвращает N, увеличенное на 1: N + 1 |
(ADD1 3) | ||
8. | SUB1 [N] | Возвращает N, уменьшенное на 1: N - 1 |
(SUB1 3) 2 | ||
9. | ABS [N] | Возвращает абсолютное значение N |
(ABS -3) 3 (ABS 3) 3 | ||
10. | SIGNUM [N] | Возвращает знак числа: при N>0 – 0 |
при N<0 – 1 | ||
(SIGNUM -0.2) 1 (SIGNUM 5) 0 |
9. Функции ввода
№ | Функция | Значение функции, примеры |
1. | RDS [D: I.R] D: - диск; I - имя файла; R - расширение | Открывает файл на диске для считывания в оперативную память. Возвращает имя файла - (RDS 'B:MLSP.TXT) B:MLSP.TXT |
2. | RDS [] | Закрывает файл для считывания |
3. | READ-CHAR [] | Считывает следующий символ с текущего входного устройства и возвращает символ, чье печатное имя состоит из этих характеристик.-- |
4. | READ [ ] | Считывает S-выражение с текущего входного устройства и возвращает соответствующий список |
5. | READ-BYTE | Считывает байт с текущего входного устройства |
6. | READ-LINE[ ] | Считывает строку с с текущего входного устройства и возвращает ее в качестве результата. |
7. | LISTEN [ ] | Результат - Т, если во входном устройстве есть еще символы для ввода. |
10. Функции вывода
№ | Функция | Значение функции, примеры |
1. | WRS [D: I.R] D: - диск; I - имя файла; R - расширение - | Открывает файл на диске для вывода. Возвращает имя файла (WRS 'B:MLSP.TXT) B:MLSP.TXT |
2. | PRINC [S] | Печатает S без перехода на новую стороку. Результат - S. |
3. | PRINT [S] | Печатает S с переходом на новую стороку |
4. | TERPRI [S] | На выходном устройстве пропускает N строк |
5. | SPACES [N] | На выходном устройстве пропускает N позиций |
6. | WRITE-BYTE [N] | На выходном устройстве печатает символ, соответствующий ASCII коду N |
11. Функции работы со строками
№ | Функция | Значение функции, примеры |
1. | SUBSTRING[atom,n,m] | Если <атом> - либо символ, либо число, <n> и <m> - неотрицательные целые, и n<=m, то (SUBSTRING атом n m) возвращает символ, у которого р-имя состоит из символов р-имени <атома>, начиная с n-го по m-й, причем отсчет символов ведется с 0. Все значения <n> меньше, чем 0, принимаются равными 0. Если <m> пропу-щено, является отрицательным целым или больше, чем количество символов в <атом>, принимается, что <m> равно количеству символов в<atom>. Если <n> больше или равно количеству символов в<atom> или если n>m, SUBSTRING возвращает символ, у которого р-имя есть нулевая строка. Отметим, что SUBSTRING всегда возвращает сим- вол, даже если <атом> есть число. |
(SUBSTRING 'ABCDEFG 2 4) --> CDE | ||
(SUBSTRING 'ABCDEFG 2) --> CDEFG | ||
(SUBSTRING 'ABCDEFG 0 4) --> ABCDE | ||
(SUBSTRING 1000 0) --> |1000| | ||
2. | FINDSTRING[atom1, atom2,...atomn] | (FINDSTRING атом1 атом2 n) возвращает номер позиции первого вхождения <атома1> в<атом2>, причем отсчет ведется с 0. Если<n> - ноль или положительное целое, поиск начинается с n-го символа <атома2>. Если<атом1> не найдено, функция возвращает NIL. |
(FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI) 3 | ||
(FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI 4) 9 | ||
(FINDSTRING 'XYZ 'ABCDEFGHI) NIL | ||
3. | UNPACK[atom] | (UNPACK атом) возвращает список символов полученных путем расщепления <атом>. Если <атом> не является атомом, UNPACK возвращает NIL. |
(UNPACK 'ABCDE) (A B C D E) | ||
(SETQ FOO -216) -216 | ||
(UNPACK FOO) (- \2 \1 \6) | ||
4. | PACK [list] | PACK возвращает символ, который состоит из сцеп- ленных имен атомов в <list>. От метим, что PACK всегда возвращает символ, даже если р-имя состоит только из однозначных чисел. |
(PACK '(A B C)) ABC | ||
(PACK '(3 A 5)) 3A5 | ||
5. | PACK*[atom1,atom2, atom N] | (PACK* атом1 ... атомN) возвращает символ, который состоит из сцепленных<атома1>, ..., <атомаN>. |
PACK* аналогичено PACK, но работает не со спис- ком атомов, а с произвольным количеством атомов. | ||
(PACK* 'A 'B 'C) ABC | ||
(PACK* 3 'A 5) 3A5 |