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

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日目はしっかり読んで、さっと練習問題まで終わらせてしまおうと思います。





2011年9月23日金曜日

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



探してみよう




確認してみよう




  • Ioは強く型付けされた言語か? 弱く型付けされた言語か?


    • Ioは強く型付けされた言語。1 + "one"はエラー



  • 0、空文字列、nilは真か偽か?


    • 0、空文字列はtrue、nilはfalse

    • (true and 0) println; (true and "") println; (true and nil) println



  • プロトタイプのスロットの確認


    • proto slotNames、protoでプロトタイプを取得してslotNamesメッセージ送る



  • =、:=、::=の違い


    • a = 1はupdateSlot("a", 1)、a := 1はsetSlot("a", 1)、 a ::= 1はnewSlot("a", 1)にコンパイルされる

    • =はスロットに値を入れる。スロットが存在していない場合例外を投げる

    • :=はスロットを作成して値を設定。

    • ::=はスロットとセッター(fooだったらsetFoo)を作成して値を設定




試してみよう




  • ファイルからIoのプログラムを実行


    • $ io -hでヘルプ見れる。普通にファイル名渡せばいいみたい。

    • $ echo '"Hello, Io!" println' > day1.io; io day1.io



  • スロットの名前を指定して格納されているコードを実行



$ io
Io 20090105
Io> a := Object clone
==> Object_0x10268e620:

Io> a fuga := method("fuga" println)
==> method(
"fuga" println
)
Io> a fuga
fuga
==> fuga
Io>


これでいいかな?他の人の見たら



Io> a getSlot("fuga") call
fuga
==> fuga
Io>


でした。


感想等


「問題は何をするか」ではない、「何をしないか」だ


フェリスはある朝突然に - Wikipedia


に出て来る台詞らしい。


かっこいい。


JavaScriptと同じようなプロトタイプベースのオブジェクト指向言語。言語自体は凄くシンプル。


プログラミング言語の仕組みを勉強するために作ったらしい。なんかすごい。


JavaScriptは人気すぎるからIoにした、って本の最初の方で書いてたけど、Ioは日本語の情報少なくてちょっと困りそう。頑張って最後まで読む。


ioに書かれてるfeatures見ると




  • small vm(1万行以下)

  • 複数のVMが同じプロセスで動く

  • ガベコレ、弱い参照

  • アクターベースの並列モデル、コルーチン

  • 64bit C99での実装

  • 組み込み言語

  • 例外


とりあえずbrewで入れました。



$ brew install io

雑記



  • Objectが一番てっぺん、Objectにcloneメッセージ送って新しいオブジェクトを作る。

  • オブジェクトはスロットを持つ。slotNamesというメッセージを送ると持ってるスロットが確認出来る。

  • 代入は=、スロットが存在しないのにFooObject = "foo"するとエラー

  • 無かったら新しく作ってくれるのが:=

  • 全てのオブジェクトはtypeに答える


    • 5 typeするとNumberが帰って来る



  • 大文字で始まる名前のオブジェクトはタイプ

  • 送られてきたメッセージに答えらなかったらプロトタイプに転送する

  • Ioではタイプも、タイプを元に作成されるオブジェクトも、どちらもオブジェクト。

  • メソッドの定義はmethod()、methodのタイプはBlock。メソッドもオブジェクト。

  • getSlotでスロットの値を取得出来る。スロットが無かったら親のスロットを辿る。

  • protoメッセージを送ると自分のプロトタイプが取れる


    • REPLも実はオブジェクトのメソッド内で実行してるのかprotoと打つと親が帰って来る



  • Lobbyに全ての名前が入ってる

  • コレクション


    • List


      • ObjectのlistメソッドでListタイプのデータが作れる

      • Listにはaverage sum at append pop prependなどのメソッドがある。



    • Map


      • Mapはハッシュのようなもの、シンタックスシュガーはない。

      • atPut at asObject asList keys sizeなどのメソッドがある





  • 真偽値


    • true false

    • どちらもシングルトンのオブジェクト、cloneを上書きして自身を返すようにする







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



