Scheme scripting

amb てこういう使い方するもんなんだろうか。それ専用の (効率的な) 関数がありそうだけど、見当たらないし。assert っていうのは SICP でいう require。

(guard (exc ((eq? exc 'no-solution) #t))
       (let ((type (amb "Syntax" "Procedure"))
	     (args (amb "Fixed" "Variadic"))
	     (tail (amb "" "TailRec"))
	     (mand (apply amb (iota 16))))
	 (my-print-routine type args tail mand)
	 (assert #f)))
=> 出力が
void Scm_RegisterSyntaxFixed0(...){...}
void Scm_RegisterSyntaxFixed1(...){...}
void Scm_RegisterSyntaxFixed2(...){...}
:
void Scm_RegisterProcedureFixed0(...){...}
:

まぁ欲しいもんが出るからいっか。