公開技術情報

[English] [Japanese]

80.2 Go 言語へのトランスコンパイル時のパッケージ

go でパッケージ管理されているモジュールを LuneScript から利用できます。

go のパッケージ管理概要

go は go.mod でパッケージを管理します。

この go.mod で管理されたパッケージは、 環境変数 GOPATH で指定されたローカルディレクトリにキャッシュされます。

LuneScript は、このキャッシュされたモジュールを利用できます。

github 上のパッケージを go で利用するには、次のように書きます。

import "github.com/ifritJP/lnshttpd"

これと同じ感覚で、 LuneScript は go のモジュールにアクセスできます。

import

go のパッケージ内にある .lns ファイルを LuneScript で import するには、 次のように書きます。

// @lnsFront: skip
import go/github:com.ifritJP.lnshttpd.lnsservlet;

これは https://github.com/ifritJP/lnshttpd の lnsservlet.lns を import する時の例です。

ここで、 go/github:com.ifritJP.lnshttpd.lnsservlet に注目します。

https://github.com/ifritJP/lnshttpdgo/github:com.ifritJP.lnshttpd.lnsservlet を見比べればだいたい想像が付くと思いますが、 go のパッケージを使用する場合、次の追加ルールがあります。

  • 先頭に go/ を付加する
  • github.com のように . が付く場合、 . の代わりに : を指定する

LuneScript は、上記形式のモジュールが指定された場合、 通常の検索パスではなく、 go のパッケージパスからモジュールを検索します。

具体的には、次の順番にファイルを検索します。

  • vendor/github.com/ifritJP/lnshttpd/lnsservlet.lns
  • ${GOPATH}/pkg/mod/github.com/ifrit!j!p/lnshttpd@XXXXXXXXXXXXXXXXX/lnsservlet.lns

ここで、 @XXXXXXXXXXXXXXXXX/lnsservlet.lnsXXXXXXXXXXXXXXXXX の部分は、 go.mod に記載されているモジュールの TAG 情報から取得します。 つまり、事前に go mod tidy を実施しておく必要があります。

module

go のモジュールを LuneScript から利用するには、 module 宣言が必要です。

module 宣言は LuneScript から Lua モジュールを利用する際にも使用していますが、 go モジュールを利用する場合、次の追加ルールがあります。

  • go のモジュールを利用していることを module 宣言に追加する

以下は github.com.ifritJP.lnshttpd の servlet.go を利用する際の宣言例です。

// @lnsFront: skip
module servlet require "go/github:com.ifritJP.lnshttpd.servlet" of "" {
   pub static fn Start( listenPort:int,
                        handlerList: &List<&lnsservlet.HandlerInfo>,
                        hostingList:&List<&lnsservlet.HostingInfo> );
}

ここで module servlet require "go/github:com.ifritJP.lnshttpd.servlet" of ""of "" は、利用するモジュールの種別を宣言しています。

指定可能な文字列は次の通りです。

文字列 モジュールの言語
"" トランスコンパイル先言語と同じ
"Lua" lua
"Go" go

利用可能な言語

トランスコンパイル先の言語と、 module で利用可能な言語の組み合わせには制限があります。

go module lua module
go へトランスコンパイル 可能 可能
lua へトランスコンパイル 不能 可能

型の互換性

module 宣言で go モジュールを LuneScript から利用可能です。

しかし、型の互換性は制限されます。

以下の型は LuneScript と go とで対になっています。

LuneScript の型 go の型
int int
real float64
bool bool
str string
nilable interface{}