[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