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
を実行しています。
どうやら予想は正しかったようで、今回の旅は気持ちよく終了です。
めでたし。めでたし。
おしまい。