Skip to content

Commit 0911779

Browse files
author
Filippo Costa
committed
Get a working version of INTERPRETER
1 parent 784c6ca commit 0911779

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

main.py

+23-10
Original file line numberDiff line numberDiff line change
@@ -197,11 +197,14 @@
197197
lambda check_syntax:
198198
lambda parser:
199199
lambda char:
200-
CHAR_IS_EOF
201-
(f (check_syntax (char)) (parser (char)))
202-
(check_syntax (char)
203-
(parser (char))
204-
((lambda _: print('<invalid program>') (NONE))))
200+
CHAR_IS_EOF (char)
201+
(lambda _: check_syntax (char)
202+
# TODO: reduce to normal form.
203+
(lambda _: EXPRESSION_TO_STRING (parser))
204+
(lambda _: '<invalid program>')
205+
(NONE))
206+
(lambda _: f (check_syntax (char)) (parser (char)))
207+
(NONE)
205208
) (CHECK_SYNTAX) (PARSER)
206209

207210
# Takes in a stream of bits and outputs a stream of lambda terms.
@@ -295,6 +298,20 @@ def test_parse_application(self):
295298
self.assertEqual('011010', EXPRESSION_TO_STRING (var))
296299
var = PARSER (CHAR_0) (CHAR_1) (CHAR_0) (CHAR_0) (CHAR_1) (CHAR_1) (CHAR_0) (CHAR_1) (CHAR_0)
297300
self.assertEqual('010011010', EXPRESSION_TO_STRING (var))
301+
var = PARSER (CHAR_0) (CHAR_1) (CHAR_0) (CHAR_1) (CHAR_1) (CHAR_1) (CHAR_0) (CHAR_1) (CHAR_0) (CHAR_1) (CHAR_0)
302+
self.assertEqual('01011101010', EXPRESSION_TO_STRING (var))
303+
304+
def run_string(string):
305+
state = INTERPRETER
306+
for c in source:
307+
if c == '0':
308+
state = state(CHAR_0)
309+
elif c == '1':
310+
state = state(CHAR_1)
311+
else:
312+
state = lambda _: '<invalid input>'
313+
break
314+
return state(CHAR_EOF)
298315

299316
if __name__ == '__main__':
300317
print('A binary lambda calculus interpreter by Filippo Costa')
@@ -313,10 +330,6 @@ def test_parse_application(self):
313330
eval(source.split(' ', 1)[1])
314331
continue
315332
else:
316-
state = INTERPRETER
317-
for c in source:
318-
state = state(CHAR_1 if c == '1' else CHAR_0)
319-
print('Normal form: ')
320-
state = state(CHAR_EOF)
333+
print(run_string(source))
321334
# A MIT/GNU Scheme tradition :)
322335
print('Moriturus te salutat.')

0 commit comments

Comments
 (0)