一些近期造的輪子
不知不覺專欄又長草很久。。sigh,那就整理下這段時間的新坑吧,顯得自己不那麼怠惰(逃
cabal-toolkit
主要包含一些用於寫複雜的 Cabal build script 的輪子。目前的一項主要功能是在 post configure 階段將當前 Haskell package 的 Cabal 元數據序列化,這些元數據可以通過 Template Haskell 獲取。
這些元數據在編譯期或者運行期的應用有很多,比如可以在安裝目錄里編譯安裝 non-Haskell 依賴,或者使用 GHC API 動態編譯 Haskell 代碼時,確保編譯選項和所用的 package database 和當前 package 完全一致,這樣一來無需額外配置就可以調用非 ghc 內置的 package,等等。
TerrorJack/msbuild
用於在 Haskell 中查詢本機的 MSBuild/Visual Studio 安裝信息,在相應的 vcvarsall.bat 的 cmd shell 中執行命令,比如調用 cl.exe 編譯單個 C++ stub file 並生成 dll,生成的 dll 可以在 Haskell 中動態載入。
按理說,ghc 內置的 mingw-w64 工具鏈裡面已經帶了一套 Windows SDK 的頭文件和庫,可以在 gcc/g++ 中使用,比如 ghc 自帶的 Win32 庫就是這麼乾的。然而實踐中我發現 Windows SDK 裡面,純 C 的 API 這麼調是沒問題,然而需要調 C++ 的介面(比如涉及 COM 的 API),用 g++ 編譯容易出莫名其妙的編譯錯誤,然而同一段 C++ stub 交給 cl.exe 編譯就毫無問題。M$ 的平台果然還是得用 M$ 的工具鏈。。所以造了這個輪子,用於在 Haskell 中無痛調用 M$ 工具鏈。
一開始只是想寫個簡單的腳本,調用 IDesktopWallpaper::SetWallpaper method 把桌面壁紙自動換成近期推過的黃油的 HCG。發現了一個隱藏的坑。。
TerrorJack/nodejs-interop
用於在 Haskell 中用 node.js 執行 JavaScript 腳本並獲取執行結果。可以通過 npm 裝依賴,可以在 JavaScript 中非同步返回執行結果,也可以通過 QuasiQuotes 擴展直接在 Haskell 源文件中使用 inline JavaScript。
這個主要是給自己的編譯器坑用的。一些涉及 JavaScript 操作的基礎設施(比如 Parser、Prettifier、Minifier 等),Haskell 社區自己的輪子太舊(比如 2017 年了還不支持 arrow function),不如想辦法調用 JavaScript 社區自己的輪子。當然,其他用途也有待發現,不管怎麼說,類型安全的社區和人氣火爆的社區,雙份的快樂總是值得擁有的。
TerrorJack/ghc-alter
自己的編譯器坑用到的中間層,因為 GHC API 用起來實在不那麼趁手。
TerrorJack/meikyu
一個用於在 Circle CI 上構建 Haskell 項目的 Docker image,預置了許多 Stackage Nightly 的包以節省構建時間。
TerrorJack/direct-rocksdb
RocksDB 的 Haskell 綁定。跟 Hackage 上另一個綁定庫相比,不鏈接系統的 RocksDB 庫而是現場編譯最新版的。目前底層的 C bindings 施工完畢(2000+行 Haskell。。),支持 RocksDB C API 的全部功能。上層介面有空慢慢加。。
推薦閱讀: