ラベル io の投稿を表示しています。 すべての投稿を表示
ラベル io の投稿を表示しています。 すべての投稿を表示

2011年10月4日火曜日

7つの言語7つの世界 Io 3日目



ついにIoも3日目、雑ですがメモと感想を。

DSLを作る話。


phonebook.io

わざわざ文字列をパースしなくても、電話帳のリストを構文として解釈するようにIoを変更({}や:の意味をかえる)

phonebook.ioがそれ。ところでp64のforEachはforeachの間違いかな?なんかここだけ違う。Rubyっぽい。

演算子が自由に定義可能なのは2日目で見たけど{}までも変更出来るなんてヤバい。curlyBracketsメソッドを定義することで{}の動作をいじれる。





Ioのmethod_missing

forwardメッセージをいじればいい。

forwardではメッセージが存在してない場合親に転送する事をしているらしい。

なのでこれを上書きしちゃうとIoとは別ものに…

ここらへんから頭がこんがらがる。

Builder := Object clone
Builder forward := method(
writeln("<", call message name, ">")
call message arguments foreach(
arg,
content := self doMessage(arg)
if (content type == "Sequence", writeln(content)))
writeln("</", call message name, ">"))

Builder ul(
li("Io"),
li("Lua"),
li("JavaScript"))


平行性


Ioには3つ平行性ライブラリがある。



  • コルーチン

  • アクター

  • フューチャ

コルーチン

処理を自由に停止・再開出来る。

@や@@をつけて非同期にメッセージを送信する。@はフューチャを返す。@@は自分のスレッドでメッセージを開始出来る。

yieldを呼ぶと別の処理に制御をうつす。yield書かなくても適当に自動でyieldしてくれるらしい。

制御を移すタイミングをyield呼ぶことで自分で指示出来るのがポイントっぽい。

自分で制御を渡すことが出来るので協調動作も書きやすい。

JavaやCベースの言語はプリエンティブマルチタスキングと言われる平行性の概念を用いているらしい。

第12回 Haskellで学ぶ並列プログラミング(その3)並行プログラミングと並列処理 - 本物のプログラマはHas...:ITpro

実行している処理に割り込む形でタスクを切り替えるので,このような形のマルチタスクを「割り込み型(preemptive,プリエンプティブ)マルチタスク」と呼びます。これに対して,スケジューラではなく実行する処理の側で明示的にタスクを切り替える形のマルチタスクを,「非割り込み型(non-preemptive,ノンプリエンプティブ)マルチタスク」あるいは「協調的(co-operative)マルチタスク」と呼びます。

プリエンティブマルチタスキングな平行方式と変更可能な状態を持つオブジェクトを組み合わせると、予測出来ずテスト方法もアレでデバッグが難しくなる云々。

確かに勝手に割り込んで色々変え合ってたら大変だよね。

「アクターのような高レベルの抽象化を実現する基本的な構築ブロック」がコルーチンらしい。

うーん、書いて自分で読み返してみてイミフ orz

アクター

アクターはメッセージの送受信、アクターを作る事が出来るとか。

受信したメッセージはキューに入れてコルーチンで処理していく。

なのでスレッドのように互いに制限なく変更することが出来るわけではないみたい。

キューで処理していくのでちゃんと制御されてるとか。

Ioでは@@で非同期メッセージ送ればそれがアクターになる超絶便利機能。

x @@foo; y @@bar;


すると同時に実行される。fooとbarの中でyieldを呼んで制御を移す事も出来る。Ioかっけー

フューチャ

@で非同期メッセージを送るとFutureオブジェクトが帰って来る。

非同期メッセージが完了する前にFutureオブジェクトを使うと、完了して値が帰って来るまでブロックされる。

時間かかる処理を@で呼び出しといてFutureの値使わない処理ごにょごにょしてから、Futureの値を使う処理をかく(とFutureの値が帰って来るまで待つ)感じなのかな。

Ioにはデッドロックを自動的に検出する機能もあるらしい。

試してみよう


XMLのやつ



  • 本文のLispMLを改良してインデントさせる

  • 本文のLispMLを改良して属性を処理出来るように。第1引数がMapだったら属性を追加



なんかXMLのやつ想像以上に時間かかった。

args first codeをdoStringしてるんだけど、doMessageでも出来んのかな?

自分の場合上手くいかなくてなんか結構汚い感じ。

これは他の人の回答めっちゃ参考にしないといかんなー

角括弧のリスト構文



  • 角括弧を使ったリスト構文を作成



