tl;dr
go. で始まる関数は、ゲームエンジンのレイヤーに C++ で実装されており、C++ と lua を連携させる機能によって lua から叩けるようになっている。
背景
defold のチュートリアル をやっていると、突然 go.get_position() のようなコードが現れ、
The name
godoes not refer to the current game object. It is the name of the Lua module that contains all game object functions.
などとあっさり説明されるが、lua のことをよくわかっていないのも相まっていまいち腑に落ちない。
気になってチュートリアルの内容が頭に入ってこなくなってしまったので、深入りしない範囲で調べた。
調査
github の defold リポジトリを get_position で雑に検索すると、下記のコードがヒットする。ファイル名からしていかにもそれっぽい。ゲームエンジン自体のソースコードで、C++ で実装されているようだ。
よく見ると、検索にヒットしたのは doc コメントの部分で、関数自体は Script_GetPosition という名前だった。そこで今度はこの Script_GetPosition で検索すると、同ファイル内に GO_methods という連想配列のようなものがヒットする。
最後にその GO_methods で検索すると、再び同ファイル内に luaL_register(L, "go", GO_methods); なるコードがヒットする。名前からしてそれっぽいが、luaL_register は C 言語の関数を lua へ連携するときに使う関数のようだ。第二引数が "go" なのもそれっぽい。
まとめ
go. で始まる関数の呼び出し経路がざっくりとわかったのでよかった。とりあえず「天から降ってきた関数」とでも思っておけばよさそうだ。