Боевой стрекозёл: найти и сожрать - 2.

Sep 20, 2010 15:13



Вот некогда обещанное:

;; кое-какие предикаты

(define (not-empty? x)
(not (empty? x)))

(define (alist? x)
(and (list? x)
(for-all (fn (e) (and (list? e) (not-empty? e) (string? (first e)))) x)))

(define (object? x)
(and (list? x) (not-empty? x) (context? (first x))))

;; а это и есть чудо-макрос :)
;; object -- символ, связанный с экземпляром класса ("объектом" то ж),
;; alst -- ассоциативный список (ключи -- строки).
;; Будут вызваны методы объекта, короткие имена которых совпадают с ключами элементов асс. списка,
;; аргументами будут хвосты соотв. элементов

(define-macro (apply-assoc object alst)
(letex ((obj object) (al alst))
(when (and (object? obj) (alist? al))
(letn ((ctx (first obj))
(keys (intersect (map first al)
(map term (filter (fn (s) (let ((e (eval s))) (or (lambda? e) (macro? e))))
(symbols ctx)))))
(a))
(catch
(dolist (k keys) (and (setq a (assoc k al))
(eval (append (list : (sym k ctx) object) (rest a)))))
'MAIN:catch-result)))))
Что же до прочего, то я считаю, что частная собственность должна быть уничтожена.

newlisp, программизЬм

Previous post Next post
Up