LispMLに苦労したけどこっちは5分ぐらいで出来たw

これだけで[]でリストが作れるようになる。すげー!

添字アクセスまで作る気力は私に無かった。

ちょっと疑問点




  • 最後の連続したとじ括弧は1行にまとめちゃってもいいのかな?

  • インデントどうつけよう

感想


平行性の話がまだきちんと理解出来てない感じ。

でもIoだと、ただ単にメッセージに@@とか@つけりゃ平行動作・協調動作させたり処理待ちも勝手にやってくれてかなり便利そう。

Io奥が深い…




2011年10月2日日曜日

7つの言語7つの世界 Io 2日目



no title


この資料が分かりやすかった。


以下メモ書き




  • 言語の基本的な動作を覗く

  • ループ


    • loop(処理)

    • while(条件, 処理)

    • for(カウンタ名, 初期値, 終了値(含む), senderを伴うメッセージ)

    • for(カウンタ名, 初期値, 終了値(含む), 増分, senderを伴うメッセージ)



  • 条件分岐


    • ifは関数

    • if(条件, 真の場合, 偽の場合)

    • if(条件) then(真の場合) else(偽の場合)

    • if(条件1) then(条件1が真の場合) elseif(条件2) then(条件2が真の場合) else(偽の場合)

    • if(条件, 真の場合, 偽の場合)は真偽のコードどちらかを評価した結果を返す



  • 演算子


    • OperatorTableで演算子表を確認出来る


      • 優先順位が分かる

      • 演算子の追加はaddOperator(演算子, 優先順位)



    • 1 + 2は1 +(2)というメッセージにコンパイルされる。1に対して+(2)というメッセージ送る

    • addOperatorでOperatorTableに演算子を追加しないとエラーが出る例





$ io
Io 20110905
Io> List ++ := method(a, a foreach(v, call target append(v)))
==> method(a,
a foreach(v, call target append(v))
)
Io> list(1, 2) ++(list(3, 4))
==> list(1, 2, 3, 4)
Io> list(1, 2) ++ list(3, 4)

Exception: nil does not respond to 'foreach'
---------
nil foreach Command Line 1
List ++ Command Line 1

Io> OperatorTable addOperator("++", 4)
==> OperatorTable_0x7fc798c73040:
(略)
Io> list(1, 2) ++ list(3, 4)
==> list(1, 2, 3, 4)




  • メッセージ


    • メソッド呼び出すとcallスロットにcallオブジェクトが設定される

    • callオブジェクトのスロットはsender(送信元), target(宛先), arguments(引数)

    • メッセージの引数はmethod(arg, arg)の様にargを書くと評価される

    • メッセージの引数を書かないと評価されない


      • method(call message argAt(0)) <- argAt(0)で0番目の引数を取る事が出来るが評価はされない



    • えばるならevalArgAt

    • ほんとに,以外はほぼメッセージ… 純粋! かっこいい!

    • unlessの例


      • call sender doMessage(call message argAt(2))

      • 送信元の環境で2番目の引数を評価

      • 短くやる方法がevalAtArg



    • animalsの例


      • プロトタイプを辿りながらスロットを出力していく

      • selfはcallのtargetに設定されてるのかな

      • 1つのオブジェクトが複数のプロトタイプを持つ場合もあるらしい


        • どういうことだろうww





    • メッセージリフレクションとオブジェクトリフレクション


      • クラスの存在なし

      • call messageやselfやprotoなどメッセージやオブジェクトにアクセスする手段がいっぱい





  • asなんとかメソッドでデータ形式の変換


セルフスタディ 試してみよう


既にあるメソッドを勉強して使いこなさないとすっきり書けないですね。



本を見ながら書いたもの




感想


他の方の回答を調べたらめっちゃすっきり書かれてる。


この違いがどこからくるのか、かける時間かリファレンスをちゃんと見てるのか良い方法があるのか気になる。


今回は間があいてしまいました。1週間1言語はやはりちゃんとやらないとついていけない orz


1ヶ月の夏休み中は内定先の企業様でバイトをさせて頂きました。


プライベート時間の確保が学校居るときより出来なくなりました(週1日は元同級生と基本情報の勉強をするため空けてたり、週末も色々あったりで) orz


時間をうまく使う技術身につけないと会社入ったらあっという間に老いて死んじゃうので今のうちどうにかせねば…


今月はScheme修行の本文からもっと深く読めてない部分(Yコンビネータ等々)も読むし、PHPの勉強も始めるし、3日目はしっかり読んで、さっと練習問題まで終わらせてしまおうと思います。