【バグを踏んでたらしい】let-argsを使ってみたら、よく分からない挙動をした。。。
2013/06/23 追記
ということで、報告から12時間しないうちに直されてしまいました。
@ayato_p いや、そりゃ Gauche のバグっぽいですね。
2013-06-23 09:26:52 via web to @ayato_p
@SaitoAtsushi @ayato_p バグですね。しかし妙な挙動だな…
2013-06-23 09:37:11 via web to @SaitoAtsushi
@anohana @ayato_p disasm を見るとデフォルト値を先に push してしまっているように見えますね。 set! で元の変数を変えても既に push されている値で手続きが呼出されるってことでしょうか。
2013-06-23 09:40:23 via web to @anohana
@SaitoAtsushi @ayato_p わかりました。最適化パスが(let ((a expr)) (f c a)) のパターンを (f c expr) に置き換えてるんですが、exprが副作用でcを変更してるとこの変換は不正となります。
2013-06-23 11:46:41 via web to @SaitoAtsushi
@SaitoAtsushi @ayato_p 直ったと思います。URL
2013-06-23 18:01:25 via web to @anohana
元の本文は以下
Gaucheのlet-argsを使ってみたら、よく分からない挙動をしたのでメモ。
初めて使うので、どうやって使うのかをリファレンスのこの辺を読んで書いてみていた。
とりあえず、こんなのをテスト的に書いてみた。
#!/usr/local/bin/gosh (use gauche.parseopt) (define (show-params v rest) (print "volume : " v) (print "rest : " rest)) (define (main args) (let-args (cdr args) ((volume "volume=i" 5) . rest) (show-params volume rest)))
このスクリプトを次のように実行してみると
% ./test.scm -volume 12 "Hello"
volume : 5
rest : (Hello)
こうなりました。なんか欲しかった結果と違う…。
デフォルト値ではなくて、引数として渡した12が出力されると思ったんだけど…。
もう少し試してみる。
(define (show-volume v) (print "volume : " v)) (define (main args) (let-args (cdr args) ((volume "volume=i" 5) . rest) (show-volume volume)))
これは
% ./test.scm -volume 12
volume : 12
こうなる。あれー?
もう少し試してみる。
(define (main args) (let-args (cdr args) ((volume "volume=i" 5) . rest) (print "volume : " volume) (print "rest : " rest)))
これは
% ./test.scm -volume 12 "Hello"
volume : 12
rest : (Hello)
こうなる。
最後にもうひとつ。
(define (main args) (let-args (cdr args) ((volume "volume=i" 5) . rest) (show-params volume (car rest))))
% ./test.scm -volume 12 "Hello"
volume : 12
rest : Hello
ということで結局、一番最初の書き方だけが引数として渡した値ではなく、デフォルトの値を使ってしまうようで…。
最初、何が悪いのか全く分からなくて色んな書き方をした結果、僕の書き方が悪そうという結論に至った。。。