Go言語版Whitespace作ってみました
http://github.com/technohippy/go-whitespace/blob/master/src/whitespace.go
前回、Go言語でBrainf*ckを作ってみたので、今度はやっぱWhitespaceかなと思って軽い気持ちで始めたんだけど、正直Whitespaceをなめてました。もっとこう、一日くらいでさくっとできるかと思ってた。すいません。Brainf*ckは完全にネタだけど、Whitespaceは結構ガチな言語なんすね。るびまの他言語探訪でとりあげられるだけのことはある・・・。手作業でちまちまパースしたけど素直にyaccとか使った方が楽だったかも。
しかも結局公式のExamplesの半分くらいしか動かなくて、後の半分は結果がなんかおかしい。一つ仕様がわからなくて(Haskell読めないし・・・)実装してないインストラクションがあるからそれが原因なのかな。ただ、いかんせんソースは目に見えないし、やってることもいちいちローレベルで確認が面倒だしで、この辺で妥協してもう止めます。いずれ気が向いたときに直すということで。
・・・
直しました。ラベルを数値扱いしてたせいで異なるラベル([Tab][Space][LF]と[Tab][LF]とか)が同一視されてたのがおかしな挙動の原因だった。(2010/10/11)
・・・
とりあえずこれ作っててGo言語について分かったこと。
親切といえば親切だけど、こういうのはWarningくらいでいいんじゃないかとも・・・。
- elseの前に改行が入れられない
if cond { hoge } else { fuga }
これだめ。
if cond { hoge } else { fuga }
こうする。
- 条件文使った時のreturnの判定が・・・
func foo() bar { if cond { return hoge } else { return fuga } }
だとreturnがないって叱られるので
func foo() bar { if cond { return hoge } return fuga }
こんな感じにしたりした。
- 多重代入使ったswapはいい感じ
package main import ("fmt") func main() { var arr = []int{1,2,3,4} arr[1], arr[2] = arr[2], arr[1] fmt.Printf("%v\n", arr) }
$ 6.out [1 3 2 4]
配列要素もswapできた。よしよし。
・・・
まとめると、RubyとかScalaなんかの近代の言語は割とコンパイラやらインタプリタやらが頑張っていい感じに空気を読んでくれるけど、Go言語はむしろ人間の側が気を使ってコンパイラが解釈しやすいようにコード書いてやる必要がある。
まぁ結果的にその方が表記のブレは減るので、そういう判断もありなのかなという感じ。慣れれば意識しなくてもそう書けるようになるだろうし。しかし、PythonといいGo言語といい、Googleは誰が書いても同じような見た目になる言語が好きなんだろうか。
次はゴルーチン使ってなんか作ってみたいすね。