Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 278

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 272 273 274 275 276 277 < 278 > 279 280 281 282 283 284 .. 316 >> Следующая

;; список уникальных начал
(defun ass-all (Key Vac)
;; список всех вариантов продол ения (что мо ет идти за кл чом) (cond
((Null Vac) Nil)
((eq (caar Vac) Key) (cons (cdar Vac)
(ass-all Key (cdr Vac)) )) (T (ass-all Key (cdr Vac)))
))
(defun swin (key varl) (cond
;; очередной аг свертки или снять скобки при отсутствии вариантов ((null (cdr varl))(cons key (car varl))) (T (list key (gram varl)) )
))
(defun gram (ltext)
;; левая свертка, если нались обие начала ((lambda (lt) (cond
798
14.
((eq (length lt)(length ltext)) ltext) (T (mapcar
#'(lambda (k) (swin k (ass-all k ltext))) lt )
) ) ) (unic ltext)
))
(defun bnf (main ltext binds) (cons (cons main (gram ltext)) binds))
;; приведение к виду БНФ
; реализация развертки: names, words, lexs, d-lex, d-names, ; h-all, all-t, pred, sb-nm, chain, level1, lang
(defun names (vac) (mapcar 'car vac))
;; определяемыя символы
(defun words (vac) (cond ;; используемые символы
((null vac) NIL)
((atom vac) (cons vac NIL))
(T (union (words(car vac)) (words (cdr vac)))) ))
(defun lexs (vac) (set-difference (words vac) (names vac)))
;; неопределяемые лексемы
(defun d-lex ( llex)
;; самоопреление терминалов
(mapcar #'(lambda (x) (set x x)) llex))
(defun ( llex)
;; определение нетерминалов
(mapcar #'(lambda (x) (set (car x )(cdr x))) llex))
(defun h-all (h lt)
;; подстановка голов (mapcar #'(lambda (a) (cond
14.2. МОДЕЛЬВЫЧИСЛЕНИЙ
799
((atom h) (cons h a)) (T (append h a)) )
) lt) )
(defun all-t (lt tl)
;; подстановка хвостов (mapcar#'(lambda (d) (cond
((atom d) (cons d tl)) (T(append d tl)) ) ) lt) )
(defun pred (bnf tl)
;; присоединение предшественников
(level1 (mapcar#'(lambda (z) (chain z tl)) bnf)))
(defun sb-nm (elm tl)
;; постановка определений имен (cond
((atom (eval elm)) (h-all (eval elm) tl)) (T (chain (eval elm) tl))
))
(defun chain (chl tl)
;; сборка цепочек (cond
((null chl) tl)
((atom chl) (sb-nm chl tl))
((atom (car chl))
(sb-nm (car chl) (chain (cdr chl) tl) ))
(T (pred (all-t (car chl) (cdr chl)) tl)) ))
(defun level1 (ll)
;; выравнивание (cond
((null ll)NIL)
800
14.
(T (append (car ll) (level1 (cdr ll)) )) )) (defun lang ( frm )
;; ввод заданной системы текстов
(d-lex (lexs frm))
(d-names frm)
(pred (eval (caar frm)) '(())
))
Конец примера 14.2.2.
§ 14.3. ОБЪЕКТЫ И LISP
Стандартная надстройка над Common Lisp, имитирующая объектно-ориентированный стиль, это модуль CLOS — Common Lisp Object System. Сама по себе объектность не дает никакого выигрыша по сравнению с языком LISP, поскольку возможности динамического вычисления функций в LISP даже шире. Видимо, именно поэтому в CLOS имеются две интересных модификации, делаие его не совсем похо им на стандартное .
ачнем с понятия структуры данных в языке Common Lisp. Структура определяется функцией defstruct вида
(defstruct pet name (species 'cat) age weight sex),
Задание структур автоматически задает функци -конструктор структуры make-pet, которая может принимать ключевые аргументы для каждого из полей:
(make-pet :nick 'Viola :age '(3 years), :sex 'femina)),
и функции доступа для кадого из полей, например, pet-nick, используу-юся для получения значения поля или ссылки на него. Если поле не инициализировано ни по умолчани , ни конструктором, оно получает начальное значение NIL. икакой дальнейей спецификации полей структур нет2, списки являются столь общей структурой данных, которая провоцирует игнорирование типов данных.
В объекте для кадого поля могут явно указываться функции доступа и имена кл чевых парамеров для инициализации аргументов.
2 меется редко используемая возмо ность указать, какого типа долно бть поле.
14.3.OEbEKTbIHLISP
801
(defclass pet (animal possession) ( (species :initform 'cat) (nick :accessor nickof
:inintform 'Pussy
:initarg namepet)
)
Этот класс наследует поля, функции доступа и прочее от классов animal и possession. Hапример, поле cost имеется в значении класса, если оно имеется в одном из этих классов. Поскольку статических типов у полей нет, нет и конфликтов.
Основная функция наследования в CLOS — определение упорядочения на классах. С каждым классом связано свое упорядочение. Наследник мень-е своих предков, из предков меньим считается тот, которй ранье перечислен в списке наследования при определении класса. CLOS достраивает этот частичный порядок до линейного. Способ пополнения порядка моет быть в лбой момент и без оповеения изменен, и хакерское использование особенностей конкретного пополнения считается грубой стилистической ошибкой. Если система находит несовместимость в определении порядка, то она вдает оибку, как в следуем примере:
[6]> (defclass init () ()) #<STANDARD-CLASS INIT> [7]> (defclass a (init) ()) #<STANDARD-CLASS A> [8]> (defclass b (init) ()) #<STANDARD-CLASS B> [9]> (defclass c1 (a b) ()) #<STANDARD-CLASS C1> [10]> (defclass c2 (b a) ()) #<STANDARD-CLASS C2> [11]> (defclass contr (c1 c2) ())
*** - DEFCLASS CONTR: inconsistent precedence graph,
cycle (#<STANDARD-CLASS A> #<STANDARD-CLASS B>)
Предыдущая << 1 .. 272 273 274 275 276 277 < 278 > 279 280 281 282 283 284 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100