diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-06-14 23:25:05 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-06-14 23:25:34 -0700 |
| commit | b12744d831c4158671fc22401590eaac00f7c141 (patch) | |
| tree | 203b80de68d89c7333172337f8def46ba11294d3 /core/errors.nom | |
| parent | 49f1eb3d08caf7605046373b7b3a001f28aa8aab (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.nom | 46 |
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 |
