数分間ハッキングすると、Python2.7でこのRead-Eval-Printループが得られます。
#!/usr/bin/env python
import code
import sys
LINE_NUMBER=0
def reset_linenum():
global LINE_NUMBER
LINE_NUMBER=-1
def resettable_REPL():
global LINE_NUMBER
BUFFERED_LINES=[]
ii=code.InteractiveInterpreter({"reset_linenum":reset_linenum})
while True:
try:
BUFFERED_LINES.append(raw_input("!"+sys.ps1)+'\n')
while (BUFFERED_LINES[-1][:1] in " \t" or
ii.runsource("\n"*LINE_NUMBER+"".join(BUFFERED_LINES), "console")):
BUFFERED_LINES.append(raw_input("!"+sys.ps2)+'\n')
LINE_NUMBER+=len(BUFFERED_LINES)
BUFFERED_LINES=[]
except EOFError:
break
if __name__=='__main__':
resettable_REPL()
少しハックですが、セッションが続く間、行番号を追跡し、の呼び出しによって現在のカウントをリセットできるようにしreset_linenum()
ます。セッションの例:
!!!> print "hello" # line 1
hello
!!!> def badfunc(): # line 2
!... raise Exception("doh") # line 3
!!!> badfunc() # line 4
Traceback (most recent call last):
File "console", line 4, in <module>
File "console", line 3, in badfunc
Exception: doh
!!!> ? # line 5
File "console", line 5
?
^
SyntaxError: invalid syntax
!!!> reset_linenum() # RESET
!!!> raise Exception("!") # line 1
Traceback (most recent call last):
File "console", line 1, in <module>
Exception: !
!!!>
編集:インデントされたブロックを非常に早く実行しないようにREPLを修正しました。