X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=ecmalisp.lisp;h=208532c43b410f3dcf2c9b3568a058d1071ef684;hb=8a40428e966c0d53d3397284531e672cd0224567;hp=2ee17ecaed4432a72798abbe3fbe8fa558087646;hpb=54e067f96e19cd1fe54534711ddb6445cf2341e0;p=jscl.git diff --git a/ecmalisp.lisp b/ecmalisp.lisp index 2ee17ec..208532c 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,42 @@ "})})()") (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.'" + "})})()")) + +(define-compilation unwind-protect (form &rest clean-up) + (concat "(function(){" *newline* + (indent "var ret = " (ls-compile nil) ";" *newline* + "try {" *newline* + (indent "ret = " (ls-compile form env) ";" *newline*) + "} finally {" *newline* + (indent (ls-compile-block clean-up env)) + "}" *newline* + "return ret;" *newline*) + "})()")) + + ;;; A little backquote implementation without optimizations of any ;;; kind for ecmalisp. (defun backquote-expand-1 (form)