部分適用のリーダーマクロ — #:g1

Posted 2010-12-06 14:13:00 GMT

ディスパッチマクロ文字の数引数が上手く使えたりするかも、と思い、

(set-dispatch-macro-character #\# #\[ #'|#[-reader|)
(set-syntax-from-char #\] #\) )

(defun |#[-reader| (s c n) (declare (ignore c)) (let ((gs (collect (subseries (#Mgensym) 0 n)))) `(lambda (,@gs) (,(read s T nil T) ,@(read-delimited-list #\] s T) ,@gs))))

のようなものを書いてみましたが、
(#[list] :foo)
;=> (:FOO)

(#0[list]) ;=> NIL

(#2[list] 3 3) ;=> (3 3)

(#[string= :nil] :nil) ;=> T

(let* ((ss '("a" "abc" "abcdef")) (max (reduce #'max (cons "" ss) :key #'length))) (map nil (o #'prn #[rjust max]) ss)) ;-> a ; abc ; abcdef ; ;=> NIL

;; //// ;; prn: Arcから (defun prn (&rest args) (apply #'pr args) (terpri))

;; rjust Rubyから (defun rjust (width string) (format nil "~V,@A" width string))

;; o: Cleanから (setf (symbol-function 'o) #'kl:compose)

あまりぱっとしません。
Gaucheの$の方が便利な感じ
(let* ((ss '("a" "abc" "abcdef"))
       (max (apply #'max (mapcar #'length ss))))
  (map nil ($ prn $ rjust max $) ss))
;->      a
;      abc
;   abcdef
;
;=> NIL
以上、ありきたりな思い付きを垂れ流し。

comments powered by Disqus