試してみよう




感想等


3章はRubyのメタプログラミングの紹介、メタプログラミングとはプログラムを書くプログラム

Rubyの機能を使えばDSL(ドメイン固有言語)を構築することが簡単に出来る(らしい)

メタプログラミングRuby欲しくなった。

Rubyの3日分の「試してみよう」の他の人の解答見ると、奇麗なコード多すぎて嫉妬。

読んでる間ずっとリファレンスマニュアルと睨めっこだった。

もっとちゃんとした本を一冊かって頭に叩き込まれるまで勉強したいなぁ。

一番良いのは忘れないように毎日何か書く事だろうけど。書かないと何回も調べたことでも忘れちゃう気がする。

試してみようの3日目

元々定義されてるメソッドと同じheadersが設定されてたらmethod_missing呼ばれない。

なので定義されてるメソッドをundefしていく必要があるみたい。

メソッドをまっさらに消すのをブランクスレートと呼ぶらしい。

メタプログラミングに利用出来る機能



  • オープンクラス


    • クラスを定義した後からでも変更出来る

    • 普通はメソッドを追加する時に変更する

    • メソッドを追加する前に作成したオブジェクトからでも追加したメソッドを呼び出せる

    • DSLを作成する時に便利

  • method_missing


    • phpの__callとか__getのようなものか。

    • 例として出ているローマ字がすごい。

  • モジュール


    • 最も人気のあるスタイル

    • 「マクロと呼ばれるモジュールメソッドを使う」

    • acts_as_csvマクロでdefine_methodを使ってCSVファイルに関する全ての動作を定義(acts_as_csv.rb)

本見ながら書いたもの


















2011年9月22日木曜日

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



探してみよう



試してみよう



感想等


感想

クラスさえもClassクラスのインスタンス。全てがオブジェクト。


そしてModule.classはClassで、Module.class.superclassはModuleで…と頭がこんがらがりそう。


mixinの仕組みは便利ですね。Enumerableはいろんな演算を抽象化していて面白い。


試してみようはTree.rbがあんまりすっきり書けてない感じ。


本文に「このレベルの抽象化でも少しは優れたプログラミング言語になるが、Rubyの真の秘術が登場するのはまだまだこれからだ。」と書いているので次の章が楽しみです。


疑問点



  • PHP 5.4のtraitもmixinのようなものなのかな?


メモ



  • 配列やハッシュやシンボルのリテラルは書き方いくつかあるので詳しくはリテラルを見る

  • 配列


    • [ ]や[ ]=はArrayクラスのメソッド、なのでundefined_variable[0] = 'hoge'とか宣言してない変数の[0]に値を入れようとするとメソッドないよとエラーが出る

    • Rangeを渡したり-1を渡したり使いやすい。キュー、リスト、スタック、セットのように使えるし、どんな型でもok多重配列もok



  • ハッシュ


    • 試しに['hoge' => 'hoge', 0 => 'foo']って書いたら{'hoge' => 'hoge', 0 => 'foo'}を要素に持つ配列が出来た。ちょっと予想外

    • 同じシンボルは同じオブジェクト、文字列が必要なわけじゃないけど、名前が必要、そんな時に用いるらしい


      • 名前付きの引数もハッシュで再現出来る、関数の最後の引数を囲むブレースが省略可能なおかげ





  • 「Rubyが本当の力を発揮するのは、コードブロックを使い始めたとき」

  • コードブロック


    • 詳しくはメソッド呼び出し(super・ブロック付き・yield)を参照

    • 名前のない関数のようなもの、関数やメソッドに引数として実行可能なコードを受け渡し出来る

    • 用途


      • ファイルの角行の処理

      • HTTPトランザクション内で処理

      • コレクションに対して複雑な演算

      • 他にも至るところでブロックが使われる



    • Rubyの慣習では1行だけのコードブロックはブレースで、複数業にまたがるコードブロックはdo/endで囲む



  • クラス


    • 継承関係


      • 全てのクラスの親はObject(1.9ではBasicObject)

      • クラスはClassのインスタンス

      • Classのインスタンスはオブジェクトのテンプレート

      • Classの親はModule



    • 慣習、規則


      • クラスは大文字で始まりキャメルケース

      • インスタンス変数とメソッド名は小文字で始まり、区切りにアンダースコア

      • 定数は全て大文字で書く

      • インスタンス変数の先頭には@をつける

      • クラス変数の先頭には@@をつける

      • 判定用の関数とメソッドには通常、疑問符をつける

      • アクセッサを定義するメソッドがModuleで定義されている(class Module)


        • attrとattr_accessorがよく使われる







  • モジュール


    • クラスに混ぜ込んで(mixinして)使う、モジュールで定義した振る舞い、定数がクラスの一部となる

    • モジュールは複数のクラスメソッドに依存していることが多い

    • Javaでは明示的にinterfaceを実装するがRubyではダックタイピングによって暗黙的に



  • mixin


    • Flavorsで初めて導入、SmalltalkやPythonなどでも使われている。

    • 最も重要なmixinはEnumerableとComparable


      • Enumerableはeachを実装しておけばany?とかall?とかselectとかinjectとか便利なメソッドが使えるように

      • Comparableは<=>(宇宙船演算子)を定義しておけば比較演算が出来るようになる






