#parameterの動きがよくわからないケースがあるのです。
##condのelse節で、いきなりparameterizeの外側の値が返っているような感じで。
#replからでなく、直接動かした場合でした。replからなら動きますね。
#; gauche youtube contents
(use gauche.lazy)
(use file.util)
(use komono-glob) ; 遅延glob http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3a%E9%81%85%E5%BB%B6glob
(use xrepl.pp)
($ repl-print
$ lmap file->sexp-list
$ glob-lseq "*.youtube.scm")
#このように、lseqを食わせているのですが、printなら出力されて、repl-printなら、
#()が帰ってくるのですが、これはlseqの処理をrepl-printに追加しなければならないということでしょうか?
#schemeからはlseqかどうかはわからないとマニュアルにあるのですけれど、どうやればいいのかと迷っています。
#(set! <location> <value>) の意味は、次に<location>を評価した時<value>が返るようにする、ということです。それ以外の余分な動作をset!にさせるべきではないと思います。余分な動作をさせたないなら名前を変える(実際に行う動作を反映させる)べきでしょうね。
#parameterizeのそれは、途中に遅延評価が挟まっているために、parameterizeの範囲を抜けた後で該当コードが評価されちゃってる、という可能性がありますね。pp.scmは遅延シーケンスを作る前に書いたのでそのへん考慮が足りないかも。もうちょい問題を再現するコードを絞り込んでみてください(なるべく外部ライブラリに頼らない形で。)
#こういう、遅延評価と動的環境の干渉は遅延評価のある言語にはつきもので、対策は「動的環境内で処理したい分のデータ構造は陽に現実化しておく (clojureならdoseqするとか) というものです。lseqかどうかを判定する必要は通常はありません。
#あーでも部分継続で動的環境が戻ってない、というバグの可能性はあるな。
#(use xrepl.pp)
(use gauche.generator)
(use gauche.lazy)
($ repl-print
$ generator->lseq
$ (cute gtake <> 10)
$ generate (^y (y 1)) )
#>gosh /home/shuji/gauche/debug/test.scm
*** ERROR: hash table required, but got #f
Stack Trace:
_______________________________________
0 (hash-table-put! (rp-dict) obj #t)
At line 80 of "/home/shuji/gauche/xrepl/pp.scm"
1 (scan-shared obj 0 0)
At line 234 of "/home/shuji/gauche/xrepl/pp.scm"
#cuteはcutのつもりで打っていたのですが、cutでも同じでした。
#これはreplでも再現します。
#gosh> ($ print $ generator->lseq $ generate (^y (y 1)))
(1)
#<undef>
gosh> ($ repl-print $ generator->lseq $ generate (^y (y 1)))
*** ERROR: hash table required, but got #f
##(define simple-obj--? identity)
(define simple-obj?
(any-pred number? boolean? char? port? symbol? null?
(cut member <> '("" #() ) ) ) )
simple-obj?をidentityにすると動いて、元のものだとNGです。
#(define simple-obj? (cut member <> '("" #() ) ))
でNGです。・・・・・なにが問題なのかよくわからなくなってきました。
#つまり、simple-obj?で遅延シーケンスをみてしまうと、parametalizeの外側を参照するようになるみたいです。
#(define (simple-obj? x)
#?=(rp-dict) ; -----> OK
(write x) (flush) ; <---- ここで遅延シーケンスを読む。(1)を出力する
#?=(rp-dict) ; <---- NG parametarizeの外側の値となる。
#(use gauche.generator)
(use gauche.parameter)
(define rp-dict (make-parameter #f))
(let1 obj ($ generator->lseq $ generate (^y (y 1)) )
(parameterize ( [rp-dict "hoge" ] )
#?=(rp-dict)
(write obj) (flush)
#?=(rp-dict) ) )
#>gosh /home/shuji/gauche/debug/test.scm
#?="/home/shuji/gauche/debug/test.scm":8:(rp-dict)
#?- "hoge"
(1)#?="/home/shuji/gauche/debug/test.scm":10:(rp-dict)
#?- #f
>Exit code: 0
#こんにちは。
#>gosh
#gosh> '(-i)
(0.0-1.0i)
と評価されるのは想定された動作なのでしょうか?
出来ればそのまま(-i)と返ってきて欲しいのですが。
#先ほどの-iですが、run-processのドキュメントに注意点として書かれていたのですね。
#そちらを参照して解決しました。
#注意点というか、Schemerは-iを見たら虚数と思うのです。
#>yamasushi (write obj)のところで一旦動的環境を抜けるのでrp-dictがリセットされて、そこからyieldして戻ってきた時にbefore thunkが実行されてないっぽいですね。
#parameterizeのなかでは部分継続をつかわないほうが良いということでしょうか?
#なにに部分継続が使われているのかよくしらないのですけれど・・・
#それとも、とりあえず、parameterizeをつかわないほうが良いということでしょうか?
#部分継続の問題なのか、parameterizeの問題なのか、ちょっと理解が足りないので・・・・・
#ChatonでInterWikiNameがつかえると、上の話のときに、マニュアルの該当ページを簡潔にポイントできますね。wilikiのページのときにも短くかけるし。
#すみません。manualについてはブックマークレットがありました。Tools
http://chaton.practical-scheme.net/doc?Tools
#typo あるいはそれに準ずる簡単な修正です
#https://github.com/enami/Gauche/commit/60258f01f00d634879a021123b27bfcd8e2ce688
https://github.com/enami/Gauche/commit/6f41af89493c908d7f55983843000516569871be
https://github.com/enami/Gauche/commit/482e98939e41d897028c11f6d9cc8857ef63257d
#pull request とかにしたほうがいいのかどうか、そのへんのさじ加減はよくわかりません :-)
#もしかして diff に直接コメントしたほうが簡単かなあ、このレベルなら。
#今度なにかあったらそっちも試してみよう。
#mergeしました >enami
#>yamasushi いえ、本来、部分継続がちゃんとparameterizeを考慮しないとならないのができてないってことで、Gaucheのバグです。