Автор работы: Пользователь скрыл имя, 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)