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