SRFI-26はカリー化を除いたパラメタの特殊化表記です。日本語にすると意味が分かりませんが(正しく訳せているのかすら疑問) 、要するに
cutとcuteです。どちらも手続きを作成するマクロです。使い方は以下:
(cut cons a <>) ;; -> (lambda (tmp) (cons a tmp)) (cut list a <> <>) ;; -> (lambda (tmp1 tmp2) (list a tmp1 tmp2)) (cut list a <> <...>) ;; -> (lambda (tmp1 . xs) (apply list a tmp1 xs)) (cute cons (+ a 1) <>) ;; -> (let ((a1 (+ a 1))) (lambda (tmp) (cons a1 tmp)))どちらのマクロも第一引数を手続きとみなし、残りをその手続きの引数とします。
<>及び<...>はプレースホルダーで、作成された手続きに渡される引数に置換されます。出現する順番どおりに引数に展開されます。cutは引数をそのままlambdaに展開し、cuteの方はプレースホルダーである<>以外の引数を評価を一度だけ行うことを保障します。プレースホルダーの使い方ではまるのが以下の例です。
(cut cons a (list b <>)) ;; -> (lambda () (cons a (list b <>)))プレースホルダーは
cutもしくはcuteと同じ深さにいないといけません。個人的にこれは不便だなぁと思う点ではあるのですが、ネストを考慮するとsyntax-rulesで書けない(もしくはものすごく頑張らないといけない)ので、まぁしょうがないのではないでしょうか。今回はSRF-26を紹介しました。
No comments:
Post a Comment