Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-12-06

部分適用のリーダーマクロ

| 23:13 | 部分適用のリーダーマクロ - わだばLisperになる を含むブックマーク はてなブックマーク - 部分適用のリーダーマクロ - わだばLisperになる

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

(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

以上、ありきたりな思い付きを垂れ流し。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20101206