; repl.neb ; by mryouse ; ; a REPL for neb, written in neb (def _history_ (list)) (func history () _history_) (func !! () (def cmd (first (list-reverse (history)))) (print (->string cmd)) (eval (parse-neb cmd))) (func save-repl (filename :string) (def fil (open-write filename)) (write (concat (join (history) "\n") "\n") fil) (close fil)) (func prompt (nxt) (concat "#" (->string nxt) "> ")) (func repl () (print "### neb :)(: IN NEB!") (print "version: < 0") (def next-cmd-num 1) (func get-non-empty-input () (def tmp "") (while (eq? "" tmp) (redef tmp (strip (read-line (prompt next-cmd-num))))) tmp) (func print-result (res) ;(def calc res) (print (concat "=> " (if (eq? :string (typeof res)) (raw res) (->string res))))) ; this is the actual loop part (while #true (def this-cmd (get-non-empty-input)) (def panicked #false) ; we may not need this two-step if there's a :panic type (def evaluated (try ;(eval (first (parse-neb this-cmd))) (quote (first (parse-neb this-cmd))) ;(quote (map eval (parse-neb this-cmd))) ;(parse-neb this-cmd) (block (redef panicked #true) _panic_))) ;(print evaluated) (if panicked (print (concat "panic! " evaluated)) (block (print-result 'evaluated) (redef next-cmd-num (+ 1 next-cmd-num)) (redef _history_ (append _history_ this-cmd)))))) (repl)