CLでSRFI-31 — #:g1

Posted 2011-12-20 06:15:00 GMT

CLでSRFI、今回は、SRFI-31の「再帰的評価のための rec 特殊フォーム」です。

SRFI 7には、requires等の依存ライブラリを指定する方法がありますが、対話的に使用することは考慮されていなかったり、実際に必要なライブラリをロードするかどうかは規定されていないとのことで、その辺りをどうにかするもののようです。

動作

(labels ((|funcall . cdr| (x times)
           (if (>= 1 times)
               (funcall (cdr x))
               (funcall (cdr (|funcall . cdr| x (1- times)))) )))
  (let ((x (rec s (cons 1 (lambda () s)))))
    (list (car x)
          (car (|funcall . cdr| x 1))
          (car (|funcall . cdr| x 2))
          (car (|funcall . cdr| x 3))
          (car (|funcall . cdr| x 4)) )))
;=> '(1 1 1 1 1)

(funcall
 (rec (F N)
      (funcall
       (rec (G K L)
            (if (zerop K) L
                (G (- K 1) (* K L)) )) N 1))
 10 )
;=> 3628800
再帰的構造を作るのに使うのと、関数の定義。関数定義の方は、alambda的とも言えるでしょうか。
あー、funcallかー、という感じですが、まあ、しょうがないです :)

移植について

mbeを使えば、何の変更もなく動きます。
CLでletrecをどう表現するかに毎度悩みますが、まだしっくりくる落とし所が分かっていません…。

comments powered by Disqus