1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
#!/usr/bin/env nomsu -V6.13.12.8
#
This file contains basic error reporting code
use "core/metaprogramming.nom"
use "core/operators.nom"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(fail $msg) compiles to
"error(\(($msg as lua expr) if $msg else "nil"), 0);"
(assume $condition) compiles to:
lua> ("
local \$assumption = 'Assumption failed: '..tostring((\$condition):get_source_code())
")
return
Lua ("
if not \($condition as lua expr) then
error(\(quote "\$assumption"), 0)
end
")
(assume $a == $b) compiles to:
lua> "local \$assumption = 'Assumption failed: '..tostring(\(\($a == $b) as nomsu))"
define mangler
return
Lua ("
do
local \(mangle "a"), \(mangle "b") = \($a as lua expr), \($b as lua expr)
if \(mangle "a") ~= \(mangle "b") then
error(\(quote "\$assumption").."\\n"..tostring(\(mangle "a")).." != "..tostring(\
..\(mangle "b")), 0)
end
end
")
test:
try: fail
$worked = (no)
try: fail
..if it fails:
$worked = (yes)
..if it succeeds:
fail "'try' incorrectly ran success case."
unless $worked:
fail "'try' failed to recover from failure"
# Try/except
[
try $action if it succeeds $success if it fails $fallback
try $action if it fails $fallback if it succeeds $success
] all compile to:
$success_lua = ($success as lua)
if ((#"\$success_lua") > 0): $success_lua, add "\n"
$success_lua, prepend "-- Success:\n"
$success_lua, add "if not _fell_through then return table.unpack(_result, 2) end"
$fallback_lua = ($fallback as lua)
if ((#"\$fallback_lua") > 0):
$fallback_lua, prepend "\nlocal function failure() return _result[2] end\n"
$fallback_lua, prepend "-- Failure:"
return
Lua ("
do
local _fell_through = false
local _result = {pcall(function()
\($action as lua)
_fell_through = true
end)}
if _result[1] then
\$success_lua
else
\$fallback_lua
end
end
")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(try $action) parses as
try $action if it succeeds (do nothing) if it fails (do nothing)
(try $action if it fails $msg $fallback) parses as
try $action if it succeeds (do nothing) if it fails $msg $fallback
(try $action if it succeeds $success) parses as
try $action if it succeeds $success if it fails (do nothing)
(try $action if it fails $fallback if it succeeds $success) parses as
try $action if it succeeds $success if it fails $fallback
test:
$success = (no)
try:
do: fail
..then always:
$success = (yes)
..if it succeeds:
fail "'try ... then always ...' didn't propagate failure"
unless $success:
fail "'try ... then always ...' didn't execute the 'always' code"
(do $action then always $final_action) compiles to ("
do -- do/then always
local _fell_through = false
local _results = {pcall(function()
\($action as lua)
_fell_through = true
end)}
\($final_action as lua)
if not _results[1] then error(_results[2], 0) end
if not _fell_through then return table.unpack(_results, 2) end
end
")
~~~
(barf $) parses as (fail $)
(assume $1 or barf $2) parses as (unless $1: fail $2)
|