特に今までつかってなかったけど、protocolが結構便利。
例えばこんな例:
(define-record-type something (fields (mutable f1) (mutable f2) (mutable f3)))上記のレコードsomethingはfieldsとしてf1~f3まで持つけど、初期化時にコンストラクタに値を渡さないかもしれない。上記の例では必ず
(make-something #f #f #f)なんて書かないといけないが、protocolを定義すると事情が変わってくる。
(define-record-type something (fields (mutable f1) (mutable f2) (mutable f3)) (protocol (lambda (p) (lambda args (let-optionals* args ((f1 #f) (f2 #f) (f3 #f)) (p f1 f2 f3))))))let-optionals*は探せばいろいろあると思うけど、Sagittariusでは(sagittarius control)ライブラリで提供。こうすると上記のmake-somethingがこんな風に書ける
(make-something 'value)ここまでは、まぁ割と当たり前なんだけど、Sagittariusの一つの特徴としてキーワードを認識する。っで、キーワードを使ってこんな風に書ける。
#!compatible ;; キーワードはr6rsモードでは動かない (import (rnrs) (sagittarius control)) ;; let-keywords let-keywords*もこの中 (define-record-type something (fields (mutable f1) (mutable f2) (mutable f3)) (protocol (lambda (p) (lambda args (let-keywords args ((f1 #f) (f2 #f) (f3 #f)) (p f1 f2 f3)))))) (make-something :f3 'value)let-keywordsはGaucheからもらってます。これが地味に便利。フィールドが少ないうちはそんなに感じないけど、10個くらいあって、7番目だけ値を入れたいなんて場合にこれが活躍してくる。難点は、全部に値を設定したい場合に一々キーワードを書かないといけないところか。ま、トレードオフだろう。
No comments:
Post a Comment