如何将 Racket 嵌入到 Swift 项目?

#Innolight

本文结合 Noise 和 Remember 两个真实项目,介绍如何在 macOS/iOS 的 Swift 应用中嵌入 Racket CS 运行时,实现基于序列化 RPC 的跨语言调用架构,助你快速搭建灵活且高效的内嵌脚本环境。

1. Noise 与 Remember 简介

2. Noise 项目架构

Noise 将 Racket CS 运行时拆解为:

3. Racket 运行时准备与集成

  1. 克隆 Racket 源码,编译对应平台静态库:
git clone https://github.com/racket/racket.git
cd racket
git checkout v8.17
make PLATFORM=macosx
  1. 使用 Noise 自带脚本复制资源到项目:
./Bin/copy-libs.sh arm64-macos /path/to/racket/racket
  1. 利用 Xcode 工具合成多架构 xcframework,方便 Swift Package Manager 使用:
xcodebuild -create-xcframework \
  -library Lib/libracketcs-arm64-macos.a -headers Lib/include \
  -output RacketCS-macos.xcframework
  1. Package.swift 中声明:
.binaryTarget(name: "RacketCS-macos", path: "./RacketCS-macos.xcframework")

4. Swift 与 Racket 的通信机制

5. Remember 项目中的调用示例

Remember 中业务层 Backend 类示例:

public func commit(command s: String) -> Future<String, Entry> {
  return impl.send(
    writeProc: { out in
      UVarint(0x0001).write(to: out) // 命令ID
      s.write(to: out)               // 序列化参数
    },
    readProc: { inp, buf in
      return Entry.read(from: inp, using: &buf) // 反序列化返回数据
    }
  )
}

这表示:

6. 线程与 GC 管理

7. 双向交互能力

8. 总结