vieweditattachhistoryswikistopchangessearchhelp

Ruby

まつもとゆきひろ さんが開発したフリーのオブジェクト指向スクリプト言語とその処理系。特にアンチ Perl 派の支持を受け、国内はもとより海外にもファン・利用者が多い…と聞く(^_^;)。
--sumim



Ioで出てきたsetter/getterの話をrubyについて考えると、
なんだ、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)


Congratulations! 以下の 17 ページから参照されています。

This page has been visited 7494 times.