LoginSignup
31
27

More than 5 years have passed since last update.

swiftのREPLで俺モジュールをimportする方法

Posted at

SwiftのREPL、最高。

何が最高かって、あの重いコンダラじゃなくてXcodeを立ち上げなくても使えるところ。Xcode不要なので、Linuxでも動くし。

しかし、perlのuseとかrubyのrequireとかpythonのimport相当のことを、自分の書いたコードに対してやろうとすると一苦労。でも、一旦やり方を掴んでしまえばちょろいもんです。

swift-complexを例に説明します。

「説明は抜きにして、とにかく俺モジュールimportしたいという人は、以下のMakefileを雛形にしてください。

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は成功しますが、実際に使おうとすると…

REPL
% 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>  

こうなってしまいます。ここで無理やり使えるようにしてみましょう。

REPL
  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

31
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
27