Kompiler untuk menghasilkan kode JavaScript dari Haskell.
Bahkan memiliki situs web dan milis.
Anda memiliki tiga opsi untuk tergesa-gesa: menginstal dari peretasan, dari GitHub atau dari salah satu paket biner yang sudah dibangun. Dalam dua kasus pertama, Anda perlu menambahkan Direktori Tambah Bin Cabal, biasanya ~/.cabal/bin , ke $PATH Anda jika Anda belum melakukannya. Saat menginstal dari Mac, Windows portabel atau paket Linux generik, Anda mungkin ingin menambahkan path/to/haste-compiler/bin ke $PATH Anda. Paket Debian serta penginstal Windows dan skrip instalasi opsional yang termasuk dalam paket Linux generik mengurus ini secara otomatis.
Atau, Anda dapat menginstal versi stabil terbaru dari Hackage:
$ cabal install haste-compiler
$ haste-boot
Bangunan dari sumber GitHub sama mudahnya. Setelah memeriksa sumbernya, cd ke pohon sumber dan jalankan:
$ cabal install
$ haste-boot --force --local
Atau, Anda juga dapat membangun dari sumber GitHub menggunakan tumpukan:
$ stack install
$ haste-boot --force --local
Lihat doc/building.md untuk informasi lebih lanjut tentang persyaratan dan prosedur pembangunan untuk berbagai platform.
Jika Anda mengalami masalah dengan haste-cabal yang dipasang dengan haste-boot , Anda dapat mencoba membangunnya dari awal dan kemudian melewati bendera --no-haste-cabal untuk 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
Saat memasang tergesa -gesa dari GitHub, Anda mungkin harus menjalankan test suite terlebih dahulu, untuk memverifikasi bahwa semuanya berfungsi. Untuk melakukan itu, jalankan ./runtests.sh di direktori root yang tergesa -gesa. Anda juga dapat menjalankan tes tertentu dengan mengeksekusi ./runtests.sh NameOfTest . Suite tes menggunakan nodejs interpreter secara default, tetapi ini dapat dimodifikasi dengan mengatur variabel lingkungan JS demikian: JS=other-js-interpreter ./runtests.sh . Penerjemah JavaScript lainnya mungkin berfungsi atau tidak. runtests.sh tidak diunduh saat menginstal dari peretasan. Anda harus mengunduhnya dari GitHub.
Untuk membangun kompiler penutupan yang ditambal yang digunakan saat menyusun menggunakan --opt-minify , dapatkan sumber penutupan, oleskan patches/closure-argument-removal.patch dan bangun seperti biasanya. Namun ini biasanya tidak diperlukan, karena haste-boot mengambil biner penutupan yang telah dikompilasi sebelumnya saat dijalankan.
Untuk instruksi build lebih rinci, lihat doc/building.md .
Haste telah diuji untuk bekerja pada platform Windows dan OSX, tetapi terutama dikembangkan pada GNU/Linux. Dengan demikian, berjalan di platform GNU/Linux kemungkinan akan membuat Anda lebih sedikit bug.
Untuk mengkompilasi program Haskell Anda ke gumpalan JavaScript yang siap dimasukkan dalam dokumen HTML atau dijalankan menggunakan juru bahasa baris perintah:
$ hastec myprog.hs
Ini setara dengan memanggil GHC -buat myprog.hs; Main.main akan dipanggil segera setelah gumpalan JS telah selesai memuat.
Anda dapat meneruskan bendera yang sama ke Hastec seperti yang biasanya Anda lewati ke GHC:
$ hastec -O2 -fglasgow-exts myprog.hs
Haste juga memiliki set argumen baris perintah sendiri. Memohon dengan --help untuk membaca lebih lanjut tentang mereka. Khususnya --opt-all , --opt-minify , --start dan --with-js harus cukup menarik.
Jika Anda ingin paket Anda dikompilasi dengan tergesa -gesa dan, katakanlah, GHC, Anda mungkin ingin menggunakan ekstensi CPP untuk kompilasi bersyarat. Haste mendefinisikan simbol preprosesor __HASTE__ di semua modul yang dikompilasi. Simbol ini juga dapat digunakan untuk membedakan antara versi tergesa -gesa, karena didefinisikan sebagai representasi integer dari versi Haste saat ini. Formatnya adalah MAJOR*10 000 + MINOR*100 + MICRO . Versi 1.2.3 dengan demikian akan direpresentasikan sebagai 10203, dan 0.4.3 sebagai 403.
Haste juga dilengkapi dengan pembungkus untuk Cabal dan GHC-PKG, masing-masing bernama Haste-Cabal dan Haste-PKG. Anda dapat menggunakannya untuk memasang paket seperti yang Anda lakukan dengan Vanilla GHC dan Cabal:
$ haste-cabal install mtl
Akhirnya, Anda dapat berinteraksi dengan kode JavaScript menggunakan modul Haste.Foreign di perpustakaan haste-lib . Lihat doc/js-externals.txt untuk informasi lebih lanjut tentang itu. Perpustakaan ini juga berisi segala macam fungsi untuk manipulasi DOM, penanganan acara, multitasking preemptive, grafik kanvas, manipulasi string JS asli, dll.
Untuk informasi lebih lanjut tentang seberapa tergesa -gesa bekerja, lihat laporan tergesa -gesa, meskipun berhati -hatilah bahwa bagian -bagian tergesa -gesa mungkin telah berubah sedikit.
Anda juga harus melihat dokumentasi dan/atau kode sumber untuk haste-lib , yang berada di Direktori libraries/haste-lib , dan program-program kecil di Direktori examples , untuk memulai.
Saat menulis program, Anda mungkin ingin menggunakan beberapa javascript asli dalam program Anda; Binding ke perpustakaan asli, misalnya. Cara yang lebih disukai untuk melakukan ini adalah Modul Haste.Foreign :
{-# LANGUAGE OverloadedStrings #-}
import Haste.Foreign
addTwo :: Int -> Int -> IO Int
addTwo = ffi "(function(x, y) {return x + y;})"
Fungsi ffi sedikit lebih aman daripada GHC FFI karena menegakkan beberapa jenis invarian pada nilai yang dikembalikan dari JS, dan lebih nyaman. Dari segi kinerja, kira-kira secepat GHC FFI kecuali untuk tipe kompleks (daftar, catatan, dll.) Di mana itu adalah urutan besarnya lebih cepat.
Jika Anda tidak merasa nyaman membuang seluruh basis kode javascript lama Anda, Anda dapat mengekspor fungsi yang dipilih dari program tergesa -gesa Anda dan menghubungi mereka dari 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"));
}
... lalu kompilasi dengan:
$ hastec '--start=$HASTE_MAIN(); mymain();' --with-js=legacy.js fun.hs
fun.hs akan mengekspor fungsi fun ketika fungsi main dijalankan. JavaScript kami jelas perlu dijalankan setelah itu, jadi kami membuat fungsi utama "nyata" kami di legacy.js . Akhirnya, kami memberi tahu kompiler untuk memulai program dengan terlebih dahulu mengeksekusi fungsi main Haste ( $HASTE_MAIN akan digantikan dengan nama apa pun yang dipilih kompiler untuk main yang tergesa -gesa) dan kemudian mengeksekusi mymain kami sendiri.
Mekanika Haste.Foreign dijelaskan secara rinci dalam makalah ini.
Menggunakan kerangka kerja dari hierarki modul Haste.App , Anda dapat dengan mudah menulis aplikasi web yang berkomunikasi dengan server tanpa harus menulis satu baris Ajax/Websockets/apa pun. Terbaik dari semuanya: Ini benar -benar jenis aman.
Intinya, Anda menulis aplikasi web Anda sebagai satu program - tidak ada lagi pemisahan paksa klien dan kode server Anda. Anda kemudian mengkompilasi program Anda setelah menggunakan tergesa -gesa dan sekali menggunakan GHC, dan dua kompiler masing -masing akan menghasilkan kode klien dan server secara ajaib.
Anda harus menginstal pustaka yang sama dengan GHC bergegas dan vanilla (kecuali jika Anda menggunakan kompilasi bersyarat untuk menyiasati ini). haste-compiler dibundel dengan semua haste-lib , jadi Anda hanya perlu khawatir dengan ini jika Anda menggunakan perpustakaan pihak ketiga. Anda juga akan memerlukan server web, untuk melayani file HTML dan JS Anda; Biner yang dihasilkan oleh Compilation Pass asli hanya berkomunikasi dengan bagian klien menggunakan WebSockets dan tidak melayani file apa pun sendiri.
Contoh-contoh Haste.App beraksi tersedia dalam examples/haste-app dan examples/chatbox .
Untuk informasi lebih lanjut tentang cara kerjanya, lihat makalah ini.
Anda dapat membangun set dokumen Anda sendiri untuk tergesa-gesa dengan menjalankan cabal haddock di direktori dasar tergesa-gesa seperti halnya paket lainnya.
Atau Anda bisa melihat dokumen online.
Haste dapat menggunakan perpustakaan Haskell standar. Namun, beberapa operasi primitif masih belum diimplementasikan yang berarti bahwa kode apa pun yang memanfaatkannya akan memberi Anda peringatan kompiler, kemudian mati saat runtime dengan kesalahan marah. Beberapa perpustakaan juga bergantung pada kode C eksternal -jika Anda ingin menggunakan perpustakaan seperti itu, Anda perlu port bit C untuk sendiri (mungkin menggunakan emscripten) dan menautkannya ke program Anda menggunakan --with-js .
Tidak semua primop GHC diimplementasikan; Jika Anda menemukan primop yang tidak diimplementasikan, silakan laporkan bersama dengan kasus uji kecil yang menunjukkan masalah.
Template Haskell masih rusak.
Kode yang dihasilkan tidak kompatibel dengan vanilla compiler compiler dari ADVANCED_OPTIMIZATIONS , karena tidak dijamin untuk mempertahankan Function.length . Bundel haste-boot Versi kompatibilitas penutupan penutupan yang memang mempertahankan properti ini. Memanggil hastec dengan opsi --opt-minify akan menggunakan versi yang ditambal ini untuk meminifkan kode yang dihasilkan dengan optimasi lanjutan.