(def puts

(fn [str]
  (.
    (:: Kernel) puts str)))

(def cons

(fn [el list]
  (. list cons el)))

(def head

(fn [list]
  (. list head)))

(def tail

(fn [list]
  (. list tail)))

(def empty?

(fn [list]
  (. list empty?)))

(def take

(fn [num list]
  (. list take num)))

(def =

(fn [lhs rhs]
  (cond
    ((. lhs == rhs) true)
    (true false))))

(def !=

(fn [lhs rhs]
  (cond
    ((. lhs != rhs) true)
    (true false))))

(def >

(fn [lhs rhs]
  (cond
    ((. lhs > rhs) true)
    (true false))))

(def <

(fn [lhs rhs]
  (cond
    ((. lhs > rhs) true)
    (true false))))

(def +

(fn [lhs rhs]
  (. lhs + rhs)))

(def -

(fn [lhs rhs]
  (. lhs - rhs)))

(def /

(fn [lhs rhs]
  (. lhs / rhs)))

(def *

(fn [lhs rhs]
  (. lhs * rhs)))

(def read

(fn [code]
  (def reader (. (:: Ruspea::Interpreter::Reader) new))
  (def code_and_forms (. reader call code))
  (. code_and_forms "[]" 1)))

(def load

(fn [path]
  (puts (. "reading from " << path))
  (eval
    (read (. (:: File) read path))
    (%ctx %ctx))))