Могу ли я создать расширяемое (через дополнительные пользовательские плагины) приложение на Haskell?
Я изучаю Хаскелл.
Когда я писал свои приложения на С#, я сделал это расширяемым. То есть его можно расширить за счет загрузки дополнительных пользовательских DLL файлов (плагинов или расширений - это одно и то же). Мое управляемое приложение через механизм Reflection
находит необходимые классы и методы по их некоторым атрибутам и регистрирует их в общем реестре команд моего приложения. Но я могу это сделать, потому что .NET Framework имеет технологию Reflection
. Поэтому я могу расширить функциональность базы моего приложения, не перекомпилируя его.
Могу ли я создать приложение Extensible (через дополнительные пользовательские плагины) на Haskell? Имеет ли Haskell механизм похож на Reflection
на .NET Framework? Или, может быть, существует другой способ сделать то же самое в Haskell.
Ответы
Ответ 1
Существует библиотека GHC для динамической загрузки plugins. Существует также некоторая поддержка своего рода интроспекции, но это на самом деле не путь Haskell.
Вместо этого вы можете добавить функцию register-plugin
предопределенного типа к каждому плагину, а затем вызвать эту функцию при загрузке плагина. Функция, являющаяся частью плагина, может иметь как можно больше знаний о плагине и не нуждается в интроспекции. Основной код не должен знать ничего о плагине рядом с типом register-function
.
Обратите внимание, что это работает и на других языках без интроспекции, например, в C.
Ответ 2
Я предполагаю, что это может не сработать для вас, [XMonad] [1] использует другой подход. Файл конфигурации является исходным файлом Haskell; когда вы меняете конфигурацию и просите перезагрузить, она перекомпилируется и перезапускается. (Он в основном бесшовный).
[1]: http://xmonad.org/ XMonad