X-Git-Url: https://git.hcoop.net/clinton/lisp-on-lines.git/blobdiff_plain/4358148e6c67fcc2ae24050c54d8050b4dc03f9d..f56d6e7e926f9c3f968325e244794ff748435ac3:/src/standard-descriptions/list.lisp?ds=inline diff --git a/src/standard-descriptions/list.lisp b/src/standard-descriptions/list.lisp index 71c65f2..0beb994 100644 --- a/src/standard-descriptions/list.lisp +++ b/src/standard-descriptions/list.lisp @@ -1,8 +1,38 @@ (in-package :lisp-on-lines) -(define-description cons () + +(define-layered-class list-attribute (standard-attribute) + ((item-args :initform nil :initarg :item :layered t :special t))) + +(define-layered-method display-attribute-value + ((attribute list-attribute)) + (generic-format *display* "(") + (let ((list (attribute-value attribute))) + + (loop + :for cons :on list + :do (let ((item (first cons +))) + (dletf (((attribute-object attribute) item)) + (apply #'display *display* item (slot-value attribute 'item-args)) + (unless (endp (cdr cons)) + (generic-format *display* " ")))))) + (generic-format *display* ")")) + + + + + + +(define-description list () + ((list :attribute-class list-attribute + :function #'identity + :attributes nil))) + +(define-description cons (list) ((car :label "First" :function #'car) - (cdr :label "Rest" :function #'cdr))) + (cdr :label "Rest" :function #'cdr) + )) (define-description cons () ((editp :value t :editp nil) @@ -10,6 +40,10 @@ (cdr :setter #'rplacd)) (:in-description editable)) +(define-description cons () + ((active-attributes :value '(list))) + (:in-description inline)) + (define-layered-method description-of ((c cons)) (find-description 'cons))