aboutsummaryrefslogtreecommitdiff
path: root/core/errors.nom
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2018-06-14 23:25:05 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2018-06-14 23:25:34 -0700
commitb12744d831c4158671fc22401590eaac00f7c141 (patch)
tree203b80de68d89c7333172337f8def46ba11294d3 /core/errors.nom
parent49f1eb3d08caf7605046373b7b3a001f28aa8aab (diff)
Some cleanup and fixes. Simplifying a lot of code, and extending the
flexibility of scoping. Redesigned Object system too.
Diffstat (limited to 'core/errors.nom')
-rw-r--r--core/errors.nom46
1 files changed, 46 insertions, 0 deletions
diff --git a/core/errors.nom b/core/errors.nom
index dc585be..8c6261a 100644
--- a/core/errors.nom
+++ b/core/errors.nom
@@ -20,3 +20,49 @@ compile [assume %condition or barf %message] to
if not \(%condition as lua expr) then
error(\(%message as lua expr), 0);
end
+
+# Try/except
+immediately
+ compile [..]
+ try %action and if it succeeds %success or if it barfs %msg %fallback
+ try %action and if it barfs %msg %fallback or if it succeeds %success
+ ..to
+ Lua ".."
+ do
+ local fell_through = false
+ local err, erred = nil, false
+ local ok, ret = xpcall(function()
+ \(%action as lua statements)
+ fell_through = true
+ end, function(\(%msg as lua expr))
+ local ok, ret = pcall(function()
+ \(%fallback as lua statements)
+ end)
+ if not ok then err, erred = ret, true end
+ end)
+ if ok then
+ \(%success as lua statements)
+ if not fell_through then
+ return ret
+ end
+ elseif erred then
+ error(err, 0)
+ end
+ end
+immediately
+ parse [..]
+ try %action and if it succeeds %success or if it barfs %fallback
+ try %action and if it barfs %fallback or if it succeeds %success
+ ..as: try %action and if it succeeds %success or if it barfs (=lua "") %fallback
+immediately
+ parse [try %action] as
+ try %action and if it succeeds: do nothing
+ ..or if it barfs: do nothing
+ parse [try %action and if it barfs %fallback] as
+ try %action and if it succeeds: do nothing
+ ..or if it barfs %fallback
+ parse [try %action and if it barfs %msg %fallback] as
+ try %action and if it succeeds: do nothing
+ ..or if it barfs %msg %fallback
+ parse [try %action and if it succeeds %success] as
+ try %action and if it succeeds %success or if it barfs: do nothing