11#!/usr/local/bin/python
22#
33# f o r t h . p y
4- # Author: Chris Meyers @
4+ # Author: Chris Meyers @
55# http://openbookproject.net/py4fun/forth/forth.html
66#
7- import sys , re
7+ from __future__ import print_function
8+ import re
9+
10+ try :
11+ raw_input # Python 2
12+ except NameError :
13+ raw_input = input # Python 3
814
915ds = [] # The data stack
1016cStack = [] # The control struct stack
1521def main () :
1622 while 1 :
1723 pcode = compile () # compile/run from user
18- if pcode == None : print ; return
24+ if pcode == None : print () ; return
1925 execute (pcode )
2026
2127#============================== Lexical Parsing
22-
28+
2329def getWord (prompt = "... " ) :
2430 global words
25- while not words :
31+ while not words :
2632 try : lin = raw_input (prompt )+ "\n "
2733 except : return None
2834 if lin [0 :1 ] == "@" : lin = open (lin [1 :- 1 ]).read ()
@@ -56,8 +62,8 @@ def rSwap(cod,p) : a=ds.pop(); b=ds.pop(); ds.append(a); ds.append(b)
5662def rDup (cod ,p ) : ds .append (ds [- 1 ])
5763def rDrop (cod ,p ) : ds .pop ()
5864def rOver (cod ,p ) : ds .append (ds [- 2 ])
59- def rDump (cod ,p ) : print "ds = " , ds
60- def rDot (cod ,p ) : print ds .pop ()
65+ def rDump (cod ,p ) : print ( "ds = " , ds )
66+ def rDot (cod ,p ) : print ( ds .pop () )
6167def rJmp (cod ,p ) : return cod [p ]
6268def rJnz (cod ,p ) : return (cod [p ],p + 1 )[ds .pop ()]
6369def rJz (cod ,p ) : return (p + 1 ,cod [p ])[ds .pop ()== 0 ]
@@ -92,7 +98,7 @@ def rComa(cod,p) : # push tos into heap
9298
9399 'create' : rCreate , 'does>' : rDoes ,
94100}
95- #================================= Compile time
101+ #================================= Compile time
96102
97103def compile () :
98104 pcode = []; prompt = "Forth> "
@@ -114,12 +120,12 @@ def compile() :
114120 try : pcode .append (int (word ))
115121 except :
116122 try : pcode .append (float (word ))
117- except :
123+ except :
118124 pcode [- 1 ] = rRun # Change rPush to rRun
119125 pcode .append (word ) # Assume word will be defined
120126 if not cStack : return pcode
121127 prompt = "... "
122-
128+
123129def fatal (mesg ) : raise mesg
124130
125131def cColon (pcode ) :
@@ -168,5 +174,5 @@ def cThen (pcode) :
168174 ':' : cColon , ';' : cSemi , 'if' : cIf , 'else' : cElse , 'then' : cThen ,
169175 'begin' : cBegin , 'until' : cUntil ,
170176}
171-
177+
172178if __name__ == "__main__" : main ()
0 commit comments