こんな風にsrc/compile.scmをいじって
--- src/compile.scm 13 Aug 2005 06:51:52 -0000 1.33 +++ src/compile.scm 10 Dec 2005 10:29:12 -0000 @@ -33,11 +33,18 @@ ;;; $Id: compile.scm,v 1.33 2005/08/13 06:51:52 shirok Exp $ ;;; -(define-module gauche.internal +(define-module gauche.internal.test (use srfi-2) (use util.match) ) -(select-module gauche.internal) +(select-module gauche.internal.test) +(with-module gauche.internal (export-all)) +(import gauche.internal) + +(define-syntax eval-when + (syntax-rules () + ((_ (situation ...) body ...) + (begin body ...)))) ;;; THE COMPILER ;;;
goshでロードするといろいろと遊べる。
$ gosh -I src -l compile.scm -E 'select-module gauche.internal.test' gosh> (define p1 (pass1 '((lambda (x) x) 1) (make-bottom-cenv))) gosh> (define p2 (pass2 p1)) gosh> (define p3 (pass3 p2 (make-compiled-code-builder 0 0 '%toplevel #f #f) '() 'tail)) gosh> p1 #(13 (#0=(lambda (x) x) 1) #(9 #0# #f 1 0 (#1=#(lvar x #<undef> 1 0)) #(1 #1#) #f () ()) (#(5 1)) #f ()) gosh> p2 #(5 1) gosh> (vm-dump-code p3) main_code (name=%toplevel, code=0x9001eb8, size=2, const=0, stack=0): args: #f 0 CONSTI(1) 1 RET
ちなみに以前gauche.vm.disasmにあったdisasmはgauche.procedureに移ったようだ。
$ gosh -ugauche.procedure gosh> (define a (lambda (x y) (+ x y))) a gosh> (disasm a) main_code (name=a, code=0x86e3e20, size=4, const=0, stack=1): args: #f 0 LREF1-PUSH ; x 1 LREF0 ; y 2 NUMADD2 ; (+ x y) 3 RET
compile.scm中で定義されているマクロを使う必要性が無いときにはcompile-p1などを使えばcompile.scmに 手を加えなくてもコンパイル過程を見ることが出来る。
$ gosh gosh> (with-module gauche.internal (compile-p1 '((lambda (x) x) 1))) ($call ($lambda[#f;0] (x[1;0]) ($lref x[1;0])) ($const 1))
ここ最近Gaucheばっかり触っていたので、急にxyzzy用のライブラリなんかを書き出すとちょっと戸惑う。 loopや「(while (setq ...」なんてのもそうだけど、単体テスト用のフレームワークがないのが思った以上に 辛かったので作成。キー一つでテストが走るっていうのは思った以上に重要です。