2013-06-22 21 views
4

是否有可能需要從nodejs中服務器端的其他簡單JavaScript文件中的fay-compiled模塊?那會很好。也許在編譯器中有一些選項可以生成commonjs兼容的模塊?要求來自nodejs的fay代碼

回答

1

這可能是一個糟糕的主意,因爲這取決於相當多的費伊的特殊性生成的代碼。

注意以下幾點:

  • 無論編譯的模塊的名稱,仙女實例到變量main
  • 在node.js下,require的返回值是模塊的modules.export(最初與export的對象相同 - 但它不一定保持那種方式)。
  • 變量可以在使用var聲明範圍之前使用。引用的變量是相同的。它關心的不是源代碼排序,而是運行時發生的一切。
  • 默認情況下(即沒有0​​)可以實例化對象並執行main

值得注意的是,這意味着我們可以內main,修改module.exportsexports出口的仙女代碼。當然,我們必須使用ffi,但這是一件相當簡單的事情;下面,沒有--library編譯(其中,是的,是輕度違反直覺的,並且確實能讓人相信的假設,這是一個討厭的黑客,不會吧)的工作在一定程度上:

import FFI 

main :: Fay() 
main = ffi "module.exports = main" 

require「從節點d,返回的對象是值得的

{ 'Main$main': 
    { forced: true, 
    value: { value: [Circular] } }, 
    _: [Function: Fay$$_], 
    '$': [Function: Fay$$$], 
    '$fayToJs': [Function: Fay$$fayToJs], 
    '$jsToFay': [Function: Fay$$jsToFay] } 

隨着仙女的內部表示的工作知識的效果,則有可能(儘管也許太多精力)寫一個JavaScript包裝爲所有thunk-強迫等。

(我們可以做更多的 - 其實,用多一點FFI的工作,我們可以所有綁定爲FFI代碼這將是溫和的愚蠢,雖然。)

+0

聰明:) 編寫一個包裝是一些工作,但它不應該太難用新的代碼生成器。通過一個標誌,編譯器可以爲每個Fay模塊生成嚴格的模塊,以適當地進行強制和代碼轉換。 –

1

可以使用JavaScript中的fay代碼,但目前它有點冗長,您需要使用完全限定名稱並手動強制調用函數。

var m = new Main(); 
document.body.innerHTML = "The 10th fibonacci number is : " + m._(m.Main$fibN(9)); 

現在一切都在Main內部,因此我們希望將每個模塊的編譯分開,以便每個模塊都可以單獨輸出。 (那麼我們也可以遷移到haskell-packages

然後,我們需要輸出一個包裝器,它可以爲每個模塊強制和類型轉換,所以當你從JavaScript調用時不需要手動轉換。

這裏有一些相關的門票:#279260

+0

感謝您的答覆。現在我有很多用coffeescript編寫的代碼,並在服務器上的node.js環境中執行。由於缺乏良好的類型檢查系統和其他haskell優勢,我想嘗試重寫faylang中的一些單獨模塊。而現在我不知道如何與舊代碼中的這些模塊進行交互。我怎樣才能導出這個主要功能? – AlexMost

+0

當您實例化模塊時,您的Fay源代碼中的主模塊導出的所有內容都將導出。 'var m = new Main(); m._(m.main)'應該訣竅 –

+0

nodejs並沒有真正讓這種全球範圍的污染飛 - 模塊編譯基本上最終是文件範圍,這是沒用的包括。 – muhmuhten