2010/09/23

番号付き部分適用 cutn

srfi-26 の cut を使ってると (cut list 1 <0> 3 <1> 4) って書けたら・・・なんて思います。衛生的なマクロではありませんが、試しに書いてみました。

使用例はこんな感じ。<...> は考慮していません。あと、(cutn list <0> <1> (* <0> <0>)) のようなネストしたものは cut 同様考慮していません。
((cutn list <1> <0> <1> <2> <0>) 1 2 3)
;; (2 1 2 3 1)
(let1 i 9
((cutn list <0> <1> <2> <0> <1> <2>) i (inc! i) (inc! i)))
;; (9 10 11 9 10 11)
((cutn list 1 <1> 3 <0> 5) 4 2)
;; (1 2 3 4 5)
((cutn list 1 <1> <1> <1> 3 <0> 5) 4 2)
;; (1 2 2 2 3 4 5)
((cutn list <0> ((cutn list <0>) <0>) <0>) 1)
;; (1 (1) 1)
(let1 i 9
((cutn list <0> ((cutn list <0>) <0>) <0>) (inc! i)))
;; (10 (10) 10)
(let1 i 9
((cutn list <0> ((cutn list <0>) (inc! <0>)) <0>) (inc! i)))
;; (10 (11) 11)

(最後の例が微妙な気もする)

cutn のコードはこちら。
(use liv.lol.defmacro) ; defmacro!
(use liv.onlisp.symbols) ; explode
(use liv.cl) ; cl:remove-duplicates
(use srfi-1) ; unfold
(define (cutn-symbol? sym)
(and (symbol? sym)
(let1 symls (explode sym)
(and (eq? '< (car symls))
(number? (x->integer (cadr symls)))
(eq? '> (caddr symls))))))
(define (gen-cutn-symbols . params)
(let1 cnt 0
(apply unfold null? (lambda _
(rlet1 r (symb '< cnt '>)
(inc! cnt))) cdr params)))
(define (symbol<? a b)
(string<? (symbol->string a)(symbol->string b)))
(defmacro! (cutn . body)
(let ((g!cs (sort (filter cutn-symbol?
(cl:remove-duplicates body))
symbol<?)))
`(lambda ,g!cs
,body)))
view raw cutn.scm hosted with ❤ by GitHub


うーん。

LET OVER LAMBDA Edition 1.0

0 件のコメント:

コメントを投稿