Reia

p24のtree.rbの例に書いてあったもの。


Reia Programming Language


Erlang VM(BEAM)上で動くRuby-likeな言語らしい。


でももう開発止まっててこれ以上何かを追加する計画はないので興味があるならElixirをチェックしろと書いてますね。


面白そう。Erlangの章読んだらまたチェックしたい。


本見ながら書いたもの

tree.rb



to_file.rb



遊び





2011年9月16日金曜日

7つの言語7つの世界 Ruby 1日目



Okinawa.rbも立ち上がったみたいだし


Ruby入門のレッスン一覧


こんなすごく便利なサイトもあるし、Rubyもっと覚えたい。


残念ながら今のお仕事で使えるかは微妙。


とりあえずの目標として


Rubyアソシエーション: トップページ


シルバーをを受けてみたい。


いつでも試験を受ける環境はある、実行に移せるかは自分次第、なので頑張るのです。


探してみよう




試してみよう



感想等


RubyはOOPL、ダックタイプ、強い型付け、動的型付け。全てがオブジェクト!(数でさえも)


プログラマの生産性を高めてくれる機能がたくさん。


「人間様が気分よくプログラミングするための言語」Rubyは何を目指すのか - GIGAZINE


を読んだ。楽しそう。続けて2日目読みます。楽しい時間はあっというまだなー。





7つの言語7つの世界を読みます。



7つの言語7つの世界を買ったので読みます。Scheme修行と平行して読む。楽しみ楽しみ。7週間で読めるかは微妙なところだけどw


読んだら友達に貸す。貸したら自分で買いそうだけど。早く貸すためにちゃんとサボらず読む。


「はじめに」の中で書いてあったことを意識しながら読みます。



本書を単に読むだけでは、シンタックスの雰囲気はつかめるだろうが、それ以上は無理だ。

実は演習問題をやらずに1回読みました。それ以上を掴むためにもう一度読みます。



演習問題を自分でコーディングしてみる前にネット上で答えを探すようでは、失敗だ。まず自分で解いてみて、いくつかの問題が解けないことを自分自身で認識するようにしてほしい。

まず、自分で1回解くように頑張ります。僕は怠け癖が強いのでついつい調べてばかりで手動かせない。


でもRubyの1日目を解いてからググったら奇麗な解答を見つけることが出来たので終わったらググるの解禁、むしろ積極的にググって他人のコード見ます。


あと序文はかなり共感出来る。人の真似して書いてるだけでちょっとずつ出来ることが増えてくのだとか、実際に書いてコンパイルとおるように直しているうちに気づくこととか。


ちゃんと読むためにエントリかきました。


早速手を動かして、本読みます。


追記


The Pragmatic Bookshelf | Seven Languages in Seven Weeksから本書のコードをダウンロード出来る。


正誤表もあるので不具合あったらチェックします。