Implement unwinding mechanism, repl example

This commit is contained in:
2026-05-08 23:19:17 +03:00
parent aa7e371747
commit 01012ae211
10 changed files with 249 additions and 32 deletions
+4
View File
@@ -0,0 +1,4 @@
;; vi:ft=lisp:sw=2:ts=2
(print (length *args*))
(print *args*)
+36
View File
@@ -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)
)
)