[Openmcl-devel] square bracket list

Taoufik Dachraoui dachraoui.taoufik at gmail.com
Sun Jul 24 10:55:39 PDT 2011


Thank you, it is great

Kind regards
Taoufik

On Sun, Jul 24, 2011 at 7:08 PM, Joshua TAYLOR <joshuaaaron at gmail.com> wrote:
> On Sun, Jul 24, 2011 at 6:07 AM, Taoufik Dachraoui
> <dachraoui.taoufik at gmail.com> wrote:
>> to be more precise, is there a way to print lists depending on the car
>> of the list
>>  (cond
>>   ((eq (car lst) #\[) (print list using [...]))
>>   ((eq (car lst) #\{) (print list using {...}))
>>   (t (print list using (...))))
>
> Pascal already responded with a solution that you said works for you.
> Here's one that's a bit shorter, and uses the lisp pretty printer.
> Pretty print dispatch tables dispatch to a printing function based on
> matching type specifiers to objects, and fortunately there's a (cons
> car-type cdr-type) type specifier, and an (eql X) type specifier, so
> your special lists can be matched.  E.g.,
>
> CL-USER > (typep '(#\[ 1 2 3) '(cons (eql #\[) t))
> T
>
> So, here's a solution using that technique:
>
>
>
> (defparameter *list-pprint-dispatch*
>  (copy-pprint-dispatch))
>
> (defun special-list-printer (left right)
>  #'(lambda (stream list)
>      (pprint-logical-block (stream list :prefix left :suffix right)
>        (pprint-linear stream (rest list) nil))))
>
> (set-pprint-dispatch '(cons (eql #\[) t)
>                     (special-list-printer "[" "]")
>                     0 *list-pprint-dispatch*)
>
> (set-pprint-dispatch '(cons (eql #\{) t)
>                     (special-list-printer "{" "}")
>                     0 *list-pprint-dispatch*)
>
> (defun special-print (object)
>  (write object
>         :pprint-dispatch *list-pprint-dispatch*
>         :pretty t))
>
>
>
> Basic usage:
>
> CL-USER 10 > (special-print '(1 2 (#\[ 3 4) (#\{ 5 6) 7 8))
> (1 2 [3 4] {5 6} 7 8)
> (1 2 (#\[ 3 4) (#\{ 5 6) 7 8)
>
> Since it uses the pretty printer, it can even deal with long lists and
> circular structures (sort of;  the result won't be READable,
> obviously):
>
> CL-USER 12 > (special-print `(1 2 (#\[ ,@(make-list 20) (#\{ 5 6) 7 8)))
> (1
>  2
>  [NIL
>  NIL
>  ...
>  NIL
>  NIL
>  {5 6}
>  7
>  8])
>
> CL-USER 15 >
> (let ((sq (list 3 4)))
>  (nconc sq sq)
>  (special-print (list 1 2 (cons #\{ sq) 5 6)))
> (1 2 {#1=3 4 . #1#} 5 6)
>
> Hope this is of interest to you.
>
> //JT
>
> --
> Joshua Taylor, http://www.cs.rpi.edu/~tayloj/
>



More information about the Openmcl-devel mailing list