けいじゅ@今はフリー(^^;;;です. In [ruby-list :03282 ] the message: "[ruby-list:3282] exceptions (Re: Ver 1.1 [Re: Matrix]) ", on Jul/04 23:50(+0200) matz / caelum.co.jp (Yukihiro Matsumoto) writes: >わたしはC Hackerですから,Cのマクロで考えると,マクロの使い >道としては Dylanのマクロの話しが出たのでそっち系統のマクロ機能を念頭においていま した. > (a) 定数定義 > (b) インライン関数の代わり > (c) 引数に対する副作用のある関数定義 > (d) 制御構造の拡張 >があるように感じます.で,aについてはrubyには専用の定数があ >りますから,それを使ってもらうことにしましょう. これはいいです. >bはrubyのようなインタプリタ言語でインラインまでして高速化することが意 >味があるようには思えませんから,普通のメソッドを使ってください,とい >うことにしましょう. ここでの要望が変わってくるといえるのかなあ... Dylanは良く知りませんが Lispなどのマクロは, 呼出側のコンテキストでインライン(マクロ)展開します よね? で, 一般の式をマクロ展開するには, それなりの機能が必要になるわけ ですが, rubyには eval があるのであとは, caller_bindingみたいのがあれば どうにかなるかなと思ったわけです. この辺りの機能は, それこそメタプログラミングに関わっているわけですから, 全体としてどういった機能が必要かといった視点から考えないといけないです ね. それに, この機能よか, 次のイテレータブロックに関する機能の方が嬉し いかも?? >cは多重代入による複数の戻り値で我慢してもらうしかないですね. >問題はdですが,これはいくつかのパターンに分類できると思うの >ですが,個人的な印象ではほとんどの場合は,イテレータで解消で >きるものが多いのではないかと思います.イテレータによって自分 >のコンテキストを他の関数に渡せますから,そのことによって制御 >構造の拡張が可能になるのではないかと思います. 問題になるのは, イテレータブロックとして渡された式を変更したい場合など ですよね. LispとかDylanはその辺りの機能が充実している(Lispはやりやすい?) 前田さんのメイル[ruby-list:3284]であった with_binding caller_binding do p bar end なんかも似ているといえるのですが, 制御を抽象化して見せるのに, 文字列と して渡すのは, あまり嬉しくないですよね. eval "p bar", caller_binding 今な感じでね. イテレータブロックから元のソースコードを出力したり, 構文木をアクセスす る機能ってのは, 難しいですかねえ? 難しそうですねえ... >そうでない場合のほとんど(Cなら#や##を使う場面)はevalを使うこ >とでなんとかなると思います. Cレベルならねえ... もうちょっと要望が高かったみたいです. >で,石塚さんの提案はtclのupvar相当のものをrubyに,ということ >でした.便利であろうことは確かなのですが,若干抵抗があります. へえ. tclにはあるんですかぁ... > * これがあると任意のメソッドを呼び出すことでローカル変数の > 値が変わってしまうことがありえる > * 「普通の言語」にはそんな機能はない それがしたいんですもの... でも, 任意のメソッドは問題あるかなあ... 確か にそんな機能がある言語は, 普通じゃないですねえ... > * 現在のインタプリタの実装ではupvarを実装するのはちょっと > 大変(呼び出し元のコンテキストへのポインタを保存していな > いので) >もちろん,前二つはいいわけで,一番問題なのは最後なんですけど ^^;;; うーん. なるほど... 今の実装のままで頑張って取り出すことはできないんで すかね? >というわけですぐに採用というわけにはいかないのですが,次の方 >法が使えるのではないかと思います. > > 1. 問題のメソッドをイテレータとして呼び出してもらう > 2. Proc.newを使ってイテレータブロックをProc化する > 3. Procはbindingとしても使えるのでそれをeval()の第2引数に > する > >いかがでしょう? イテレータブロックは空でも構いません. いわんとしていることは分かるんですけども, 空のイテレータブロックを渡すっ てのが... an_iterator{} はちょっと... でも, an_function(binding) よりはいいかなあ... イテレータとして呼ばれているかどうかは, {}があるかどうかで判断している んですよね? >前にもそういう話が出てそのままになっていますよね.メタプログ >ラミング系が弱いのはPythonと比べた弱点と言っても良いと思いま >すが,なかなかよいインタフェースが思い付かないまま現状に至っ >ています.pythonのように__dict__とかで現在のネームスペースを >直接見せられるような単純な実装になっていないんですよね. > >そういうものを作ることに反対しているわけではないので,また提 >案してみてください. そうですねえ... 自分がよくプログラムするのが一般的かというとそうでもな いので, 一般的にどうであるべきかというのもいいづらいのですが... でも, 良く考えたら ruby レベルでも, メタプログラミングをサポートするよ うなクラス/関数があるていどなら定義できますので, 簡単なプロトタイプで も作くりながら, どういうのが欲しいか検証していこうと思います. # メタプログラミングをサポートする機能だからメタメタプログラム? ところで, python のメタプログラミングサポートってどんな感じ? >|ところで, $@ が設定された状態で, 引数付きfailを行った場合, $@に今回の >|例外と位置が追加されるのですか? それとも最計算される? > >引数つきfailを使うと$!, $@の値は再設定されます.$!,$@の値を >操作したい場合には必ず引数なしで呼んでください. 了解. __ .........................................石塚 圭樹@今はフリー(^^;;... ------->>また, アドレス変わりました!! e-mail: keiju / bc.mbn.or.jp <<---