mirror of
https://github.com/janet-lang/janet
synced 2024-11-25 01:37:19 +00:00
Add protect macro.
A more functional version of try catch.
This commit is contained in:
parent
4c5734c2ee
commit
1a6eb52f11
@ -218,11 +218,21 @@
|
|||||||
f (gensym)
|
f (gensym)
|
||||||
r (gensym)]
|
r (gensym)]
|
||||||
~(let [,f (,fiber/new (fn [] ,body) :ie)
|
~(let [,f (,fiber/new (fn [] ,body) :ie)
|
||||||
,r (resume ,f)]
|
,r (,resume ,f)]
|
||||||
(if (= (,fiber/status ,f) :error)
|
(if (= (,fiber/status ,f) :error)
|
||||||
(do (def ,err ,r) ,(if fib ~(def ,fib ,f)) ,;(tuple/slice catch 1))
|
(do (def ,err ,r) ,(if fib ~(def ,fib ,f)) ,;(tuple/slice catch 1))
|
||||||
,r))))
|
,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
|
||||||
|
error, and the second is the return value or error."
|
||||||
|
[& body]
|
||||||
|
(let [f (gensym) r (gensym)]
|
||||||
|
~(let [,f (,fiber/new (fn [] ,;body) :ie)
|
||||||
|
,r (,resume ,f)]
|
||||||
|
[(,not= :error (,fiber/status ,f)) ,r])))
|
||||||
|
|
||||||
(defmacro and
|
(defmacro and
|
||||||
"Evaluates to the last argument if all preceding elements are true, otherwise
|
"Evaluates to the last argument if all preceding elements are true, otherwise
|
||||||
evaluates to false."
|
evaluates to false."
|
||||||
|
Loading…
Reference in New Issue
Block a user