Идёт разработка Haste (HASkell To Ecmascript) - компилятора из Haskell в JavaScript.
Перед проектом стоит цель создать практичный компилятор из Haskell в Javascript.
В частности:
- Код должен работать не более чем в 10 раз медленнее, чем написанный вручную на JavaScript;
- Код не должен быть слишком большим или тянуть за собой большой framework;
- Простая интеграция с другим кодом на JavaScript.
За образец взят GHCJS. От поддержки (псевдо-)многогопоточности решено отказаться.
Из одного исходника получается две программы: JavaScript для исполнения в браузере и серверное приложение. Связь между ними происходит через WebSockets.
Пример программы (sendfile - загрузка файла на сервер через WebSocket):
import Haste.App
import Haste.Binary
import qualified Data.ByteString.Lazy as BS
main = runApp def $ do
upload <- remote $ \name file -> do
filedata <- getBlobData file
liftIO $ BS.writeFile name (toByteString filedata)
runClient $ withElems ["file","upload"] $ \[file,btn] -> do
btn `onEvent` OnClick $ \_ _ -> do
mfd <- getFileData file 0
case mfd of
Just fd -> do
fn <- getFileName file
onServer $ upload <.> fn <.> fd
alert "File uploaded!"
_ -> do
alert "You need to specify a file first."
--<html> <body>
--<script src="sendfile.js"></script>
--<input type="file" id="file"><br>
--<input type="button" id="upload" value="Upload file">
--</body></html>
Из этого примера получается серверная программа размером олоко 3 мегабайт (без отладочных символов), и один файл javascript размером около 80 килобайт (57 из них - постоянная составляющая).
>>> Подробности