Компилятор для генерации кода JavaScript от Haskell.
У него даже есть веб -сайт и список рассылки.
У вас есть три варианта поспешения: установка из Hackage, от Github или из одного из предварительно построенных двоичных пакетов. В первых двух случаях вам нужно добавить каталог Bin Add Cabal, обычно ~/.cabal/bin , к вашему $PATH если вы еще этого не сделали. При установке с Mac, портативных Windows или Generic Linux Package вы можете добавить path/to/haste-compiler/bin в свой $PATH . Пакет Debian, а также установщик Windows и дополнительный сценарий установки, включенный в общий пакет Linux, позаботятся об этом автоматически.
Или вы можете установить последнюю стабильную версию от Hackage:
$ cabal install haste-compiler
$ haste-boot
Строительство из источника GitHub одинаково просто. После проверки источника, cd до дерева источника и запустите:
$ cabal install
$ haste-boot --force --local
В качестве альтернативы, вы также можете построить из источника GitHub, используя стек:
$ stack install
$ haste-boot --force --local
См. doc/building.md для получения дополнительной информации о требованиях и процедурах сборки для различных платформ.
Если у вас возникают проблемы с haste-cabal установленной haste-boot , вы можете попробовать построить его с нуля, а затем перенести флаг --no-haste-cabal чтобы haste-boot :
$ git clone https://github.com/valderman/cabal.git
$ cd cabal && git checkout haste-cabal
$ cd Cabal && cabal install
$ cd ../cabal-install && cabal install
При установке спешки с GitHub, вы, вероятно, должны сначала запустить тестовый набор, чтобы убедиться, что все работает. Для этого выполните ./runtests.sh в каталоге Haste Root. Вы также можете запустить только конкретный тест, выполнив ./runtests.sh NameOfTest . Тестовый набор использует интерпретатор nodejs по умолчанию, но это может быть изменено путем установки переменной среды JS как таковой: JS=other-js-interpreter ./runtests.sh . Другие интерпретаторы JavaScript могут работать или не работать. runtests.sh не загружается при установке из Hackage. Вы должны были бы скачать его с GitHub.
Чтобы построить закройной компилятор, используемый при компиляции, используя использование --opt-minify , получите источник закрытия, нанесите patches/closure-argument-removal.patch и создайте его так, как обычно. Однако это обычно не требуется, так как при запуске приводятся haste-boot бутона.
Более подробные инструкции по сборке см. doc/building.md .
Ускорение была протестирована для работы на платформах Windows и OSX, но в основном разработана на GNU/Linux. Таким образом, работа на платформе GNU/Linux, вероятно, заставит вас меньше ошибок.
Для составления вашей программы Haskell с Blob JavaScript, готовым быть включенным в документ HTML или запустить с помощью интерпретатора командной строки:
$ hastec myprog.hs
Это эквивалентно вызову GHC -MyProg.hs; Main.Main будет вызвана, как только Blob JS завершит загрузку.
Вы можете передать те же флаги Hastec, что и обычно передавать в GHC:
$ hastec -O2 -fglasgow-exts myprog.hs
HASTE также имеет свой собственный набор аргументов командной строки. Вызовите это с --help чтобы узнать больше о них. В частности --opt-all , --opt-minify , --start и --with-js должны быть довольно интересными.
Если вы хотите, чтобы ваш пакет компилировался как с поспешной, так и, скажем, GHC, вы можете использовать расширение CPP для условного компиляции. Ускорить определяет символ препроцессора __HASTE__ во всех модулях, которые он компилирует. Этот символ также может быть использован для дифференциации между версиями спешки, поскольку он определяется как целочисленное представление текущей версии HASE. Его формат является MAJOR*10 000 + MINOR*100 + MICRO . Таким образом, версия 1.2.3 будет представлена как 10203 и 0,4,3 как 403.
HASTE также поставляется с обертками для CABAL и GHC-PKG, названного Haste-Cabal и Haste-PKG соответственно. Вы можете использовать их для установки пакетов так же, как и с ванильным GHC и Cabal:
$ haste-cabal install mtl
Наконец, вы можете взаимодействовать с кодом JavaScript, используя модуль Haste.Foreign в библиотеке haste-lib . См. doc/js-externals.txt для получения дополнительной информации об этом. Эта библиотека также содержит все виды функциональности для манипуляций с DOM, обработки событий, упреждающей многозадачности, графики Canvas, нативных манипуляций с струнами JS и т. Д.
Для получения дополнительной информации о том, как работает HASTE, см. Отчет о спешке, хотя остерегайтесь, что части спешки могли немного измениться.
Вы также должны взглянуть на документацию и/или исходный код для haste-lib , который находится в каталоге libraries/haste-lib , и небольших программ в каталоге examples , чтобы начать работу.
При написании программ вы, вероятно, захотите использовать какой -то местный JavaScript в вашей программе; Привязки с нативными библиотеками, например. Предпочтительным способом сделать это является модуль Haste.Foreign :
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
Функция ffi немного безопаснее, чем GHC FFI, поскольку она обеспечивает соблюдение инвариантов типа на значениях, возвращаемых от JS, и более удобна. С точки зрения производительности, он примерно так же быстро, как GHC FFI, за исключением сложных типов (списки, записи и т. Д.), Там, где он на порядок быстрее.
Если вы не чувствуете себя комфортно, выбросив всю свою базу кодов JavaScript JavaScript, вы можете экспортировать выбранные функции из своей программы Haste и позвонить в JavaScript:
fun.hs:
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
import Haste.Prim (toJSStr)
fun :: Int -> String -> IO String
fun n s = return $ "The number is " ++ show n ++ " and the string is " ++ s
main = do
export "fun" fun
Legacy.js:
function mymain() {
console.log(Haste.fun(42, "hello"));
}
... затем компилируйте с:
$ hastec '--start=$HASTE_MAIN(); mymain();' --with-js=legacy.js fun.hs
fun.hs экспортирует функцию fun при выполнении ее main функции. Наш JavaScript, очевидно, должен работать после этого, поэтому мы создаем нашу «реальную» основную функцию в legacy.js . Наконец, мы говорим компилятору запустить программу, сначала выполняя main функцию Haste ( $HASTE_MAIN заменяется каким -либо именем, которое компилятор выбирает для Haste main ), а затем выполняя наш собственный mymain .
Механика Haste.Foreign подробно описана в этой статье.
Используя структуру из иерархии модуля Haste.App , вы можете легко написать веб -приложения, которые общаются с сервером, не писать ни одной строки Ajax/WebSockets/что -то еще. Лучше всего: это полностью тип безопасно.
По сути, вы пишете свое веб -приложение в качестве единой программы - больше не принудительное разделение вашего клиента и кода сервера. Затем вы собираете свою программу, используя спешку и после использования GHC, и два компилятора волшебным образом генерируют код клиента и сервера соответственно.
Вам нужно будет установить одни и те же библиотеки с Haste и Vanilla GHC (если вы не используете условную компиляцию, чтобы обойти это). haste-compiler поставляется в комплекте со всеми haste-lib , поэтому вам нужно беспокоиться только о том, если вы используете сторонние библиотеки. Вам также понадобится веб -сервер, чтобы обслуживать ваши файлы HTML и JS; Бинарный файл, сгенерированный нативным компиляцией, передается только с клиентской частью с использованием веб -питания и не обслуживает никаких файлов самостоятельно.
Примеры Haste.App в действии доступны в examples/haste-app и examples/chatbox .
Для получения дополнительной информации о том, как именно это работает, посмотрите эту статью.
Вы можете построить свой собственный набор документов для Haste-Lib, запустив cabal haddock в базовом каталоге Haste, как и в любом другом пакете.
Или вы можете просто посмотреть на онлайн -документы.
HASTE может использовать стандартные библиотеки Haskell. Тем не менее, некоторые примитивные операции по -прежнему не реализованы, что означает, что любой, использующий их код, даст вам предупреждение компилятора, а затем умрет во время выполнения с гневной ошибкой. Некоторые библиотеки также зависят от внешнего C -кода -если вы хотите использовать такую библиотеку, вам нужно будет перенести биты C в JavaScript самостоятельно (возможно, используя emscripten) и связать их в свою программу, используя --with-js .
Не все PRIMOP GHC реализованы; Если вы столкнетесь с невыполненным primop, сообщите об этом вместе с небольшим тестовым примером, который демонстрирует проблему.
Шаблон Хаскелл все еще сломлен.
Сгенерированный код не совместим с ADVANCED_OPTIMIZATIONS Компилятора Vanilla Compilure, поскольку он не гарантированно сохранит Function.length . haste-boot связка. Совместимость исправленная версия закрытия, которая сохраняет это свойство. Вызов hastec с помощью опции --opt-minify будет использовать эту исправленную версию для министерства сгенерированного кода с помощью расширенных оптимизаций.