197
197
lambda check_syntax :
198
198
lambda parser :
199
199
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 )
205
208
) (CHECK_SYNTAX ) (PARSER )
206
209
207
210
# Takes in a stream of bits and outputs a stream of lambda terms.
@@ -295,6 +298,20 @@ def test_parse_application(self):
295
298
self .assertEqual ('011010' , EXPRESSION_TO_STRING (var ))
296
299
var = PARSER (CHAR_0 ) (CHAR_1 ) (CHAR_0 ) (CHAR_0 ) (CHAR_1 ) (CHAR_1 ) (CHAR_0 ) (CHAR_1 ) (CHAR_0 )
297
300
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 )
298
315
299
316
if __name__ == '__main__' :
300
317
print ('A binary lambda calculus interpreter by Filippo Costa' )
@@ -313,10 +330,6 @@ def test_parse_application(self):
313
330
eval (source .split (' ' , 1 )[1 ])
314
331
continue
315
332
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 ))
321
334
# A MIT/GNU Scheme tradition :)
322
335
print ('Moriturus te salutat.' )
0 commit comments