Ruby
まつもとゆきひろ さんが開発したフリーのオブジェクト指向スクリプト言語とその処理系。特にアンチ Perl 派の支持を受け、国内はもとより海外にもファン・利用者が多い…と聞く(^_^;)。
--sumim
Ioで出てきたsetter/getterの話をrubyについて考えると、
- インスタンス変数名は必ず「@hoge」のように@で始まる。またインスタンス変数はprivateである。
- 正確に言えばインスタンス変数は宣言不要。というか宣言する手段が無い。アクセスされれば出現する。無節操だが、privateに限定されているおかげで、他所から無節操にアクセスされ放題(スロット作られ放題)ということにはならない。
- getterメソッドとして常用される名は「hoge」みたいに何もついてない名。
- setterメソッドとして常用される名は「hoge=」。メソッド名の後ろに「=」がついているという扱いである(^^;
- このとき、実際のメソッドとして呼ばれるときに有効な名(つーか文字列は)正規表現で書けば「hoge[ \t]=」である。つまり「hoge =」という風に間に空白が有っても同じものと扱われる
- 上記3つの定義(?)をいっぺんにやるメソッドattrという奴が有る。「attr :hoge, true」(:に名前を続けるとSymbol型リテラルになる)と書くだけでsetterもgetterも出来上がる。(インスタンス変数は、作るまでもないし、そもそも「@」で始まるために絶対に名前が衝突しないので、気にしなくていい)
なんだ、ALGOL系の古典的なノリとアレ系の恰好良さが、両立できてるじゃないか。--戯
(Io)より
>スロット名と同名(+“:”)のメソッド
「:」をつけても同名のうちと見なしてもいいなら、
Rubyのように
「=」をつけても同名のうちと見なしてもいいよね。
「@」をつけても同名のうちと見なしてもいいよね。
↑…こう書くと屁理屈のように聞こえるかも知れないが、
屁理屈とかセコイとか思えるのは、つまりそれがエレガントだからだよな(^^;
つまり「やられた!」って奴。Rubyが発祥なのかどうかは知らないけど。
Ruby で BankAccount
「hoge=」というセッター名はなかなかの妙案ですね。
だから ALGOL 系記法を踏襲すること自体が全面的に肯定される
(ひいては、メッセージ式の存在理由が無くなる)とは思いませんけど。--sumim
あー。Rubyから得られる(?)教訓は、インスタンス変数名を如何ようにラップしてもいいじゃん、という話なんだと思う。
「@」つけようが、大文字小文字反転しようが、rotXXで暗号化(?)しようが、なんでもいい、という。
だから、期待するアクセス名「そのまま」をインスタンス変数名にしてしまった
が故にアクセサ(setter/getter)の名前を食いつぶされる、という悩みは、
悩む必要が無いんじゃないかという話。
そうではなく、アクセサは人間が所望した名前で直接命名し、
「どうせprivateな位置付け」であるインスタンス変数名はテキトウにラップする、という
属性&アクセサ生成メソッド(attrがその一例である)が有れば、手間要らずだよね、と。
インスタンス変数名のことなんか、もう忘れようよ、と。 --戯
あと、ALGOL文法くさいか否かと、それが「メッセージ」であるか否かは、
(前も言ったかと思うけど)直交な問題だと思いますよ。
非OOP言語に、Smalltalk風の文法を持ち込むことだって、出来ちゃうんだからさ。
#余談だが、Collectionのat:ってのはかなりビビったです。今更だけどSmalltalkにゃ配列用の構文が無いわけね。
#おなじ(?)「at」なら、「@ indexInt」じゃ駄目なのかな?とも思った。
ここで「配列の構文」とは、具体的には何を指すのですか?
(戯さんタイプの方とのコミュニケーションは、当方の理解が及ばないところは勝手に憶測して話を進めず、少々面倒でもこうしたところからはじめたほうがよい、と学習しました(^_^;))--sumim
ALGOL系の配列構文みたいな奴です。 Cの「a[b][c]=d;」とかみたいな括弧を使う奴。
広い意味ではBasicだのFortranだのもソレです。
ちなみに(CやPascalはメジャーだし「そういう構文だ」で話が終ってしまうので略するとして)
Rubyは、「[a]」(at: a に相当)や「[a]=b」(at: a put: b に相当)もメソッド扱いです。
…ん?これはC++も同じだっけ…か??
要するにこれは多分、括弧を括弧らしい形のままメッセージ名として使える
(100%自由に使えるか否かはさておき)かどうか、という問題なんでしょうね。
…ええと?これってSmaltalkだと…できるのかな?
後で試そうっと… --戯
いや、パーサーに手を加えないとできませんので(そのスキルと気持ちがないなら)試されるには及びません。ただ、本当に Smalltalk の構文の改変に興味がおありなら、SmaCC など試されてはいかがでしょうか。でもパーサーをいじるなら、CompilerCompile するならなんでもありだから無意味と答えが返ってきそうですね(笑)。いや、Ruby 風文法を Smalltalk で実現するという試みとしては(ALOGL 系文法でないからという理由のみで Smalltalk のお試しや利用を断念している人には)ある種の福音をもたらす可能性も皆無ではありませんね。
ちなみに、Smalltalk のメッセージセレクタに用いることができるシンボルは3種類で、(かなり限定された)記号のみからなる文字列(=二項メッセージセレクタ)、英字で始まる英数字列(単項メッセージセレクタ)、英字で始まる英数字列の最後に「:」を付したもののの1回以上の反復(キーワードメッセージセレクタ)、を満たすものに限られます。さらにメッセージ化するには、二項とキーワードはパラメータが必須で、キーワードは「:」の数だけ必要です(ご存じのとおり、各パラメータは「:」の直後に挿入します)。このルールでは、[a] タイプのメッセージは記述できません。そもそも [ と ] をセレクタ(これらは記号なので必然的に二項メッセージセレクタに限られる)シンボルに含めることができませんので、この時点でインタクトな状態での [a] タイプのメッセージ送信の試みはアウトですね。--sumim
>Rubyは、「[a]」(at: a に相当)や「[a]=b」(at: a put: b に相当)もメソッド扱い
これも、hoge= ほどではないにせよ、なかなかのアイデアですね。感心しました。--sumim
今帰宅。
そっすか。まあ複雑な(てーか2個以上の)引数の組み合わせを適用するには「:」が必要ってことは
「[a]=b」方式は直接は無理だろうってのは判ってました。
ちょい妥協して「[:a]=:b」とか、更に妥協して「<<:a>>=:b」なんてどうよ?とは思っていたところです。
そろそろ意味不明になってくるんで価値が無いですが(^^; --戯
>非OOP言語に、Smalltalk風の文法を持ち込むことだって、出来ちゃうんだから
これ、以前にもおっしゃっておられましたが、たぶん話の流れを取り違えておられるか、意図してすり替えておられるように思います。OOPL である Smalltalk を使ったからといって OOP ができるとは限らないのと一緒で、メッセージ送信メタファを体現するのに向いた Smalltalk の文法を使ったからといってメッセージ送信メタファを体現できるとは必ずしもいえないですよね? 私はメッセージ送信メタファを体現するのに Smalltalk の文法はかなりエレガントなもののひとつだと宣伝している(つまり端的には、これを用いずにメッセージ送信メタファを Smalltalk 並に、目に見える字面として体現するのは難しいと言っている)わけで、メッセージ送信メタファと関係ないシステムに Smalltalk の文法をかぶせる話を反例としてあげられてもなんだかなぁ…という感じです。たしかに Ruby は hoge= や hoge[a]、hoge[a]= を編み出して ALGOL 系文法を使ってがんばっているのは認めますが、やはり一歩およばずで、複数のパラメータを含んだメッセージにおける冗長許容性、表現力は Smalltalk のそれにはどうあってもかなわないと思いますがいかがでしょう。--sumim
それってメッセージメタファなのかな?
Smalltalkの(特にキーワードメッセージの)文法はどっちかってーと「自然言語メタファ」じゃないかと思う。
というのは、何処が終わりかが判りにくい(ネストすると更に判りにくい)、という
自然言語の弱点もまた取り込んでしまっている(と俺は思う)ので。
結局「()」を使うことで克服していますが、
これはALGOLつーかFORTRAN由来の「算数メタファ」に(妥協して)接近した結果…じゃないかな。
あ。算数メタファは今考えた造語ね。「f(x,y,z)」みたいな書き方に満足する流派(笑)のこと。
#ところで、「=」などで「代入」を表現するのは、算数とはちょっと違いますね。「FORTRANメタファ」かも知れない(藁
「目に見える字面として体現する」と言われても、括弧や「,」だって目に見えるんだし(^^;
あれは「見える」んじゃなくて「(日本語や英語に慣れた)統覚が読む」わけだよね。
そのセンを攻めるのは名案だと思うし、そもそも日本語の助詞や英語の前置詞の仕掛自体が結構良いから
それを流用することのメリットは大きい。
でもそれは(当然だが)百点満点だったり究極だったりするわけでもないし、
また、OOPとの相性が格別良いと言える客観的理由も無い(ですよね)。
とりあえず「at:put:」はむしろコジツケに思えたんですよ、俺は。
キーワードメッセージ「しか」使えない中で動詞や前置詞をヤリクリしたらこうなった、と。
#もちろん他の言語もコジツケは無数に有ることだし、これが致命的だとは言わないが。 --戯
#ところで「put:at:」が無いのは、なんでだろ?
>冗長許容性
許容といえば確かにその通りなんですが、逆にいえばそういう文法しか無いってことは、
冗長に「せざるを得ない」とも言えちゃう。短く書きたい時も短くならんという。
Smalltalkのあれは、1つの良いアイデアだとは確かに思うんだけど、
プログラミングにとって、あるいはOOPにとって、他を丸ごと捨ててもペイする良いアイデアか?
と聞かれると、俺にはいまいちピンと来ない。
ALGOL風もSmalltalk風も両方使える文法なら、自然言語風と算数風の弱点を
随時補い合うという無節操(?)な書き方が出来るだろうな、と、ふと思う。
「随時」ってのは、恐らくその書きたいメッセージの「意味、内容」によって、
どっち風の書き方がしっくり来るかが変わって(決まって)くるんじゃないか、と俺は想像してるんです。 --戯
Rubyに話を戻す(<話の流れに対抗(笑)するための冗談ですからね…)と、
俺は実のところ、Rubyの「メッセージの引数の周りの括弧を略せる(「a.b(c)」の代わりに「a.b c」と書ける)」文法は、
好きじゃないです。
確かにそれのお陰で「hoge=(b)」とか「[a]=(b)」とかいう無様なこと(笑)に成らずに済んでいる
という功績もあるんですが、むしろそれのために平素(?)の構文が微妙に不恰好になってる率のほうが高い(と思う)。
#それでも使ってるのは、それ以外の気に入っている部分の恩恵のほうが大きいから。
ま、自然言語に括弧が無いのがイライラの種である俺としては、ね。
それはそうと無改行Long行が…(^^;
viが苦手なんだよね、それ。カーソルの動きが(少なくともデフォでは)物理改行を頓着しないので。
(オフトピだが移動先を見切るまで暫定ってことで)意図と空振りについて:
>ALGOL系の配列構文みたいな奴です
あれ?ここ(Ruby)に移動しちゃったんですか?俺が考えてた話の流れ(もし有るならば(藁))とは違うなあ。
Rubyはあくまで一例で、演算子やメッセージの命名や形状(つまり括弧風のものが可能かどうか)という
話のつもりだったんで、それっぽい名の頁を起こすならともかく、Rubyへの移管ってのは…うーん…
Smalltalk でビビることの「配列の構文」の辺りから、新規頁を起こせばよかったろうに、なんでここ(Ruby)?
#せめてあちらに「ここの記述はRubyに移動しました」くらい一筆書いてくれたらなあ…
#まず最初に「どこいっちゃったんだ?」と焦りましたもん。
#それこそ話の流れつーか「sumimさんが(だよね)今考えそうなこと」を「読」まない限り、ロストしてましたね。
#第三者なら完全にロストするだろうなあ。> ポリローグ
あ。もしかして「ビビった」がこのページ発祥だから、ここに戻ってきた、ってこと?
別に、「このページに」話の流れを作って(戻して)欲しいとは少なくとも俺は全く思ってなかったんで、
「とっとと自立(新規頁立て)しろよ>その話題」としか思わなかったです。
>宣伝している
(事実とかじゃなく)「宣伝」なんですね?
じゃあその宣伝を「なんだかなぁ」と言われちゃえば終わるわけで。
なんつーか、「話の流れ」つーよりは「sumimさんの思い」という感じがするなあ…
>当方の理解が及ばないところは勝手に憶測して話を進めず
理解が及んだと思い込み、そしてそれが外れてた瞬間(変な日本語だな)に
物事(?)はおかしなことになります。
今回は、ワンアクション目のsumimさんは「待って」くれたわけですが、
ツーアクション目のsumimさんの動きは、俺から見れば唖然とするものでした。
待つのが1回で済むとは限らないんだよね… --戯
このページを編集 (10988 bytes)
|
以下の 17 ページから参照されています。 |
- Python 最終更新: 2004-04-25, 00:07:56 <192>
- プロトタイプベース・オブジェクト指向 最終更新: 2006-04-26, 10:32:39 <khp0591>
- ミックスイン 最終更新: 2013-03-29, 14:17:03 <phara2>
- 仮想関数 最終更新: 2003-10-28, 19:00:20 <61-27-2>
- CLOS 最終更新: 2003-12-22, 13:10:34 <tibook>
- 安易言語 最終更新: 2003-07-27, 16:58:50 <airh128>
- メッセージ送信 最終更新: 2006-02-12, 22:22:02 <192>
- ある OOPL な会話 最終更新: 2006-05-04, 13:36:56 <192>
- Squeak のとっかかり 最終更新: 2013-02-21, 12:20:35 <phara2>
- Smalltalk でビビること 最終更新: 2005-08-10, 21:19:02 <192>
- Squeak の二項メッセージセレクタで使える記号 最終更新: 2003-12-20, 00:48:43 <192>
- クラスメソッドの特異メソッドとしての扱いは“シンプル化”に貢献するか 最終更新: 2004-06-18, 15:15:56 <gatekee>
- CLOS で bank-account 最終更新: 2003-12-22, 23:13:19 <192>
- EQL スペシャライザ 最終更新: 2004-10-20, 10:29:00 <tibook>
- フロントページ旧バージョン 最終更新: 2005-07-17, 14:36:07 <192>
- Rubyでプロトタイプベース談義 最終更新: 2004-01-03, 12:43:00 <61-27-2>
- Tiki 最終更新: 2004-04-05, 11:50:19 <61-27-2>
This page has been visited 8441 times.