Plaster

common-lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Example 1 ;; (1) (let ((foo 10) (bar '(20 30))) `(,foo ,@bar baz)) ;; (2) (let ((foo 10) (bar '(20 30))) `(,foo ,@bar baz . nil)) ;; (3) (let ((foo 10) (bar '(20 30))) (append (list foo) bar (list `baz) 'nil)) ;; (4) (let ((foo 10) (bar '(20 30))) (append (list foo) bar (list 'baz) 'nil)) ;; => (10 20 30 baz) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Example 2 ;; (1) (let ((foo 10) (bar 20)) ``(format t "foo: ~a~%bar: ~a~%sum: ~a~%" ,',foo ,',bar ,(+ ,foo ,bar))) ;; (2) (let ((foo 10) (bar 20)) ``(format t "foo: ~a~%bar: ~a~%sum: ~a~%" ,',foo ,',bar ,(+ ,foo ,bar) . nil)) ;; (3) (let ((foo 10) (bar 20)) `(append (list `format) (list `t) (list "foo: ~a~%bar: ~a~%sum: ~a~%") (list ',foo) (list ',bar) (list (+ ,foo ,bar)) 'nil)) ;; (4) (let ((foo 10) (bar 20)) `(append (list 'format) (list 't) (list "foo: ~a~%bar: ~a~%sum: ~a~%") (list ',foo) (list ',bar) (list (+ ,foo ,bar)) 'nil)) ;; (5) (let ((foo 10) (bar 20)) `(append (list 'format) (list 't) (list "foo: ~a~%bar: ~a~%sum: ~a~%") (list ',foo) (list ',bar) (list (+ ,foo ,bar)) 'nil . nil)) ;; (6) (let ((foo 10) (bar 20)) (append (list `append) (list `(list 'format)) (list `(list 't)) (list `(list "foo: ~a~%bar: ~a~%sum: ~a~%")) (list `(list ',foo)) (list `(list ',bar)) (list `(list (+ ,foo ,bar))) (list `'nil) 'nil)) ;; (7) (let ((foo 10) (bar 20)) (append (list 'append) (list `(list 'format . nil)) (list `(list 't . nil)) (list `(list "foo: ~a~%bar: ~a~%sum: ~a~%" . nil)) (list `(list ',foo . nil)) (list `(list ',bar . nil)) (list `(list (+ ,foo ,bar) . nil)) (list ''nil) 'nil)) ;; (8) (let ((foo 10) (bar 20)) (append (list 'append) (list (append (list `list) (list `'format) 'nil)) (list (append (list `list) (list `'t) 'nil)) (list (append (list `list) (list `"foo: ~a~%bar: ~a~%sum: ~a~%") 'nil)) (list (append (list `list) (list `',foo) 'nil)) (list (append (list `list) (list `',bar) 'nil)) (list (append (list `list) (list `(+ ,foo ,bar)) 'nil)) (list ''nil) 'nil)) ;; (9) (let ((foo 10) (bar 20)) (append (list 'append) (list (append (list 'list) (list ''format) 'nil)) (list (append (list 'list) (list ''t) 'nil)) (list (append (list 'list) (list '"foo: ~a~%bar: ~a~%sum: ~a~%") 'nil)) (list (append (list 'list) (list `(quote ,foo . nil)) 'nil)) (list (append (list 'list) (list `(quote ,bar . nil)) 'nil)) (list (append (list 'list) (list `(+ ,foo ,bar . nil)) 'nil)) (list ''nil) 'nil)) ;; (10) (let ((foo 10) (bar 20)) (append (list 'append) (list (append (list 'list) (list ''format) 'nil)) (list (append (list 'list) (list ''t) 'nil)) (list (append (list 'list) (list '"foo: ~a~%bar: ~a~%sum: ~a~%") 'nil)) (list (append (list 'list) (list (append (list `quote) (list foo) 'nil)) 'nil)) (list (append (list 'list) (list (append (list `quote) (list bar) 'nil)) 'nil)) (list (append (list 'list) (list (append (list `+) (list foo) (list bar) 'nil)) 'nil)) (list ''nil) 'nil)) ;; (11) (let ((foo 10) (bar 20)) (append (list 'append) (list (append (list 'list) (list ''format) 'nil)) (list (append (list 'list) (list ''t) 'nil)) (list (append (list 'list) (list '"foo: ~a~%bar: ~a~%sum: ~a~%") 'nil)) (list (append (list 'list) (list (append (list 'quote) (list foo) 'nil)) 'nil)) (list (append (list 'list) (list (append (list 'quote) (list bar) 'nil)) 'nil)) (list (append (list 'list) (list (append (list '+) (list foo) (list bar) 'nil)) 'nil)) (list ''nil) 'nil)) ;; => (append (list 'format) (list 't) (list "foo: ~a~%bar: ~a~%sum: ~a~%") (list '10) (list '20) (list (+ 10 20)) 'nil) ;; => (format t "foo: ~a~%bar: ~a~%sum: ~a~%" 10 20 30) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Example 3 ;; (1) (let ((var '((list 10)))) ``(foo ,@,@var)) ;; (2) (let ((var '((list 10)))) ``(foo ,@,@var . nil)) ;; (3) (let ((var '((list 10)))) `(append (list `foo) ,@var 'nil)) ;; (4) (let ((var '((list 10)))) `(append (list 'foo) ,@var 'nil . nil)) ;; (5) (let ((var '((list 10)))) (append (list `append) (list `(list 'foo)) var (list `'nil) 'nil)) ;; (6) (let ((var '((list 10)))) (append (list 'append) (list `(list 'foo . nil)) var (list ''nil) 'nil)) ;; (7) (let ((var '((list 10)))) (append (list 'append) (list (append (list `list) (list `'foo) 'nil)) var (list ''nil) 'nil)) ;; (8) (let ((var '((list 10)))) (append (list 'append) (list (append (list 'list) (list ''foo) 'nil)) var (list ''nil) 'nil)) ;; => (append (list 'foo) (list 10) 'nil) ;; => (foo 10) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; The ,,@ idiom (used by ONCE-ONLY) ;; (1) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) `(list ,zoinks (,,@bar)))) ;; (2) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) `(list ,zoinks (,,@bar) . nil))) ;; (3) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) (append (list `list) (list zoinks) (list `(,,@bar)) 'nil))) ;; (4) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) (append (list 'list) (list zoinks) (list `(,,@bar . nil)) 'nil))) ;; (5) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) (append (list 'list) (list zoinks) (list (append (list ,@bar) 'nil)) 'nil))) ;; (6) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) `(let ((zoinks ,foo)) (append (list 'list) (list zoinks) (list (append (list ,@bar) 'nil)) 'nil) . nil)) ;; (7) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list `let) (list `((zoinks ,foo))) (list `(append (list 'list) (list zoinks) (list (append (list ,@bar) 'nil)) 'nil)) 'nil)) ;; (8) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list `((zoinks ,foo)) . nil) (list `(append (list 'list) (list zoinks) (list (append (list ,@bar) 'nil)) 'nil . nil)) 'nil)) ;; (9) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list `(zoinks ,foo)) 'nil)) (list (append (list `append) (list `(list 'list)) (list `(list zoinks)) (list `(list (append (list ,@bar) 'nil))) (list `'nil) 'nil)) 'nil)) ;; (10) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list `(zoinks ,foo . nil)) 'nil)) (list (append (list 'append) (list `(list 'list . nil)) (list `(list zoinks . nil)) (list `(list (append (list ,@bar) 'nil) . nil)) (list ''nil) 'nil)) 'nil)) ;; (11) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list `zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list `list) (list `'list) 'nil)) (list (append (list `list) (list `zoinks) 'nil)) (list (append (list `list) (list `(append (list ,@bar) 'nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; (12) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list 'zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list 'list) (list ''list) 'nil)) (list (append (list 'list) (list 'zoinks) 'nil)) (list (append (list 'list) (list `(append (list ,@bar) 'nil . nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; (13) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list 'zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list 'list) (list ''list) 'nil)) (list (append (list 'list) (list 'zoinks) 'nil)) (list (append (list 'list) (list (append (list `append) (list `(list ,@bar)) (list `'nil) 'nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; (14) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list 'zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list 'list) (list ''list) 'nil)) (list (append (list 'list) (list 'zoinks) 'nil)) (list (append (list 'list) (list (append (list 'append) (list `(list ,@bar . nil)) (list ''nil) 'nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; (15) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list 'zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list 'list) (list ''list) 'nil)) (list (append (list 'list) (list 'zoinks) 'nil)) (list (append (list 'list) (list (append (list 'append) (list (append (list `list) bar 'nil)) (list ''nil) 'nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; (16) (let ((foo 10) (bar '((+ 1 1) (+ 2 2)))) (append (list 'let) (list (append (list (append (list 'zoinks) (list foo) 'nil)) 'nil)) (list (append (list 'append) (list (append (list 'list) (list ''list) 'nil)) (list (append (list 'list) (list 'zoinks) 'nil)) (list (append (list 'list) (list (append (list 'append) (list (append (list 'list) bar 'nil)) (list ''nil) 'nil)) 'nil)) (list ''nil) 'nil)) 'nil)) ;; => (let ((zoinks 10)) (append (list 'list) (list zoinks) (list (append (list (+ 1 1) (+ 2 2)))))) ;; => (list 10 (2 4)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; The ,@,@ idiom ;; (1) (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there)) ;; (2) (let ((there '((list :x 1) (list :y 2)))) ``(hello ,@,@there . nil)) ;; (3) (let ((there '((list :x 1) (list :y 2)))) `(append (list `hello) ,@there 'nil)) ;; (4) (let ((there '((list :x 1) (list :y 2)))) `(append (list `hello) ,@there 'nil . nil)) ;; (5) (let ((there '((list :x 1) (list :y 2)))) `(append (list 'hello) ,@there 'nil . nil)) ;; (6) (let ((there '((list :x 1) (list :y 2)))) (append (list `append) (list `(list 'hello)) there (list `'nil) 'nil)) ;; (7) (let ((there '((list :x 1) (list :y 2)))) (append (list 'append) (list `(list 'hello . nil)) there (list ''nil) 'nil)) ;; (8) (let ((there '((list :x 1) (list :y 2)))) (append (list 'append) (list (append (list `list) (list `'hello) 'nil)) there (list ''nil) 'nil)) ;; (9) (let ((there '((list :x 1) (list :y 2)))) (append (list 'append) (list (append (list 'list) (list ''hello) 'nil)) there (list ''nil) 'nil)) ;; => (append (list 'hello) (list :x 1) (list :y 2) 'nil) ;; => (hello :x 1 :y 2)