diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-01-25 18:07:55 -0800 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-01-25 18:08:04 -0800 |
| commit | 0c0fb9838989ce6eff885b12716d3e89ba52f4e6 (patch) | |
| tree | eb192b57880bc5d9391e9a73b1039cb59a573c6a /lib/training_wheels.nom | |
| parent | fb22ba11ac2c363941d8bf34f8b8a9181bd7c7dc (diff) | |
Added some training wheels for functions.
Diffstat (limited to 'lib/training_wheels.nom')
| -rw-r--r-- | lib/training_wheels.nom | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/training_wheels.nom b/lib/training_wheels.nom index d277925..c4a9903 100644 --- a/lib/training_wheels.nom +++ b/lib/training_wheels.nom @@ -26,3 +26,19 @@ parse [error!, panic!, fail!, abort!] as: barf! parse [error %, panic %, fail %, abort %] as: barf % parse [assert %condition %message] as: assume %condition or barf %message parse [%cond ? %if_true %if_false] as: %if_true if %cond else %if_false +compile [function %args %body, lambda %args %body] to + %body_lua <- (%body as lua) + %statements <- ((%body_lua's "statements") or "return \(%body_lua's "expr");") + %locals <- (% for all ((%body_lua's "locals") or [])) + for all (%args's "value") + lua> "utils.remove_from_list(\%locals, \(% as lua expr));" + if: (size of %locals) > 0 + %statements <- "local \(%locals joined with ", ");\n\%statements" + + return {..} + expr: ".." + (function(\(((% as lua expr) for all (%args's "value")) joined with ", ")) + \%statements + end) +parse [function %name %args %body] as: %name <- (function %args %body) +compile [call %fn %args] to {expr:"\(%fn as lua expr)(unpack(\(%args as lua expr)))"} |
