unixには無いみたい。(どうもMS由来の様)、しょうがないので、sprintfで急場しのぎ。互換を見つけてきて使ってみた。buff;}これを拡張して、Base64のデコーダーにするのかな?それとも、Bignum対応への布石?2012/07/01sasagawa:Simple?さんが鋭意開発されているSimpleを、Unixにプチ移植してみた。楽しく、かつ、興味深く拝見しました。改良のためのヒントもいただきました。実用的な使い方の例としても役立ちそうです。なってしまっているだけじゃないかと思います。最適化の有無で結果が変わるのはたまたまだと思います。付けて試してみるとどうでしょうか。sasagawaさん、お久しぶりです。齋藤さん、ご指摘ありがとうございました。returnを追加して試した所、gcc,clang共、正常動作しました。gdbで追っても、期待通りの動きとなりました。規格から根拠となる文言を探してみました。到達し、かつ関数呼出しの値を呼出し元が使う場合、その動作は未定義とする。到達してしまうため未定義動作となるのでしょう。最初の呼出し元まで一気に戻ることになるので結果的に未定義動作の部分を経由しなくなっているからではないかと推測します。不定ということなので、R5RS的には#fが入っていようが0が入っていようが鳩が入っていようがオッケーなんですが、うっかりそのデフォルト値をあてにしたプログラムを書かないように、#<unbound>という値を入れています。本当は何かを評価して#<unbound>が出てきたらエラーにするのがいいんでしょうが、そのへんは手抜きということで...VM中では、変数の評価値が#<unbound>になるかどうかだけチェックしています。#<unbound>の方が安全ですね。z)のような式では、コンパイラがVM_VECという専用のインストラクションを生成して、それがVMのrun_loop中でScm_MakeVectorを呼んでいます。対話セッションで使われ、バッチモードでは、コンパイルされたコードがVMな機械で実行されるという大雑把な流れになるのでしょうか。Guideが欲しいです。いえ、対話モードでも、入力された式は常にコンパイルされてVMで実行されます。Guideというサイトを作りました。長期的には、srfiに期待。マイlibraryでラッパーを書くしかないのでは。なんて言う疑問は置いておいて、mapに限らず、引数の数には制限は無いのだろうか?数個までは効率よく扱ってくれるけど、それ以上は効率が落ちるとか。引数をヒープに準備する処理系なら、たぶんメモリの許す限りOK。引数をスタックに積む処理系なら、スタックサイズが限界。Gaucheもこれで、デフォルトでは10000個弱。(本来はそれを越えたらヒープに積むようなフォローが必要だと思うが、Gaucheではエラーになる)。最初の数個の引数をマシンレジスタ渡しにする処理系なら、引数がレジスタに乗り切らなくなったところで効率が落ちると思われる。それから、可変長引数を取る手続きは、コモンケースに関して最適化してある場合があります。Gaucheでは、引数リストが1つだけのmapやfor-each、2引数の数値加減算や比較、等です。2003/04/19プロファイラーが欲しいなと書いてみるテスト私も欲しいなと思っていたので作ってみました。copyしたあれを要求するのは何故だろう。「プログラム中のリテラル文字列はimmutableである」というのが理由です。R5RSの4.1.2節と3.4節参照。ホントは次の式もエラーにしなくちゃならないんですが、Gaucheではサボってます。次のセッションを見て想像してみて下さい。してもやりたかったら、ちゃんと複製した上でやれって事ですね。Flagがあるんですね。Gaucheの256倍本が欲しくなります。Gauche:ImmutableObjectへ移ります。