1 readline
= require
'./node_readline'
2 {id
, map
, Obj
} = require
'prelude-ls'
3 {read_str
} = require
'./reader'
4 {pr_str
} = require
'./printer'
9 value
: (a
, b
) -> {type
: \int
, value
: a.value + b.value
}
12 value
: (a
, b
) -> {type
: \int
, value
: a.value
- b.value
}
15 value
: (a
, b
) -> {type
: \int
, value
: a.value
* b.value
}
18 value
: (a
, b
) -> {type
: \int
, value
: parseInt
(a.value
/ b.value
)}
20 eval_ast
= (repl_env
, {type
, value
}: ast
) -->
23 result
= repl_env
[value
]
24 if not result? then throw new
Error 'symbol not found: ', value
27 result
= value |
> map eval_ast repl_env
28 if type
== \list and result.length
!= 0
30 if fn.type
!= \function
31 throw new
Error fn.value
, ' is not a function'
32 fn.value.apply repl_env
, result.slice
1
34 {type
: type
, value
: result
}
36 {type
: \map
, value
: value |
> Obj.map eval_ast repl_env
}
48 line
= readline.readline
'user> '
49 break if not line? or line
== ''