##多値は目に見えないもので、直積、タプルとして見えるのは、そういうふうに観測したからと解釈しました。つまり、観測できないデータ構造という考え方です。
#これがあるとなにが嬉しいのかと問われると、困るのですが、ただイテレータが多値になったらどうなの?という自分への問いに答えてみたというか・・・
#また、generatorは終端条件がeofオブジェクトなので、多値に拡張できないので、コレクションを使ってみたとも言えます。
#まあ、なんとなくそのへんの動機はわかります。なかなか綺麗にまとめるのが難しい領域ですが。mapが<multi-collection>を受け取って<multi-collection>を返す、というのは、理屈の上では綺麗です。Gaucheでmapは問答無用でリストを返すのは実用にすり寄ってる。ただまあGaucheのコンベンションに合わせるなら、mapはリストを返すのにとっといて、map-to <multi-collection-meta> でコレクションへの射影をやるのがいいかなあ。
#あ、あと多値コレクションという主題からは外れますが、<multi-collection>へのmapは要素へのprocの適用をlazyにやるわけですが、同じ関数で引数がeagerな構造ならeagerな評価、引数がlazyな構造ならlazyな評価、とオーバロードするのは私はうまくないと思います。このへんの関係: http://chaton.practical-scheme.net/gauche/a/2013/04/09#entry-5164639a-811eb #あの、わたしの環境ではGoogleGroupの新しいUIだと「サーバーとの通信中にエラーが出ました」とでてしまうのですけれど、なにがわるいのでしょうか・・・・
#あっそうだ。WiLiKiのそのページから、Chaton上の関連する議論へのpermalink (発言の右の'#'印) へリンクを貼っといてくれると後で見た人が背景がわかってよいと思います。
#えーと、何をしようとしたらエラーが出たのか書いてもらわないとわからないです。あと、practical-scheme.netを置いてるVPSの負荷がここ数日高いらしくて、反応がひどく遅くなることがあります (VPS上のtopで見ててもloadは上がってないしI/Oも発生してないので、ホストの方が混んでるんだと思う。)
##このリンクを踏むと、新しいGoogle Groupの画面になるのですが、新しいUIはエラーになってしまうのです。
#それは私にはわからないなあ。Googleの中の人がここを見てたらなにか調べてくれるかもしれない。
#ということは、わたしだけなのかしらと。普通に見えるわけですよね?このリンク。
#日付とかわかりますでしょうか?アーカイブを探ってみます。
##私からは見えます(Chrome Version 26.0.1410.63 / linux64)。新しいインタフェースかどうかはわかりませんが。2009/10/29 「Scala API - Range と副作用 [2.8]」というポストからはじまるツリーです。
#ありがとうございます。
#ああ、ツリーにはなってなかった。単一のポストだ。
#multi-collectionのmapについてはちょっと迷うところでして、lazyならcall-with-iteratorのみでいいけれど、strictならbuilderが必要になってしまう・・・
#なら、すべてlazyということにするべきか?とか今おもいました。
#まだ、builderのほうはテストとかしてないけれど。
#(define-class <multi-setter> [] [])
(define-method (setter ref) ((obj <multi-setter>) (index <integer>) . args)
(print args) )
(define x (make <multi-setter>) )
(set! (ref x 12) 1) ; --> (1)
((setter ref) x 123 5 6 7 8 ) ; ---> (5 6 7 8)
(set! (ref x 12) 1 2 3) ; --> syntax-error
#setterには複数のパラメータを渡すことができるわけですが、これを呼び出すような構文はありましたでしょうか?set!-vaulesはちょっと違いますし。
#純粋に構文上の話をすれば、(set! (f a b ...) v) は ((setter v) a b ... v)なので、(set! (ref x 12 1 2) 3) と書いてやればいいんですが、意味的にそうしたくはないんですよね。でも「set!されるもの」が第一級の値でないといろいろ困ることが出てこないかな。
#まあどうしてもやりたければ (mv-set! accessor-expr mv-expr) みたいな新たな構文を作ることかな。mv-exprのところは多値を返す構文を入れる。accessor-expr単独で評価したら多値が返ってくるような「何か」に多値をセットするのに使う。
#この意味がちょっとよくわからないのです。えーーと、多値は数字やリストのような実体を持たないというような意味ですか?>「set!されるもの」が第一級の値でないといろいろ困ることが出てこないかな。
#第一級オブジェクト - Wikipedia
http://ja.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E7%B4%9A%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
#プロシージャや関数のパラメータとして渡すことができる。
プロシージャや関数の戻り値として返すことができる。
実行時に構築可能である。
表示可能である。
#以上が多値の性質。(あ、パラメータは違いますね。)で残りを満たさないと。
#mv-set!をつくってみます。ありがとうございました。
#多値はそれ全部をひとまとめにして受け渡せないということです。例えば単一の変数に2個の値をセットできないですよね。(それができるなら多値の意味はなくて、タプルというオブジェクトとして扱えばいいわけですから。互換性のためにタプルを使って多値を表している処理系はありますけど)。
#gosh -r7 でR7RSモードでgoshが起動されるようにしてみました。デフォルトではimportとdefine-libraryだけが見えてます (後で、REPLに入る場合は基本ライブラリがimport済みになるようにします)。未サポートの機能とかR7RSと動作が異なる部分とか(特にマクロ)あるので、R7RSコードを素直に動かすには至らないでしょうが、少しは遊べるかも。
#readerの追従がまだなので、R7RSコードをそのまま取ってきても \xによるエスケープとか#true/#falseが使えなくて悲しいかも。近いうちに直します。R7RSのライフゲームのコードは(これらreaderの非互換性を除けば)動いた。
#set!の値に複数指定したいケースはもうひとつあって、
#; system-proxy は 「Gauche:万能アクセサを使う」から
; http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3a%e4%b8%87%e8%83%bd%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b5%e3%82%92%e4%bd%bf%e3%81%86#H-jz9a6
gosh> (~ system-proxy :env "TMP")
#f
gosh> (set! (~ system-proxy :env "TMP") "hoge")
#<undef>
gosh> (~ system-proxy :env "TMP")
"hoge"
gosh> (set! (~ system-proxy :env "TMP") "hoo")
#<undef>
gosh> (~ system-proxy :env "TMP")
"hoge"
gosh> (set! (~ system-proxy :env "TMP") "hoo" #t)
*** ERROR: Compile Error: syntax-error: malformed set!: (set! (~ system-proxy :env "TMP") "hoo" #t)
#環境変数アクセスを変数のようにしたオブジェクトをつくってみたのですが、sys-setenvの上書きオプションを指定したいときとかです。
#(define-syntax multi-set!
(syntax-rules (!)
[(_ (! x ...) y ) ; yは多値の表現
(set!-values (x ...) y) ]
[(_ (refn x ...) y) ; yは多値の表現
(apply (setter refn) x ... (values->list y)) ]
) )
#こんなふうに多値のset!を考えて見ました。