Ознакомительная работа в среде MuLisp

Автор работы: Пользователь скрыл имя, 19 Февраля 2011 в 15:30, лабораторная работа

Описание работы

Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.



1.Основные положения программирования на Лиспе.
2.Загрузка системы, системный редактор.
3.Базовые функции языка. Символы, свойства символов.
4.Средства языка для работы с числами.
5.Задание к лабораторной работе.
6.Вопросы.

Файлы: 1 файл

labs1d.doc

— 151.50 Кб (Скачать файл)

       (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)

Информация о работе Ознакомительная работа в среде MuLisp