Goを落とす会行ってきた

Goコンパイラを落とす会に行ってきました.おかしなコードを喰わせて処理系いぢめてやろうという趣旨です.

gccフロントエンドがよく分からんのでvmware上のubuntuに処理系入れていぢってたんですが,
結論としては…落ちませんでしたorz

やったこと

インターフェース周りの挙動がいまいち理解できんなーということで,
interfaceに(&)付けたり(*)付けたりして型名を表示させたりしてみました.
…んですが,結局よく分からんけどなんとなく実行されてしまうという悲しい結論に….
ikejiさんが仰るには, ポインタ(*)はいい感じにデリファレンスしてくれて初心者はっぴーなんじゃないかと.
(->)は無くていいと思ってたけど実際使うとキモイなーと思いました.というか不安になります.

可変長引数

を受け取る仕組みはCよりはいい感じで,

 func hoge(v ...){ foo(v); }
 func foo(v interface{}){ }

こんな風に空のインターフェースを受け取るので,あとはリフレクションで何とかしてね♪
ということなのですが,型を記述するところにどこでも(...)を使えるわけではないのが中途半端です.

この辺を突いていけば変な挙動が見つかるかもと思いましたが,まぁruntimeの話になっちゃうかも.

それに絡んでマルチバリューですが,

func hoge() (int,int) { // 多分こんな感じ
 return 3,5;
}

とかやると複数の戻り値を戻すことが出来るのでスゲーと思いきや,

(defun hoge ()
  (:documentation "マルチヴぁリューを戻す関数")
  (values 2 3))
(let ((x (hoge))) ;; 返り値2 3を受け取っているがひとつしか受け取ってないので,
  (format t "~a~%" x)) ;; 2が表示される(3は捨てられる)
> 2

こんな感じに,暗黙の内に言及しなかった値を捨ててくれるとか
気の利いたことは無くて,とりあえず受け取る個数を明示しなきゃだめという残念仕様.

ネストした型

id:ytqwertyさんがGoでYコンビネータとか書いててネストした型が定義できてました.すごい!!
ですが,リフレクションで無限ループにはなりませんでした.手強い.

便利なもの

  • リフレクション*1
  • オブジェクトを表示した時の情報が普通に読める.某++みたいにマングルされた記号とかじゃないので分かりやすいです.
  • 適当にマルチプロセスな処理とか作るのは簡単そうです(多分)

Goの宣伝

  • インターフェースという最新機能が使えてDuckタイピングできます
  • 継承なんていう複雑な機能は削除されていて初心者にやさしいです
  • オーバーロードというどれが使われるのか分からないような機能は削除されていて分かりやすいです
  • パッケージローカル/グローバルを,関数名の頭文字が大文字か小文字かで指定します.関数名を見ればどちらか分かって便利です. staticとかめんどくさいことは書かなくてよいです.この調子で,pが付いたらポインタとかmが付いたらメンバとか便利な機能を取り入れて欲しいですね!

その他

終わったあとの飲み会ではid:ranhaさんが世の中の言語処理系のすべてをdisっていました.こわかったです.
なでしこが可哀相な言われようだったけど今はどうなってるんだろう?

日本語がコンパイル出来るのはいつの日か….


以上,協賛はGoogleでお送りしました.

*1:リフレクションがある言語はあんまり使ったことが無いからかも知れないけど. あれくらい普通?