From d7624ebb9aaf5c83a3f9b4a48c76fd3e19ba785f Mon Sep 17 00:00:00 2001 From: David Vazquez Date: Wed, 9 Jan 2013 01:15:16 +0000 Subject: [PATCH] Implement CATCH and THROW --- ecmalisp.lisp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ecmalisp.lisp b/ecmalisp.lisp index 2ee17ec..ebfe885 100644 --- a/ecmalisp.lisp +++ b/ecmalisp.lisp @@ -993,7 +993,8 @@ (concat "(function(){" *newline* (indent "try {" *newline* (indent "return " (ls-compile `(progn ,@body) - (extend-lexenv b env 'block))) ";" *newline* + (extend-lexenv b env 'block)) + ";" *newline*) "}" *newline* "catch (cf){" *newline* " if (cf.type == 'block' && cf.id == " tr ")" *newline* @@ -1014,6 +1015,31 @@ "})})()") (error (concat "Unknown block `" (symbol-name name) "'."))))) + +(define-compilation catch (id &rest body) + (concat "(function(){" *newline* + (indent "var id = " (ls-compile id env) ";" *newline* + "try {" *newline* + (indent "return " (ls-compile `(progn ,@body)) + ";" *newline*) + "}" *newline* + "catch (cf){" *newline* + " if (cf.type == 'catch' && cf.id == id)" *newline* + " return cf.value;" *newline* + " else" *newline* + " throw cf;" *newline* + "}" *newline*) + "})()")) + +(define-compilation throw (id &optional value) + (concat "(function(){ throw ({" + "type: 'catch', " + "id: " (ls-compile id env) ", " + "value: " (ls-compile value env) ", " + "message: 'Throw uncatched.'" + "})})()")) + + ;;; A little backquote implementation without optimizations of any ;;; kind for ecmalisp. (defun backquote-expand-1 (form) -- 1.7.10.4