2015-10-20 52 views
0

我試圖創建一個宏,在每次調用時將增量值展開到輸出中。到目前爲止,我已經得到了這一點,但它的價值每一次重新初始化爲0:在sweet.js情況下使用全局變量

macro test1 { 
    case { _ $x 
    } => { 
     var n = n ? n+1 : 0; 
     letstx $n = [makeValue(n,#{here})]; 
     return #{ 
      $n; 
     } 
    } 
} 

test1() 
test1() 

產量:

0; 
0; 

當我要的是:

0; 
1; 

如何我是否將n定義爲全局變量,以便我可以在宏之外增加並保留其值?

更新:

我可以得到它通過改變一個eval分配給n工作,但這次真的感覺就像作弊:

var n = eval("if (typeof n != 'undefined') n++; else n=0; n") 
+0

你想達到的不是Sweet.js在MHO中的含義。其實,在這種情況下你並不需要Sweet.js。它可以通過純Java JS實現,如線程[here](http://stackoverflow.com/questions/1535631/static-variables-in-javascript)中所述。 – Season

+0

如果您有權訪問全局對象,如 「窗口」,則可以通過向窗口對象添加諸如 「n」的屬性來利用該對象。 – Don

+0

@季節這實際上只是一個簡化的測試用例。我真的需要sweet.js來進行宏觀擴張。 – Michael

回答

1

目前(有計劃加以改善)你可以使用全局對象:

macro test1 { 
    case { _ $x 
    } => { 
     window.n = typeof window.n !== 'undefined' ? window.n+1 : 0; 
     letstx $n = [makeValue(n,#{here})]; 
     return #{ 
      $n; 
     } 
    } 
} 

test1() 
test1() 
+0

我不認爲使用'window'是可移植的......但我只是嘗試了一個快速實驗,看起來我可以單獨使用「n」(沒有將它定義爲var),它會顯示在全局環境。 – Michael

+1

是的。如果你想表達清楚,我認爲'this.p'應該可以在任何地方工作。 – timdisney

相關問題