naoto #4333(2007/11/22 10:19 GMT) [ Scheme ] Rating0/0=0.00
n=5 m=3 の場合、
(reverse (list-ec (: a 6) (: b 6) (: c 6) (if (= 5 (+ a b c))) (list a b c)))
というコードが生成されれば良い。
→マクロで書いてみる。
→nとmがコンパイル時に決まらないから無理?
→生成したコードをevalする方針に変更。
とこんな風になりました。
;; comprehensionと再起の組み合わせであんなに短く書けるとは。
1 2 3 4 5 6 7 8 9 10 11 12 13
(use srfi-1) (use srfi-42) (define (quolifiers upper-bound n-quos) (let1 gensyms (map (lambda (x) (gensym)) (iota n-quos)) (values gensyms (map (lambda (sym) `(: ,sym ,upper-bound)) gensyms)))) (define (partition-num n m) (receive (syms form) (quolifiers (+ n 1) m) (eval `(reverse (list-ec ,@form (if (= ,n (+ ,@syms))) (list ,@syms))) scheme-report-environment)))
Rating0/0=0.00-0+
1 reply [ reply ]
naoto
#4333()
[
Scheme
]
Rating0/0=0.00
n=5 m=3 の場合、
(reverse (list-ec (: a 6) (: b 6) (: c 6) (if (= 5 (+ a b c))) (list a b c)))
というコードが生成されれば良い。
→マクロで書いてみる。
→nとmがコンパイル時に決まらないから無理?
→生成したコードをevalする方針に変更。
とこんな風になりました。
;; comprehensionと再起の組み合わせであんなに短く書けるとは。
Rating0/0=0.00-0+