11let program = [
2+ { def : { 'a' : 10 } } ,
3+ { def : { 'b' : 20 } } ,
24 {
3- print : { '+' : [ 3 , { '* ' : [ 5 , 6 ] } ] }
5+ print : { '+' : [ { 'val' : 'a' } , { 'val ' : 'b' } ] }
46 } ,
57]
68
@@ -14,28 +16,41 @@ let binaryOperators = {
1416 '*' : ( a , b ) => { return a * b } ,
1517}
1618
17- interpret = ( program ) => {
19+ interpret = ( program , state ) => {
1820 for ( let stmt of program ) {
19- exec ( stmt )
21+ exec ( stmt , state )
2022 }
2123} ;
2224
23- exec = ( stmt ) => {
25+ varDefinition = ( defObj , state ) => {
26+ let variable = Object . keys ( defObj ) [ 0 ] ;
27+ state [ variable ] = exec ( defObj [ variable ] , state )
28+ }
29+
30+ varValue = ( varKey , state ) => { return state [ varKey ] }
31+
32+ exec = ( stmt , state ) => {
2433
2534 if ( typeof stmt === 'number' || typeof stmt === 'string' ) {
2635 return stmt ;
2736 }
2837
2938 let key = Object . keys ( stmt ) [ 0 ]
3039 if ( typeof builtins [ key ] === 'function' ) {
31- builtins [ key ] ( exec ( stmt [ key ] ) )
40+ builtins [ key ] ( exec ( stmt [ key ] , state ) , state )
3241 } else if ( typeof binaryOperators [ key ] === 'function' ) {
3342 let firstArgument = stmt [ key ] [ 0 ] ;
3443 let secondArgument = stmt [ key ] [ 1 ] ;
35- return binaryOperators [ key ] ( exec ( firstArgument ) , exec ( secondArgument ) )
44+ return binaryOperators [ key ] ( exec ( firstArgument , state ) , exec ( secondArgument , state ) )
45+ } else if ( key === 'def' ) {
46+ let firstArgument = stmt [ key ]
47+ return varDefinition ( firstArgument , state )
48+ } else if ( key === 'val' ) {
49+ let firstArgument = stmt [ key ]
50+ return varValue ( firstArgument , state )
3651 } else {
3752 console . error ( 'unknown instruction: ' + key )
3853 }
3954}
4055
41- interpret ( program )
56+ interpret ( program , { } )
0 commit comments