読者です 読者をやめる 読者になる 読者になる

ぱちコマな日々

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

Go言語 on WSL #goreをインストール

確認環境

Spec / Version
PC mouse LB-J770X-SH2
OS Windows10 Home (ver 1607 build 14393.187)
Ubuntu(WSL) 14.04.5 LTS
bash(WSL) 4.3.11(1)-release (x86_64-pc-linux-gnu)
golang 1.6

課題:気軽にHello worldしたい

Go言語はコンパイラ型言語です。
コンパイルしないといけません。
その為にはhello.goなどのファイルを作ってコンパイルして実行です。
でも、helloworldのような小さなコードを試すのに、いちいちファイル作らないといけないのは面倒です。
面倒なことは不幸です。
僕は幸せになりたいです。

解決策:Go用REPL goreを使う

PythonRubyなどには標準でついてくるREPL環境があればちょっと幸せになるかもしれません。
REPL(read-eval-print-loop)というのはその名の通り、プログラムを読み込んで評価して結果を出力する動作を繰り返すプログラムです。

GoにもgoreというREPLがあるようです。

$ go get github.com/motemen/gore
go build github.com/motemen/gore: /usr/lib/go/pkg/tool/linux_amd64/compile: read |0: interrupted system call

なんかシステムコールが中断したそうです。
なんでやねん。

go build command-line-arguments: read |0: interrupted system call

ごめんよ、パトラッシュ。いま僕はhelloworldしたいんだ。
ということで、もう一度同じコマンドを実行するとエラーは出なくなり、$GOPATH/bin以下にgoreという実行ファイルも追加されていました。
なんでやねん。

いつか気が向いたら調べてみよう。
キーワードは「SA_RESTART」でしょうか。

hello world @golang

さ、気を取り直してhelloworldです。

$ gore
gore version 0.2.6  :help for help
gore> println("hello world!")
hello world!
gore>

できた!
出力が一瞬遅れるところは裏でコンパイルしてるのでしょうか。
いや、気のせいかな。もう一度やってみよう。

gore> println("hello world!")
hello world!
hello world!
gore> println("hello world!")
hello world!
hello world!
hello world!
gore> 

ナニコレ。出力が増えていってる。

その理由はgore上で:printコマンドを実行すれば分かります。

gore> :print
package main

import "github.com/k0kubun/pp"

func __gore_p(xx ...interface{}) {
    for _, x := range xx {
        pp.Println(x)
    }
}
func main() { println("hello world!"); println("hello world!"); println("hello world!") }

gore>

なるほど、バッファだか一時ファイルだかにコードを保存しておいて、それをgo runやっている気がしますね。

うーん、ホントかな?

きっとつづく。