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 始まるな ...