مترجم لإنشاء رمز JavaScript من Haskell.
حتى أنه يحتوي على موقع ويب وقائمة بريدية.
لديك ثلاثة خيارات للحصول على العجلة: التثبيت من Hackage ، من Github أو من واحدة من الحزم الثنائية التي تم إنشاؤها مسبقًا. في أول حالتين ، تحتاج إلى إضافة دليل إضافة Cabal ، عادةً ~/.cabal/bin ، إلى $PATH الخاص بك إذا لم تكن قد فعلت ذلك بالفعل. عند التثبيت من Mac أو Windows المحمولة أو حزمة Linux العامة ، قد ترغب في إضافة path/to/haste-compiler/bin إلى $PATH الخاص بك. حزمة Debian وكذلك مثبت Windows والبرنامج النصي للتثبيت الاختياري المدرج في حزمة Linux العامة تعتني بهذا تلقائيًا.
أو يمكنك تثبيت أحدث إصدار مستقر من Hackage:
$ cabal install haste-compiler
$ haste-boot
بناء من مصدر جيثب سهل بنفس القدر. بعد التحقق من المصدر ، 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 في دليل الجذر العجول. يمكنك أيضًا إجراء اختبار معين فقط عن طريق تنفيذ ./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 -Make MyProg.hs ؛ سيتم استدعاء Main.main بمجرد انتهاء JS Blob من التحميل.
يمكنك تمرير نفس الأعلام إلى Hastec كما تنقل عادة إلى GHC:
$ hastec -O2 -fglasgow-exts myprog.hs
Haste لديها أيضا مجموعة من وسائط سطر الأوامر. استدعاء مع --help لقراءة المزيد عنها. على وجه الخصوص-يجب أن تكون مثيرة للاهتمام إلى حد ما- --opt-all ، --opt-minify --start ، --with-js .
إذا كنت تريد أن تجمع الحزمة الخاصة بك بكل من العجلة ، وقل ، قد ترغب في استخدام امتداد CPP للتجميع الشرطي. يحدد العجلة رمز المعالج المسبق __HASTE__ في جميع الوحدات النمطية التي يجمعها. يمكن أيضًا استخدام هذا الرمز للتمييز بين إصدارات العجلة ، حيث يتم تعريفه على أنه تمثيل عدد صحيح لإصدار العجلة الحالية. تنسيقه هو MAJOR*10 000 + MINOR*100 + MICRO . وبالتالي ، سيتم تمثيل الإصدار 1.2.3 كـ 10203 ، و 0.4.3 AS 403.
يأتي Haste أيضًا مع أغلفة لـ Cabal و GHC-PKG ، والتي تحمل اسم Haste-Cabal و Haste-PKG على التوالي. يمكنك استخدامها لتثبيت الحزم تمامًا كما تفعل مع Vanilla GHC و Cabal:
$ haste-cabal install mtl
أخيرًا ، يمكنك التفاعل مع رمز JavaScript باستخدام Haste.Foreign Module في مكتبة haste-lib المجمعة. انظر doc/js-externals.txt لمزيد من المعلومات حول ذلك. تحتوي هذه المكتبة أيضًا على جميع أنواع الوظائف لمعالجة DOM ، ومعالجة الأحداث ، والتعدد الوارد في تعدد المهام ، ورسومات قماش ، ومعالجة سلسلة JS الأصلية ، إلخ.
لمزيد من المعلومات حول كيفية عمل العجلة ، راجع تقرير العجلة ، على الرغم من أن حذرة أن أجزاء من العجلة قد تغيرت قليلاً.
يجب أن تتم إلقاء نظرة على الوثائق و/أو التعليمات البرمجية المصدر لـ 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 Legacy بالكامل ، فيمكنك تصدير وظائف محددة من برنامج التسرع والاتصال بها من JavaScript:
المرح. 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 بأي اسم يختاره المترجم لـ The Haste main ) ثم تنفيذ mymain الخاص بنا.
يتم وصف ميكانيكا Haste.Foreign .
باستخدام الإطار من التسلسل الهرمي للوحدة Haste.App ، يمكنك بسهولة كتابة تطبيقات الويب التي تتواصل مع خادم دون الحاجة إلى كتابة سطر واحد من Ajax/Websockets/أيا كان. أفضل ما في الأمر: إنه نوع آمن تمامًا.
في جوهرها ، تكتب تطبيق الويب الخاص بك كبرنامج واحد - لا يوجد فصل قسري عن رمز العميل والخادم الخاص بك. تقوم بعد ذلك بتجميع البرنامج بمجرد استخدام العجلة وبمجرد استخدام GHC ، وسيقوم المترجمان بإنشاء رمز العميل والخادم بطريقة سحرية على التوالي.
ستحتاج إلى تثبيت نفس المكتبات مع كل من العجلة والفانيليا GHC (إلا إذا كنت تستخدم التجميع الشرطي للالتفاف على هذا). يأتي haste-compiler المتجانسة مع كل من haste-lib ، لذلك عليك فقط أن تهتم بهذا إذا كنت تستخدم مكتبات أطراف ثالثة. ستحتاج أيضًا إلى خادم ويب ، لخدمة ملفات HTML و JS ؛ يتواصل الثنائي الذي تم إنشاؤه بواسطة ممر التجميع الأصلي فقط مع جزء العميل باستخدام WebSockets ولا يخدم أي ملفات من تلقاء نفسه.
أمثلة على العجلة. app in Action متوفرة في examples/haste-app examples/chatbox .
لمزيد من المعلومات حول كيفية عمل هذا بالضبط ، راجع هذه الورقة.
يمكنك إنشاء مجموعة من المستندات الخاصة بك لـ Haste-Lib عن طريق تشغيل cabal haddock في دليل قاعدة العجلة كما هو الحال مع أي حزمة أخرى.
أو يمكنك فقط إلقاء نظرة على المستندات عبر الإنترنت.
العجلة قادرة على استخدام مكتبات هاسكل القياسية. ومع ذلك ، لا تزال بعض العمليات البدائية غير تنفذ ، مما يعني أن أي رمز يستخدمها سيمنحك تحذيرًا عن برنامج التحويل البرمجي ، ثم يموت في وقت التشغيل بخطأ غاضب. تعتمد بعض المكتبات أيضًا على رمز C الخارجي -إذا كنت ترغب في استخدام مثل هذه المكتبة ، فستحتاج إلى نقل البتات C إلى JavaScript بنفسك (ربما باستخدام emscripten) وربطها في برنامجك باستخدام --with-js .
لا يتم تنفيذ جميع Primops GHC ؛ إذا واجهت primop غير منصوص عليه ، فيرجى الإبلاغ عن ذلك مع حالة اختبار صغيرة توضح المشكلة.
قالب هاسكل لا يزال مكسورًا.
الكود المولد غير متوافق مع ADVANCED_OPTIMIZATIONS المترجمة الخاصة بـ Vanilla Closure ، لأنه غير مضمون للحفاظ على Function.length . حزم haste-boot التوافق نسخة مصححة من الإغلاق والتي تحافظ على هذه الخاصية. سيستخدم استدعاء hastec مع خيار- --opt-minify هذا الإصدار المصحح لتحديد الرمز الذي تم إنشاؤه مع التحسينات المتقدمة.