みたろーのさんどぼっくす

やってみたあんなことやそんなこととかを、気が向いたらまとめてみるよ。

ファイルの読み書きとその周辺 / 7つの言語… Io・2日目・の途中

まさに牛歩。でもやってます的な。

7つの言語 7つの世界

7つの言語 7つの世界

Fileでの読み書き

2日目のやってみよう7は、やってみよう6までで作ったものに、ファイルへの書き出しと読み込みの機能を追加するというもの。とりあえず書いてみた。 Fileプロトタイプのオブジェクトを使ったファイル操作のさわりといったところで、特に凝ったことはする必要ないはず…

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/TwoDimList.io

雑感

  • write の引数に数値を与えたら拒否された。手厳しい。
  • readLine からの戻りは、Stringとnilの2種。readLineの戻りがnilになる直前にisAtEndで検査しても、結果はtrue「にならない」… 深追いはやめた。
  • 改行する場合、行末に「;」は要らない…ことに今更気づいたので修正しておいた。 http://iolanguage.org/scm/io/docs/IoGuide.html#Syntax-Expressions

あと1問で2日目が終わるけれど…

時間切れ。また来週。


ほとんどすべてのものはメッセージ / 7つの言語… Io・2日目・の途中

なかなか進まない…ですが、やってみています。

7つの言語 7つの世界

7つの言語 7つの世界

やってみよう

その1

フィボナッチ数を再帰とループ、それぞれの方法で求めよ、という問題。

これはそこまで難しく…*1ない。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/Fibonacci.io

その2

0除算を受け入れよう、という問題。

これは結局答えを探した。「「割る手続き」がスロットに割り当て済みなら、その手続き自体を、どうにかすれば直接呼べるはず」とか、変な思い込みがあったせいで苦戦。

最初から、別のスロットにオリジナルのスロットの参照先を移しておけばよかったんだね。やれやれ。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/setNewDiv.io

その3

2次元配列の総和を求める話。といっても、配列はないから、リストでいいのかなと曲解。2次元配列=リストのリスト。

リストの要素の和を求めるメッセージは、もともとあるし、mapもあるし、というわけでこうしてみた。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/sum2d.io

flattenもあるから、いっそのこと…とやったのがこれ。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/sumAll.io

その4

とりあえず書いてみた。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/myAverage.io

…以下の点において、納得してない。

  • 「Number」かどうかの判定方法…これでいいのか?
  • ifのネスト
  • call target だらけ…これは仕方ないのかなぁ…

その5とその6

これもとりあえず書いてみた。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Io/Day2/TwoDimList.io

…コレジャナイ感をビシビシ感じるのですが…

ここまでのまとめ

本文中のにあるこの記述。

Ioでは,ほとんどすべてのものはメッセージ

call〜に集約されている気がする。あと、メッセージの戻りに対して更にメッセージを送る記述は、日頃使う言語と大きく違う。これはこれで面白いし、一旦理解してしまえば、わかりやすい。

1日目の本文中に、以下の例が挙げられているんだけど、

people select(age > 20) map(address) println

ようやっと、「ああそういうことか」と腑に落ちた感がある。

ここまでで時間切れ。1日分が1日で終わらないという罠…


*1:ループでフィボナッチ数を求める方法を完全に忘れてしまっていて、そこに苦戦した orz

: ひとつ違うだけで / 7つの言語… Io・1日目

引き続いて、これ、やってます。っと。

7つの言語 7つの世界

7つの言語 7つの世界

で、Io 1日目なわけですが、これが…思った以上に手強い。

探してみようの巻

いきなりここで躓くのです…問題点は「見つからないこと」とか悪態をつきたくなるような。

一応、見つけたリンクを貼っつけておきますかね。

Io Programming/Io Style Guide

http://en.wikibooks.org/wiki/Io_Programming/Io_Style_Guide

