SwiftのREPL、最高。
何が最高かって、あの重いコンダラじゃなくてXcodeを立ち上げなくても使えるところ。Xcode不要なので、Linuxでも動くし。
しかし、perlのuse
とかrubyのrequire
とかpythonのimport
相当のことを、自分の書いたコードに対してやろうとすると一苦労。でも、一旦やり方を掴んでしまえばちょろいもんです。
swift-complexを例に説明します。
「説明は抜きにして、とにかく俺モジュールimport
したいという人は、以下のMakefileを雛形にしてください。
MOD=Complex
BIN=main
MODSRC=complex/complex.swift complex/exops.swift
BINSRC=$(MODSRC) complex/main.swift complex/tap.swift
MODULE=$(MOD).swiftmodule $(MOD).swiftdoc
SWIFTC=swiftc
SWIFT=swift
ifdef SWIFTPATH
SWIFTC=$(SWIFTPATH)/swiftc
SWIFT=$(SWIFTPATH)/swift
endif
OS := $(shell uname)
ifeq ($(OS),Darwin)
SWIFTC=xcrun -sdk macosx swiftc
endif
all: $(BIN)
module: $(MODULE)
clean:
-rm $(BIN) $(MODULE) lib$(MOD).*
$(BIN): $(BINSRC)
$(SWIFTC) $(BINSRC)
test: $(BIN)
prove ./$(BIN)
$(MODULE): $(MODSRC)
$(SWIFTC) -emit-library -emit-module $(MODSRC) -module-name $(MOD)
repl: $(MODULE)
$(SWIFT) -I. -L. -l$(MOD)
make repl
すれば、このとおり。
で、何をしているのかを解説します。まず、ビルドの部分。
swiftc -emit-library -emit-module complex/complex.swift complex/exops.swift -module-name Complex
こうすることで、
Complex.swiftmodule
Complex.swiftdoc
-
libComplex.dylib
(LinuxならlibComplex.so
)
という三つのファイルが作られます。うち上の二つがあればimport
は成功しますが、実際に使おうとすると…
% swift -I. -L.
Welcome to Apple Swift version 2.1.1 (swiftlang-700.1.101.15 clang-700.1.81). Type :help for assistance.
1> import Complex
2> 1+1.i
error: Couldn't lookup symbols:
__TFeRq_7Complex14ArithmeticType_S_S0_g1iGVS_7Complexq__
__TZF7Complexoi1puRq_S_14ArithmeticType_FTq_GVS_7Complexq___GS1_q__
__TWPSi7Complex14ArithmeticTypeS_
2>
こうなってしまいます。ここで無理やり使えるようにしてみましょう。
2> import Foundation
3> dlopen("./libComplex.dylib",0)
$R0: UnsafeMutablePointer<Void> = {
_rawValue = 0x0000000100704150 -> 0x00007fff5fc38e48 dyld`vtable for ImageLoaderMachOCompressed + 16
}
4> 1+1.i
$R1: Complex.Complex<Int> = {
re = 1
im = 1
}
もうわかりましたね。実装はlib
の方にあって、.swiftmodule
にあるのは対応表だけなのだと。ちなみに.swiftdoc
にはdoc commentなどが入っているようです。
というわけでまとめると、
-
-emit-library -emit-module
でモジュールファイルと shared library を同時に作っておき、 -
swift
起動時に-I. -L. -lModuleName
であらかじめそれらを読んでおく
というのが、「俺モジュールをimport
する」という設問の回答になります。
Enjoy!
Dan the Swift Newbie