Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа
Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.
1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.
(atom <элемент>)
(boundp <атом>)
(car <список>)
(cdr <список> )
(cond (<тест1> <результат>...)...)
(cons <первый элемент> <список>)
(defun <символ> <список аргументов> <выражение>...)
(eq <выражение1> <выражение2>)
(if <текст-выражение> <выражение-тогда> [<выражение-иначе>])
(lambda <аргументы> <выражение> ...)
(list <выражение> ...)
(listp <элемент>)
(mapcar <функция> <список1>...<списокn>)
(not <элемент>)
(null <элемент>)
(numberp <элемент>)
(or <выражение>...)
(princ <выражение> [<описатель файла>])
(print <выражение> [<описатель файла>])
(progn <выражение>...)
(quote <выражение>)
(read <строка>)
(set <символ> <выражение>)
(setq <символ1> <выражение1> [<символ2> <выражение2>]...)
(while <тест-выражение> <выражение>...)
(zerop
<элемент>)
Функции dlispа не используемые MuLispом.
(cos <угол>)
Эта функция возвращает косинус <угла>, где <угол> - выражается в радианах. Например:
(cos 0.0) возвращает 1.000000
(cos
pi) возвращает -1.000000
(sin <элемент>)
Эта функция возвращает синус <угла> как действительное число, где <угол> выражен в радианах. Например:
(sin 1.0) возвращает 0.841471
(sin
0.0) возвращает 0.000000
(min <число> <число>...)
Эта
функция возвращает наименьшее
из заданных <чисел>. Каждое<число>
может быть действительным или целым.
(nth <n> <список>)
Эта функция возвращает "энный" элемент <списка>, где <n> - номер элемента (ноль - первый элемент). Если <n> больше, чем номер последнего элемента <списка>, возвращается nil. Например:
(nth 3 '(a b c d e)) возвращает D
(nth 0 '(a b c d e)) возвращает A
(nth
5 '(a b c d e)) возвращает nil
(strcat <строка1> <строка2>...)
Эта функция возвращает строку, которая является результатом сцепления строки1>, <строки2> и т.д. Например:
(strcat "a" "bout") возвращает "about"
(strcat "a" "b" "c") возвращает "abc"
(strcat
"a" "" "c") возвращает
"ac"
(strlen <строка>)
Эта функция возвращает длину в символах строковой константы <строка> как целую величину. Например:
(stalen "abcd") возвращает 4
(stalen "ab") возвращает 2
(stalen
"")
возвращает 0
(subst <новый элемент> <старый элемент> <список>)
Эта функция просматривает <список> в поиске <старых элементов> и возвращает копию <списка> с заменой каждого встречного <старого элемента> на <новый элемент>. Если <старый элемент> не найден в <списке>, SUBST возвращает <список> неизменным. Например, дано:
(setq sample '(a b (c d) b))
тогда:
(subst 'qq 'b sample) возвращает (A QQ (C D) QQ)
(subst 'qq 'z sample) возвращает (A B (C D) B)
(subst 'qq '(c d) sample) возвращает (A B QQ B)
(subst '(qq 'rr) '(c d) sample) возвращает (A B (QQ RR) B)
(subst
'(qq 'rr) 'z sample) возвращает (A B (C D) B)
В сочетании с функцией ASSOC, SUBST обеспечивает удобный способ замены величины, найденной по ключу в структурированном списке. Например, дано:
(stq who '((ferst john) (mid q) (last public)))
тогда:
(setq old (assoc 'first who)) возвращает (FIRST JOHN)
(setq new '(first j)) возвращает (FIRST J)
(setq
new old who) возвращает ((FIRST J) (MID Q) (LAST PUBLIC))
(type <элемент>)
Эта функция возвращает TYPE (тип) <элемента>, где TYPE - одно из следующих значений (как атом):
REAL числа с плавающей запятой
STR строковые константы
INT целые величины
SYM символы
LIST
списки (и функции пользователя)
3. Расширение библиотеки функций dlisp.
Основные принципы программирования на dlisp те же, что и в MuLisp, при этом сохраняется и синтаксис MuLispа.
Никогда не используйте имена встроенных функций или символов для функций, определяемых вами, так как это сделает недоступными встроенные функции.
Пример расширения библиотеки функций dlispа содержится в файле rash.lsp. Для его запуска необходимо выполнить следующую последовательность команд:
MuLisp87.com Common.lsp
(load
rash.lsp)
;File rash.lsp
;(Приложение к учебной версии языка Лисп dlisp).
;Содержит
функции, расширяющие библиотеку dlisp Лиспа.
;Функция APPEND1 соединяет два списка в один
(defun append1 (l p)
(if (null l) p ;L пуст - вернуть P (условие окончания),
(cons (car l) ;иначе - создать список,
(append1 (cdr l) p)))) ;используя
рекурсию.
;EQUAL1 - логическая идентичность объектов (параллельная рекурсия)
(defun equal1 (u v)
(cond ((null u) (null v)) ;возвращает T если U и V пустые
((numberp u) (if (numberp v) (= u v) ; проверка
nil)) ;на идентичность
((numberp v) nil) ; чисел
((atom u) (if (atom v) (eq u v) ;сравнение атомов
nil))
((atom v) nil)
(t (and (equal1 (car u) (car v)) ; идентичность "голов"
(equal1 (cdr u)
(cdr v)))))) ;идентичность "хвостов"
;DELETE1 - удаляет элемент X из списка L
(defun delete1 (x l)
(cond ((null l) nil)
((equal1 (car l) x) (delete1 x (cdr l)))
(t (cons (car l) (delete1 x (cdr l)))))) ;ветвь выполняется
;в случае невыполнения
предыдущих.
;FULLENGTH1 - определяет полную длину списка L (на всех уровнях)
(defun fullength1 (l)
(cond ((null l) 0) ;для пустого списка возвращается 0
((atom l) 1) ;если L является атомом - возвращается 1
(t (+ (fullength1 (car l)) ;подсчет в глубину
(fullength1 (cdr l)))))) ;подсчет
в ширину
;DELETELIST1 - удаляет все элементы, входящие в список U из списка V
(defun deletelist1 (u v)
(cond ((null u) v)
(t (delete1 (car u)
(deletelist1 (cdr u) v)))))
;MEMBER1 - проверяет вхождение элемента U в список V на верхнем уровне
(defun member1 (u v)
(cond ((null v) nil)
((equal1 u (car v)) v)
(t (member1 u (cdr v)))))
;В
случае присутствия S-выражения
U в списке V функция
возвращает остаток списка
V, начинающийся с U, в
противном случае результатом вычисления
является NIL.
;INTERSECTION1 - вычисляет список общих элементов двух списков
(defun intersection1 (u v)
(cond ((null u) nil)
((member1 (car u) v);проверка на вхождение "головы" сп. U в сп. V
(cons (car u) (intersection1 (cdr u) v)));создание списка
(t (intersection1 (cdr u) v))));ненужные элементы отбрасываются
;UNION1 - объединяет два списка, но в отличие от APPEND1,
;в результирующий список не добавляются повторяющиеся элементы
(defun union1 (u v)
(cond ((null u) v)
((member1 (car u) v) ;отсеивание
(union1 (cdr u) v)) ; ненужных элементов
(t (cons (car u)
(union1 (cdr
u) v)))))
;COPY-LIST1 - копирует верхний уровень списка
(defun copy-list1 (l)
(cond ((null l) nil)
(t (cons (car l)
(copy-list1
(cdr l))))))
;COPY_TREE1 - копирует списочную структуру
(defun copy-tree1 (l)
(cond ((null l) nil)
((atom l) l)
(t (cons (copy-tree1 (car l))
(copy-tree1
(cdr l))))))
;ADJOIN1 - добавляет элемент к списку
(defun adjoin1 (x l)
(cond ((null l) nil)
((atom l) (cons x ;если L атом, то он преобразуется в список,
(cons l nil))) ;а затем к нему добавляется X
(t (cons x l))))
;SET-DIFFERENCE1 - находит разность двух списков
(defun set-difference1 (w e)
(cond ((null w) nil)
((member1 (car w) e) ;отбрасываются ненужные
(set-difference1 (cdr w) e)) ;элементы
(t (cons (car w)
(set-difference1
(cdr w) e)))))
;COMPARE1 - сравнение с образцом
(defun compare1 (p d)