Skip to content

Commit 3a7c474

Browse files
committed
define variables and use their value
1 parent ab9b2ea commit 3a7c474

1 file changed

Lines changed: 22 additions & 7 deletions

File tree

interpret.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
let 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

Comments
 (0)