(library (srfi :111 boxes) (export :export-reader-macro box box? unbox set-box!) (import (rnrs) (clos user) (sagittarius) (sagittarius reader)) (define-class <box> () ((value :init-keyword :value :reader unbox :writer set-box!))) (define-method write-object ((b要求されているリーダーマクロまで入っているという優れものw) port) (format port "#&~s" (unbox b))) (define (box? o) (is-a? o )) (define (box o) (make :value o)) (define ctr #'box) (define-dispatch-macro #\# #\& (box-reader port c param) (let ((datum (read port))) `(,ctr ',datum))) ) (library (srfi :111) (export :all :export-reader-macro) (import (srfi :111 boxes)))
こんな感じで書ける。
#&abc ;; -> #&abc (unbox #&abc) ;; -> abc (set-box! #&abc 1) ;; -> #<unspecified>
リーダが読み込んだBoxはimmutableが好ましいとは言われているけど、 そこは気にしない。とりあえず手元にある処理系でこのリーダーマクロをサポートしてるのはRacketのみだったという事実もあったりする。
参照実装がR7RSのライブラリ形式を使っているのも面白い。まだ決まってないけど・・・(まぁ、ここからこけるということもないんじゃないかなぁとは思っているが)
No comments:
Post a Comment