2015-07-09 6 views
0

Пример, приведенный Skulpt запускает интерпретатор на всю строку, содержащую программу питона:Как использовать Skulpt для Eval Python построчно

https://github.com/skulpt/skulpt/blob/master/example/calling_from_js.html

Есть ли возможность запуска интерпретатора построчно , например, чтобы выделить строку Python, которая в настоящее время выполняется?

Заранее спасибо.

ответ

0
var program = "print('something')\nprint('something else')"; 

var programs = program.split("\n"); 

for(var i = 0; i<programs.length; i++){ 
    //skulpt on `programs[i]` and highlight that line 
} 

По сути, вы просто хотите сделать что-то вроде этого:

  1. Split полную программу в серию линий
  2. Запуск каждой строки через Skulpt индивидуально (выделить эту линию в случае необходимости)

Немного модифицированный код от вашего второго звена:

<script src="../dist/skulpt.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    function outf(text) 
    { 
     var output = document.getElementById("output"); 
     text = text.replace(/</g, '&lt;'); 
     output.innerHTML = output.innerHTML + text; 
    } 
    function runit(prog) 
    { 
     //changed this so the function accepts an argument 
     var output = document.getElementById("output"); 
     output.innerHTML = ''; 
     Sk.configure({output:outf}); 
     try { 
      var module = Sk.importMainWithBody("<stdin>", false, prog); 
      var obj = module.tp$getattr('a'); 
      var runMethod = obj.tp$getattr('run'); 
      var ret = Sk.misceval.callsim(runMethod, 10); 
      alert(ret.v); 
     } catch (e) { 
      alert(e); 
     } 
    } 
</script> 
<form> 
<textarea id="code" rows="24" cols="80"> 
class Test: 
    def run(self, b): 
     self.a = 10 + b 
     return self.a 

print "Hello World" 
a = Test() 
</textarea><br> 
<button onclick="runit()" type="button">Run</button> 
</form> 

<pre id="output"></pre> 

Затем просто вставить этот код куда вы хотите

var programs = document.getElementById("code").value; 

for(var i = 0; i<programs.length; i++){ 
    // Whatever code you want to use to highlight the line goes here 
    runit(programs[i]); 
} 
+0

Спасибо. Мне очень нравится интерес к способу вызова скульптуры по данной линии. Могу ли я вызвать Sk.importMainWithBody() на каждой строке, поддерживающей контекст? – FabienRohrer

+0

Со второй ссылки вы можете увидеть функцию 'runit', правильно? Это выполнит программу в переменной 'prog'. Поэтому просто измените переменную 'prog' на переменную, которую вы хотите запустить (в данном случае' programs [i] '). Возможно, если вы хотите, вы можете изменить функцию, чтобы принять строку для запуска, а не получать строку из HTML, и вам должно быть хорошо. Имеет ли это смысл? – 2016rshah

+0

Я показал вам, что я имею в виду при редактировании – 2016rshah

Смежные вопросы