2017-03-11 19 views
-1

我正在學習單身漢工作,並且正在構建類似於解釋器的東西。我想將Javascript代碼轉換爲Python。我來到,我想轉換爲循環成Python的一個點,看起來像這樣:Pythonize循環使用的腳本

for(var x = 0; x < some_length; x++) { 
} 

在Python它應該是這樣的:

for x in range(0, some_length): 

問題是我要覆蓋所有的這可能發生,例如像案​​件倒退這樣的:

for(var x = some_length - 1; x >= 0; x--) { 
} 

有人可以幫我寫,將transpile到蟒蛇這樣的功能?

重要編輯!

爲輸入功能,將transpile for循環到蟒蛇是:

function pythonize(firstAction, condition, action) 

其中

firstAction = "x = 0", 

condition = "x < some_length" 

action = "x++" 

回答

1

它會像,你可以檢查range功能更多的詳細的用法:

for x in range(some_length - 1, -1, -1): 

注意我將步驟從x++遞減,否則for循環將不會終止。

1

range接受start, end, step,所以你可以做

for x in range(some_length-1, -1, -1) 

另一種選擇是

for x in reversed(range(some_length)) 

注:我假設你在你的第二個例子的意思是x--

0

我已經創造了這個長函數將javascript for循環轉換爲python for循環:

function pyt(c) { 
    var cc = c.split('(')[1]; 
    cc = cc.substr(0,cc.length-1); 
    pp = cc.split(';'); 
    var r1 = /[A-Za-z\$\_]{1}[A-Za-z0-9\_]* ?= ?(.*)/.exec(pp[0])[1]; 
    var r2 = ''; 
    if(pp[1].indexOf('<') > -1) { 
    r2 = /[A-Za-z\$\_]{1}[A-Za-z0-9\_]* ?<=? ?(.*)/.exec(pp[1])[1] 
    } else if(pp[1].indexOf('>') > -1) { 
    r2 = /[A-Za-z\$\_]{1}[A-Za-z0-9\_]* ?>=? ?(.*)/.exec(pp[1])[1] 
    } 
    var delta = 0; 
    if(pp[1].indexOf('>=')) { 
    delta = -1; 
    } 
    if(pp[1].indexOf('<=')) { 
    delta = 1; 
    } 
    var e2 = 0; 
    if(!isNaN(r2)) { 
    e2 = Number(r2) + delta; 
    } else { 
    if(delta !== 0) { 
     e2 = r2 + (delta > 0 ? '+' : '-') + delta; 
    } else { 
     e2 = r2; 
    } 
    } 

    var r3 = ''; 
    if(/[A-Za-z\$\_]{1}[A-Za-z0-9\_]*\+\+/.test(pp[2])) { 
    r3 = '1'; 
    } else if(/[A-Za-z\$\_]{1}[A-Za-z0-9\_]*\-\-/.test(pp[2])) { 
    r3 = '-1'; 
    } else { 
    if(pp[2].indexOf('+=') > -1) { 
     r3 = /[A-Za-z\$\_]{1}[A-Za-z0-9\_]* ?\+= ?(.*)/.exec(pp[2])[1]; 
    } else if(pp[2].indexOf('-=') > -1) { 
     r3 = /[A-Za-z\$\_]{1}[A-Za-z0-9\_]* ?\-= ?(.*)/.exec(pp[2])[1]; 
    } else { 
     if(/([A-Za-z\$\_]{1}[A-Za-z0-9\_]*) ?= ?\1 ?\+ ?(.*)/.test(pp[2])) { 
      r3 = /([A-Za-z\$\_]{1}[A-Za-z0-9\_]*) ?= ?\1 ?\+ ?(.*)/.exec(pp[2])[2]; 
     } else { 
     r3 = /([A-Za-z\$\_]{1}[A-Za-z0-9\_]*) ?= ?\1 ?\- ?(.*)/.exec(pp[2])[2]; 
     } 
    } 
    } 
    p = 'for i in range(' + r1 + ', ' + e2 + ', ' + r3 + ')'; 
    return p; 
} 

var c = "for(i = 30 + y;i>=10 - 1; i = i + 0.1)"; 
console.log(pyt(c)); 

https://jsfiddle.net/x7uhxbua/12/

它基本上是使用正則表達式做魔術。它涵蓋了大多數情況,但不是全部。