1 import types
.{MalList
, _list_Q
, MalVector
, MalHashMap
, MalFunction
}
5 def READ(str
: String
): Any
= {
10 def eval_ast(ast
: Any
, env
: Map
[Symbol
,Any
]): Any
= {
12 case s
: Symbol
=> env(s
)
13 case v
: MalVector
=> v
.map(EVAL(_
, env
))
14 case l
: MalList
=> l
.map(EVAL(_
, env
))
15 case m
: MalHashMap
=> {
16 m
.map
{case (k
,v
) => (k
, EVAL(v
, env
))}
22 def EVAL(ast
: Any
, env
: Map
[Symbol
,Any
]): Any
= {
23 //println("EVAL: " + printer._pr_str(ast,true))
25 return eval_ast(ast
, env
)
28 if (ast
.asInstanceOf
[MalList
].value
.length
== 0)
30 eval_ast(ast
, env
).asInstanceOf
[MalList
].value
match {
32 var fn
: List
[Any
] => Any
= null
34 fn
= f
.asInstanceOf
[List
[Any
] => Any
]
37 throw new Exception("attempt to call non-function")
41 case _
=> throw new Exception("invalid apply")
46 def PRINT(exp
: Any
): String
= {
47 printer
._pr_str(exp
, true)
51 def main(args
: Array
[String
]) = {
52 val repl_env
: Map
[Symbol
,Any
] = Map(
53 '+ -> ((a: List[Any]) => a(0).asInstanceOf[Long] + a(1).asInstanceOf[Long]),
54 '- -> ((a
: List
[Any
]) => a(0).asInstanceOf
[Long
] - a(1).asInstanceOf
[Long
]),
55 '* -> ((a: List[Any]) => a(0).asInstanceOf[Long] * a(1).asInstanceOf[Long]),
56 '/ -> ((a
: List
[Any
]) => a(0).asInstanceOf
[Long
] / a(1).asInstanceOf
[Long
]))
57 val REP
= (str
: String
) => {
58 PRINT(EVAL(READ(str
), repl_env
))
61 var line
:String
= null
62 while ({line
= readLine("user> "); line
!= null}) {
66 case e
: Exception
=> {
67 println("Error: " + e
.getMessage
)
68 println(" " + e
.getStackTrace
.mkString("\n "))