読者です 読者をやめる 読者になる 読者になる

(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

【バグを踏んでたらしい】let-argsを使ってみたら、よく分からない挙動をした。。。

Scheme Gauche

2013/06/23 追記

ということで、報告から12時間しないうちに直されてしまいました。

元の本文は以下

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

ということで結局、一番最初の書き方だけが引数として渡した値ではなく、デフォルトの値を使ってしまうようで…。
最初、何が悪いのか全く分からなくて色んな書き方をした結果、僕の書き方が悪そうという結論に至った。。。