今日の一行

今日の一行(お題)flips への解答

組み合わせの数え上げは util.combinations にあると教えて頂きました。

自然数のリストを並べ替えて、それをもとに引数を並び替える、というのがダサい。生成された関数では、すでに並び替えが終わっている、と言う風に出来ないだろうか?

生成された関数が引数の数をチェックしないのもダサい。

(use util.combinations)
(use srfi-1)

(define (keysort key value)
  (map cdr
       (sort (fold acons () key value)
             (lambda (x y) (< (car x) (car y))))))

(define (flips-n n)
  (lambda (f)
    (map (lambda (x)
           (lambda args
             (apply f (keysort x args))))
         (permutations (iota n 1)))))

(define (main args)
  (map (lambda (f) (f 'a 'b 'c))
       ((flips-n 3) print)))

修正: 自然数の生成に iota を使うように。

さらに修正: alist を acons で作るように