gencomp 確認 (9)
昨晩疲労困憊により途中終了。昼間は元気なので頑張ります。ってかいい加減さくっと済ませれ、という声が遠くから聞こえてくるような気が (ry
昨晩のナニをさらに置き換えてみる。
(define @ (getter-with-setter (lambda args (let ((len (length args))) (cond ((find (lambda (p) (procedure-arity-includes? p len)) '((lambda (obj selector) (ref obj selector)) (lambda (obj selector . more) (apply @ (ref obj selector) more)))) => (cut apply <> args)) (else (error "wrong number of arguments to case-lambda:" args))))) (lambda args (let ((len (length args))) (cond ((find (lambda (p) (procedure-arity-includes? p len)) '((lambda (obj selector val) ((setter ref) obj selector val)) (lambda (obj selector selector2 . rest) (apply (setter ref) (ref obj selector) selector2 rest)))) => (cut apply <> args)) (else (error "wrong number of arguments to case-lambda:" args)))))))
で、結局 procedure-arity-includes? って引数の数がナニ。
gosh> (ref (lambda (obj selector) (ref obj selector)) 'required) 2 gosh> (ref (lambda (obj selector . more) (apply @ (ref obj selector) more)) 'required) 2 gosh> (ref (lambda (obj selector . more) (apply @ (ref obj selector) more)) 'optional) #t gosh>
あー。これ、日本語で表現できかねてるんですが確かに便利かも。コメントにもある通り、こうなるっちゃこうなりますな。
;; [@ a b c d] => (ref (ref (ref a b) c) d)
literal.scm 続き
と、言いつつ出掛けてきます。そろそろ Shibuya.lisp 始まるな ...