aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorCalvin Rose <calsrose@gmail.com>2025-06-29 10:01:32 -0500
committerGitHub <noreply@github.com>2025-06-29 10:01:32 -0500
commit58b1491592223b5385ec93ff91da37d95109147a (patch)
treecffdc82b2b996241c3805ae5b7f70a56a629d8f4 /src
parentRevert order change from f4ecb5a (diff)
parentPatch try to accept (try body ([] catch-body)) (diff)
Merge pull request #1605 from iacore/patch-2
Patch try to accept (try body ([] catch-body))
Diffstat (limited to 'src')
-rw-r--r--src/boot/boot.janet33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/boot/boot.janet b/src/boot/boot.janet
index 2743de48..f46df634 100644
--- a/src/boot/boot.janet
+++ b/src/boot/boot.janet
@@ -290,22 +290,6 @@
(array/concat accum body)
(tuple/slice accum 0))
-(defmacro try
- ``Try something and catch errors. `body` is any expression,
- and `catch` should be a form, the first element of which is a tuple. This tuple
- should contain a binding for errors and an optional binding for
- the fiber wrapping the body. Returns the result of `body` if no error,
- or the result of `catch` if an error.``
- [body catch]
- (let [[[err fib]] catch
- f (gensym)
- r (gensym)]
- ~(let [,f (,fiber/new (fn :try [] ,body) :ie)
- ,r (,resume ,f)]
- (if (,= (,fiber/status ,f) :error)
- (do (def ,err ,r) ,(if fib ~(def ,fib ,f)) ,;(tuple/slice catch 1))
- ,r))))
-
(defmacro protect
`Evaluate expressions, while capturing any errors. Evaluates to a tuple
of two elements. The first element is true if successful, false if an
@@ -352,6 +336,23 @@
(tuple 'if $fi $fi ret))))))
ret)
+(defmacro try
+ ``Try something and catch errors. `body` is any expression,
+ and `catch` should be a form, the first element of which is a tuple. This tuple
+ should contain a binding for errors and an optional binding for
+ the fiber wrapping the body. Returns the result of `body` if no error,
+ or the result of `catch` if an error.``
+ [body catch]
+ (assert (and (not (empty? catch)) (indexed? (catch 0))) "the first element of `catch` must be a tuple or array")
+ (let [[err fib] (catch 0)
+ r (or err (gensym))
+ f (or fib (gensym))]
+ ~(let [,f (,fiber/new (fn :try [] ,body) :ie)
+ ,r (,resume ,f)]
+ (if (,= (,fiber/status ,f) :error)
+ (do ,;(tuple/slice catch 1))
+ ,r))))
+
(defmacro with-syms
"Evaluates `body` with each symbol in `syms` bound to a generated, unique symbol."
[syms & body]