В настоящее время я взламываю свой путь, пытаясь сделать квазивоты для написания кода Rust inline в Haskell. Я думаю, что у меня есть работа по генерации кода (включая такие вещи, как марширование типов Haskell с и из Rust). Теперь у меня возникла проблема выяснить, как сделать все компиляцию и привязку из шаблона Haskell. Конвейер выглядит следующим образом:
- Квазиквада анализируется
- Исходный код генерируется для
- соответствующая функция ржавчины
- Импорт Haskell FFI
- вызов Haskell для импортированной функции
- Код Rust скомпилирован в статическую библиотеку (например,
rustc --crate-type=staticlib qq_function.rs -o qq_function.a
) - Код Haskell скомпилирован и связан с
qq_function.a
(и несколькими другими библиотеками, такими какm
,c
и т.д.)
Моя проблема заключается в том, что шаги 3 и 4 выполняются полностью внутри TemplateHaskell
. Вот насколько я получил:
-
runIO
может записывать исходные файлы Rust, которые я создал -
addDependentFile
сообщает GHC, что сгенерированный файл Rust является зависимостью -
addForeignFile
к сожалению не работает для автоматического управления компиляцией, поскольку Rust не поддерживается языком (это подходinline-c
принимает так как C - поддерживаемый язык) -
runIO
можно использовать для создания статической библиотеки Rust (и впоследствии удалить исходный файл Rust), вызываяrustc
.
Что мне все еще не ясно, это
- как я могу использовать Template Haskell для добавления библиотек, с которыми можно связать и
- как я могу использовать Template Haskell для очистки этих сгенерированных библиотек впоследствии?
ИЗМЕНИТЬ
Я подал запрос функции GHC, связанный с этим.