Implement unwinding mechanism, repl example
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
;; vi:ft=lisp:sw=2:ts=2
|
||||
|
||||
(print (length *args*))
|
||||
(print *args*)
|
||||
@@ -0,0 +1,36 @@
|
||||
;; vi:ft=lisp:sw=2:ts=2
|
||||
|
||||
(defun cadr (x) (car (cdr x)))
|
||||
|
||||
(defun map-ok-err (f-ok f-err result)
|
||||
(if (= (car result) 'ok)
|
||||
`(ok ,(f-ok (cadr result)))
|
||||
`(err ,(f-err (cadr result)))
|
||||
)
|
||||
)
|
||||
(defun map-ok (f-ok result) (map-ok-err f-ok identity result))
|
||||
(defun map-err (f-err result) (map-ok-err identity f-err result))
|
||||
|
||||
(defun repl-print (value)
|
||||
(print "==>" value)
|
||||
)
|
||||
(defun repl-eval-print (expression)
|
||||
(map-ok-err repl-print repl-eval-error (unquote (eval expression)))
|
||||
)
|
||||
|
||||
(defun repl-eval-error (error)
|
||||
(print "Evaluation error:")
|
||||
(print error)
|
||||
)
|
||||
(defun repl-read-error (error)
|
||||
(print "Parse error:")
|
||||
(print error)
|
||||
)
|
||||
|
||||
(loop
|
||||
(let (expression (read))
|
||||
(if expression NIL (return))
|
||||
(setq expression (unquote expression))
|
||||
(map-ok-err repl-eval-print repl-read-error expression)
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user