…これだけかよ(セルフツッコミ

確認してみよう

強い型付け? 弱い型付け?

*1気を取り直して。Io は、暗黙の型変換がないから、強い型付け。

0, "", nil, true, false

Io では、すべて別のもの。ただ、if()メソッドの条件式においては、nil と false を偽として取り扱い、他の値をすべて真とみなす。そういう意味では、0・""・true は真だし、nil・falseは偽と言える。 Io Programming Guide( http://iolanguage.org/scm/io/docs/IoGuide.html#Control-Flow-If-Then-Else )より抜粋。

if, then, else

The if() method can be used in the form:

if(<condition>, <do message>, <else do message>)

Example:

if(a == 10, "a is 10" print)

The else argument is optional. The condition is considered false if the condition expression evaluates to false or nil, and true otherwise.

プロトタイプに存在するスロット

を確認する方法は、簡単なので、略。

=, :=, ::=

= と := については本文中に違いが説明してあるので省略。では、::= は何か。これもまずは Io Programming Guide( http://iolanguage.org/scm/io/docs/IoGuide.html#Syntax-Assignment )から抜粋。

Assignment

Io has three assignment operators:

 operator  action
 ::=   Creates slot, creates setter, assigns value
 :=    Creates slot, assigns value
 =     Assigns value to slot if it exists, otherwise raises exception

実際に使ってみると、たしかにsetterのスロットも作られる。でもなんで必要なのかよくわからなかった。で、「io language newslot vs setslot」で検索してみると…

Whats the difference between newSlot and setSlot in the Io Language?

http://stackoverflow.com/questions/5972327/whats-the-difference-between-newslot-and-setslot-in-the-io-language

…セッターがないと表現できないことがあって、セッターを作ることを推奨するため、と理解。

試してみよう

試してみた。

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/tree/master/Io/Day1

まとめ?

実は「手強い。」から半分近くまで書いて、約1日たってから後半を書いている。すると、意外とするすると頭の中に収まっていく感じがしている。2日目以降も焦らず地道にやっていく事にする。

という事で、まだまだ続きます。


*1:色々と厳密な定義を忘れてしまっている現実に直面させられる…

Hi ho, Io / 7つの言語… Io・0日目

まだまだ続きます。

7つの言語 7つの世界

7つの言語 7つの世界

で、Io ですが。

f:id:mitaro:20130221221148p:plain

まあ、そうだよね。

Io ( http://iolanguage.org/ )

Ubuntu ではパッケージが見つからなかったので*1、素直にホームページへ。すっごくシンプルで綺麗なトップページ。

それはさておき。せっかくなので、ソースから導入してみよう。ソースはGitHubのリポジトリにある。

f:id:mitaro:20130221222858p:plain

さっさとクローン。

f:id:mitaro:20130221223155p:plain

make、その前に

Ubuntuでは、ビルドに必要になるごく基本的なセットが build-essential パッケージにあるので、入れとく。

f:id:mitaro:20130221224307p:plain

あと、Io のビルドには cmake も必要なので、入れる。

f:id:mitaro:20130221224626p:plain

ビルド!…できない…できた?できた!

f:id:mitaro:20130221225706p:plain

パスが見事に化けてます。「ドキュメント」がよろしくないですね。シンボリックリンクで逃げ。

ln -s ~/ドキュメント/ Documents

気を取り直して、シンボリックリンクの方からパスをたどって、cmake からやり直し…できた!

f:id:mitaro:20130221230601p:plain


思ったよりすんなりできた。よかったよかった。Hi ho, Io!

f:id:mitaro:20130221231014p:plain


*1:ないだろうということはここですでにわかっていたことだけれど。

なんとかクリア…? / 7つの言語… Ruby・3日目

引き続き、これ、やってます。

7つの言語 7つの世界

7つの言語 7つの世界

3日目の「試してみよう」までクリアできたかな?

強力な再定義能力

3日目まで写経すると、本当に強力、いや、破壊的にすら感じる再定義能力に驚く。クラスですら例外なく再定義することができるし、その方法もあっけない。 言語として提供しているデバッグ用メソッドすら上書き、動的にメソッド名を解釈してしまうことができるのには、恐怖すら感じる。

「呼ぶ名がすべて」「応じるならそれでいい」…ダックタイピングって、すごい。

ダックタイピングとmoduleとメタプログラミング

それを強力に推進する仕組みが、moduleを含むメタプログラミングを支援する仕組みなんだろうな、って思った。いいライブラリはメタプログラムがうまくって、ダックタイピングがスラスラとできるようなライブラリなんだろうな。

今回は、そこには手を入れられないけれど。

今回のできた!

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Ruby/Day3/acts_as_csv_with_csvrow.rb

…んー、なんか違う気がする…

ハマり道

  • BasicObject#method_missing の第一引数は、Symbol

    いや、ちゃんとドキュメント引けばわかることだけれども。

  • def self.method_missing? def method_missing?

    「試してみよう」で、CsvRowクラス作って、Romanクラスみたいに method_missingを再定義して…?動かない。 ふと思い立って、Romanクラスにはついてた、「self.」を外した…ら動いた。

    んー。これは違いがわかってない…今日は時間切れ。


Rubyについては一旦これで終わり。 またいつか出会うこともあるでしょう。その頃には 2.x 系がメインになっているかなぁ…

来週からは、Io。…だけど時間が確保できるかな…


Regexp、ARGV、そして、ARGF / 7つの言語… Ruby・2日目

7つの言語 7つの世界

7つの言語 7つの世界

先日、時間切れで試せなかった Ruby・2日目の課題「簡易grep」、やってみたよっと。

正規表現でマッチング

これは組み込みライブラリにある Regexp クラスを使えばいい。

コマンドライン引数を受け取る

これは定数 ARGV *1 を使う、と。

と、そこで ARGF なる定数を発見。

ARGF?

Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > ARGFオブジェクト」の要約から抜粋。

スクリプトに指定した引数 (Kernel::ARGV を参照) をファイル名とみなして、 それらのファイルを連結した 1 つの仮想ファイルを表すオブジェクトです。 ARGV が空なら標準入力を対象とします。 ARGV を変更すればこのオブジェクトの動作に影響します。

今回作ろうとしているものにはピッタリ *2。処理中のファイル名を得ることも(ARGF.filename)、そのファイル中で現在注目している行数(ARGF.file.lineno)を得ることもできる。

自前でガリガリ書かなくていいのはいいね。…途中まで書いてたけど。

できた!

https://github.com/mitaroThanken/seven-languages-in-seven-weeks/blob/master/Ruby/Day2/rb_grep.rb *3

まとめ

とりかかる前に想像した以上にソースがコンパクトになって驚き。

適材適所って、やっぱりあるよな〜と、再認識した次第。

ハマり道

  • new 付けずにオブジェクト作ろうとした(無理
  • 単項演算子 ++ なんてものはない

*1:Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Kernelモジュール 定数」を参照。

*2:指定されたファイルがないときとか、例外的なコトを考えると使いにくくなるかもしれないけれど。

*3:gistみたいに埋め込めないのかな…?

Rubyらしくなりたい / 7つの言語… Ruby・2日目

7つの言語 7つの世界

7つの言語 7つの世界

第2章 Ruby の2日目までたどり着いた。 ただ写経しているだけなら「おお!すげー!」だけで済むのだけれど、だんだんとそうは行かなくなってきた。

ハマり道

  • 「同時に出力」?

    これは単に個人的な読解の問題。

    each_slice する意味がよくわからなかった…、理解を間違えている気がする。

  • (基本的に?)メソッドのオーバーロードはできない。

    何も考えずに引数の数違いの initialize メソッドを作ってしまってハマった。

    できないのは、動的型付けであるところから来ているのかなぁ。 クラスライブラリには、複数の new の仕方を提供しているものもあるけど、どういう作りなんだろう…

今のところ

  • Mixin 面白い。書けないけど。
  • Rubyのコードが少しずつ読めるようになってきている。
  • Rubyらしいコード?を書くには程遠い。リファレンスマニュアルと突き合わせながら何とか書けるくらい。

壁を乗り越えた先には快適な世界がありそうな気がするんだけどなぁ…

蛇足