ぱちコマな日々

ざれごと、たわごと、うわごと、しごと。

goreのコードをちょっとだけ眺めてみる

旅の目的

goreのコードをちょっとだけ覗いてみて、こちらの記事go runで実行していそうという予想が正しいか確認してみますかね。

motemen/gore/main.go Version: 0.2.6

ほうほう、これがgo言語のコードか。
コメントがほとんどなくても読めるのは、Go言語の性能なのか、書いてる人の表現力が高いからなのか。
まぁおそらく両方なのでしょうが、勉強にもなるしありがたいことですね。
motemenさん、ありがとうございます。

main関数

さて、Go言語はmainという関数から始まるそうです。

main関数を眺めてみますと、起動オプションの解析などの準備処理後に無限ループが登場します。きっとメインループですね。

メインループの中ではrl.Prompt()という処理でユーザからの入力を受け付けて、s.Eval(in)という処理で実行していそうな気配です。
なんじゃ、sって。
と、main関数をさかのぼると、始めのほうでNewSession()により返されているSession型オブジェクトのようです。
このSession型というのはmain.goで定義されている構造体でした。
今日のところはメンバから何となく妄想するだけにとどめましょう。

データ定義にはコメントが欲しい気がしますね。。。
Go言語に精通した人なら型である程度正確に予測できるのかもしれませんが、素人の僕には名前だけだとちょっと用途が絞りきれないかなぁ。。。
あーはやく人間になりたい。

Eval関数

さ、本題であろうEval関数を覗いてみましょう。

なんじゃcommandsって。
どうやら、gore内で使用できる:printなどのコマンドのことのようです。
commands.goで定義されています。
そちらが入力されたときは、各コマンドの実行処理を行って関数を抜けてそうな気配ですね。
そうでない場合、入力文が正しいかチェックした後にs.Run()で実行しているみたいです。
ゴールは目の前に違いない!

Run関数

残念、まだゴールではありませんでした。なかなか憎い演出です。

ここでは実行用のファイルを作っているようです。
そして作ったファイルのパスを引数にしてgoRun()なるものをコールしています。 今度こそゴールなるか。。。

goRun関数

おめでとうございます。ついに約束の地に辿り着きました。

やはりgoコマンドのオプションとしてrunを指定していますね。
なんやかんや処理して最後にgo runを実行しています。

どうやら予想は正しかったようで、今回の旅は気持ちよく終了です。

めでたし。めでたし。

おしまい。