aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/base64/init.nom68
-rw-r--r--lib/commandline/init.nom19
-rw-r--r--lib/compatibility/2.3.nom2
-rw-r--r--lib/compatibility/2.4.nom2
-rw-r--r--lib/compatibility/2.5.5.5.nom2
-rw-r--r--lib/compatibility/2.5.nom2
-rw-r--r--lib/compatibility/2.nom6
-rw-r--r--lib/compatibility/3.5.5.6.nom2
-rw-r--r--lib/compatibility/3.6.nom5
-rw-r--r--lib/compatibility/3.7.nom2
-rw-r--r--lib/compatibility/3.8.nom6
-rw-r--r--lib/compatibility/3.nom2
-rw-r--r--lib/compatibility/4.10.12.7.nom4
-rw-r--r--lib/compatibility/4.11.nom9
-rw-r--r--lib/compatibility/4.12.nom2
-rw-r--r--lib/compatibility/4.8.10.nom2
-rw-r--r--lib/compatibility/4.9.nom2
-rw-r--r--lib/compatibility/5.13.nom14
-rw-r--r--lib/compatibility/6.14.nom9
-rw-r--r--lib/compatibility/6.15.nom20
-rw-r--r--lib/compatibility/compatibility.nom231
-rw-r--r--lib/compatibility/init.nom2
-rw-r--r--lib/consolecolor/init.nom2
-rw-r--r--lib/core/collections.nom62
-rw-r--r--lib/core/control_flow.nom3
-rw-r--r--lib/core/coroutines.nom2
-rw-r--r--lib/core/errors.nom4
-rw-r--r--lib/core/id.nom63
-rw-r--r--lib/core/init.nom2
-rw-r--r--lib/core/io.nom45
-rw-r--r--lib/core/math.nom392
-rw-r--r--lib/core/metaprogramming.nom217
-rw-r--r--lib/core/operators.nom33
-rw-r--r--lib/core/text.nom19
-rw-r--r--lib/file_hash/init.nom40
-rw-r--r--lib/filesystem/init.nom64
-rw-r--r--lib/object.nom2
-rw-r--r--lib/progressbar/init.nom24
-rw-r--r--lib/shell/init.nom20
-rw-r--r--lib/things.nom129
-rwxr-xr-xlib/tools/find.nom10
-rwxr-xr-xlib/tools/format.nom4
-rwxr-xr-xlib/tools/parse.nom4
-rwxr-xr-xlib/tools/repl.nom19
-rwxr-xr-xlib/tools/replace.nom16
-rwxr-xr-xlib/tools/test.nom14
-rwxr-xr-xlib/tools/upgrade.nom2
47 files changed, 799 insertions, 806 deletions
diff --git a/lib/base64/init.nom b/lib/base64/init.nom
index 54f785f..a76a49f 100644
--- a/lib/base64/init.nom
+++ b/lib/base64/init.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines actions for encoding/decoding base 64, as specified in:
https://tools.ietf.org/html/rfc4648
@@ -15,36 +15,36 @@ test:
assume (base64 $plain) == $encoded
assume (base64 decode $encoded) == $plain
-externally [base64 $str, base64 encode $str, $str base64] all mean:
- $chars = []
- for $i in 1 to (size of $str) via 3:
- $bytes = [=lua "\$str:byte(\$i, \($i + 2))"]
- $chars, add $b64_chars.((($bytes.1 & 252) >> 2) + 1)
- if (size of $bytes) is:
- 3:
- $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
- $chars, add $b64_chars.((($bytes.2 & 15) << 2) + (($bytes.3 & 192) >> 6) + 1)
- $chars, add $b64_chars.(($bytes.3 & 63) + 1)
-
- 2:
- $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
- $chars, add $b64_chars.((($bytes.2 & 15) << 2) + 1)
- $chars, add "="
-
- 1:
- $chars, add $b64_chars.((($bytes.1 & 3) << 4) + 1)
- $chars, add "="
- $chars, add "="
- return ($chars, joined)
-
-externally (chr $) means (=lua "string.char(\$)")
-externally [decode base64 $str, $str base64 decoded, base64 decode $str] all mean:
- $chars = []
- for $i in 1 to (size of $str) via 4:
- $indices = [: for $j in $i to ($i + 3): add $reverse_b64.($str, character $j)]
- $chars, add (chr (($indices.1 << 2) + (($indices.2 & 48) >> 4)))
- if (($str, character ($i + 2)) == "="): stop
- $chars, add (chr ((($indices.2 & 15) << 4) + (($indices.3 & 60) >> 2)))
- if (($str, character ($i + 3)) == "="): stop
- $chars, add (chr ((($indices.3 & 3) << 6) + $indices.4))
- return ($chars, joined)
+external:
+ [base64 $str, base64 encode $str, $str base64] all mean:
+ $chars = []
+ for $i in 1 to (size of $str) via 3:
+ $bytes = [=lua "\$str:byte(\$i, \($i + 2))"]
+ $chars, add $b64_chars.((($bytes.1 & 252) >> 2) + 1)
+ if (size of $bytes) is:
+ 3:
+ $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
+ $chars, add $b64_chars.((($bytes.2 & 15) << 2) + (($bytes.3 & 192) >> 6) + 1)
+ $chars, add $b64_chars.(($bytes.3 & 63) + 1)
+
+ 2:
+ $chars, add $b64_chars.((($bytes.1 & 3) << 4) + (($bytes.2 & 240) >> 4) + 1)
+ $chars, add $b64_chars.((($bytes.2 & 15) << 2) + 1)
+ $chars, add "="
+
+ 1:
+ $chars, add $b64_chars.((($bytes.1 & 3) << 4) + 1)
+ $chars, add "="
+ $chars, add "="
+ return ($chars, joined)
+ (chr $) means (=lua "string.char(\$)")
+ [decode base64 $str, $str base64 decoded, base64 decode $str] all mean:
+ $chars = []
+ for $i in 1 to (size of $str) via 4:
+ $indices = [: for $j in $i to ($i + 3): add $reverse_b64.($str, character $j)]
+ $chars, add (chr (($indices.1 << 2) + (($indices.2 & 48) >> 4)))
+ if (($str, character ($i + 2)) == "="): stop
+ $chars, add (chr ((($indices.2 & 15) << 4) + (($indices.3 & 60) >> 2)))
+ if (($str, character ($i + 3)) == "="): stop
+ $chars, add (chr ((($indices.3 & 3) << 6) + $indices.4))
+ return ($chars, joined)
diff --git a/lib/commandline/init.nom b/lib/commandline/init.nom
index f28e02b..68836fb 100644
--- a/lib/commandline/init.nom
+++ b/lib/commandline/init.nom
@@ -1,11 +1,12 @@
#
A library defining some command line program functionality
-
-(command line program with $args $body) parses as:
- externally (run with $args) means $body
- if (this file was run directly):
- run with (the command line arguments)
-
-externally (usage $) means:
- say "Usage: \$"
- exit 1
+
+external:
+ (command line program with $args $body) parses as:
+ external ((run with $args) means $body)
+ if (this file was run directly):
+ run with (the command line arguments)
+
+ (usage $) means:
+ say "Usage: \$"
+ exit 1
diff --git a/lib/compatibility/2.3.nom b/lib/compatibility/2.3.nom
index 67870ac..808c859 100644
--- a/lib/compatibility/2.3.nom
+++ b/lib/compatibility/2.3.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <2.3 to Nomsu 2.3
diff --git a/lib/compatibility/2.4.nom b/lib/compatibility/2.4.nom
index e0d2e02..a904dd0 100644
--- a/lib/compatibility/2.4.nom
+++ b/lib/compatibility/2.4.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <2.4 to Nomsu 2.4
diff --git a/lib/compatibility/2.5.5.5.nom b/lib/compatibility/2.5.5.5.nom
index c026a42..93d3956 100644
--- a/lib/compatibility/2.5.5.5.nom
+++ b/lib/compatibility/2.5.5.5.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <2.5.5.5 to Nomsu 2.5.5.5
diff --git a/lib/compatibility/2.5.nom b/lib/compatibility/2.5.nom
index 03b3f61..b5b988a 100644
--- a/lib/compatibility/2.5.nom
+++ b/lib/compatibility/2.5.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <2.5 to Nomsu 2.5
diff --git a/lib/compatibility/2.nom b/lib/compatibility/2.nom
index caf7a86..ca3cb6a 100644
--- a/lib/compatibility/2.nom
+++ b/lib/compatibility/2.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu 1 to Nomsu 2
@@ -24,8 +24,8 @@ upgrade $tree to "2" as:
$need_blocks = [
"if", "unless", "for 1 in", "for 1 = 2 in", "repeat while 1", "repeat 1 times"
"repeat", "repeat until 1", "for 1 in 2 to 3 by", "for 1 in 2 to 3 via"
- "for 1 in 2 to", "for 1 2 in", "do", "for 1 in recursive", "test", "with", "result of"
- "when"
+ "for 1 in 2 to", "for 1 2 in", "do", "for 1 in recursive", "test", "with"
+ "result of", "when"
]
for $n in $need_blocks:
diff --git a/lib/compatibility/3.5.5.6.nom b/lib/compatibility/3.5.5.6.nom
index 6528526..d9bba4f 100644
--- a/lib/compatibility/3.5.5.6.nom
+++ b/lib/compatibility/3.5.5.6.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <3.5.5.6 to Nomsu 3.5.5.6
diff --git a/lib/compatibility/3.6.nom b/lib/compatibility/3.6.nom
index 5db2aae..7428158 100644
--- a/lib/compatibility/3.6.nom
+++ b/lib/compatibility/3.6.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <3.6 to 3.6
@@ -7,7 +7,8 @@ use "compatibility/compatibility"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
upgrade action [
- append $item to $list, add $item to $list, to $list add $item, to $list append $item
+ append $item to $list, add $item to $list, to $list add $item
+ to $list append $item
] to "3.6" as ($list, add $item)
upgrade action [add $item to $list at index $i] to "3.6" as
diff --git a/lib/compatibility/3.7.nom b/lib/compatibility/3.7.nom
index ed877a6..894c656 100644
--- a/lib/compatibility/3.7.nom
+++ b/lib/compatibility/3.7.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <3.7 to 3.7
diff --git a/lib/compatibility/3.8.nom b/lib/compatibility/3.8.nom
index 398e3bb..0c3b3ac 100644
--- a/lib/compatibility/3.8.nom
+++ b/lib/compatibility/3.8.nom
@@ -1,11 +1,11 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <3.8 to 3.8 (Text method changes)
-
+
use "compatibility/compatibility"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
+
upgrade action [$texts joined with $glue] to "3.8" as ($texts, joined with $glue)
upgrade action [$texts joined, joined $texts] to "3.8" as ($texts, joined)
upgrade action [byte $i of $text] to "3.8" as ($text, byte $i)
diff --git a/lib/compatibility/3.nom b/lib/compatibility/3.nom
index af5c2fd..966dbf9 100644
--- a/lib/compatibility/3.nom
+++ b/lib/compatibility/3.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <=2 to Nomsu 3
diff --git a/lib/compatibility/4.10.12.7.nom b/lib/compatibility/4.10.12.7.nom
index c241898..eeff2f2 100644
--- a/lib/compatibility/4.10.12.7.nom
+++ b/lib/compatibility/4.10.12.7.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <4.10.12.7 to 4.10.12.7
use "compatibility/compatibility"
@@ -8,9 +8,7 @@ use "compatibility/compatibility"
upgrade action ($ as lua statements) to "4.10.12.7" as ($ as lua)
upgrade action ($ as lua return) to "4.10.12.7" as
=lua "\$.type == 'Block' and \($ as lua) or 'return '..\($ as lua expr)"
-
upgrade action (Lua value $) to "4.10.12.7" as (Lua $)
-
upgrade action ($e for $ in $items) to "4.10.12.7" as [: for $ in $items: add $e]
upgrade action ($e for $k = $v in $items) to "4.10.12.7" as
[: for $k = $v in $items: add $e]
diff --git a/lib/compatibility/4.11.nom b/lib/compatibility/4.11.nom
index 24dbbdc..88ea7b3 100644
--- a/lib/compatibility/4.11.nom
+++ b/lib/compatibility/4.11.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <4.11 to Nomsu 4.11
(overhaul of function literals, deleting (if all of ...), etc. shorthand)
@@ -25,9 +25,7 @@ upgrade action "set" to "4.11" via
for $entry in $tree.2 at $i:
$lhs.$i = $entry.1
$rhs.$i = $entry.2
-
- return
- SyntaxTree {.type = "Action", .source = $tree.source} $lhs "=" $rhs
+ return (SyntaxTree {.type = "Action", .source = $tree.source} $lhs "=" $rhs)
upgrade action "1 with 2 ~>" to "4.11" via
for $tree:
@@ -93,5 +91,6 @@ upgrade action [
] to "4.11" as (if (not (any of $items)) $body else $else)
upgrade action [
- unless none of $items $body else $else, unless none of $items then $body else $else
+ unless none of $items $body else $else
+ unless none of $items then $body else $else
] to "4.11" as (if (any of $items) $body else $else)
diff --git a/lib/compatibility/4.12.nom b/lib/compatibility/4.12.nom
index a76e7df..bb1af0b 100644
--- a/lib/compatibility/4.12.nom
+++ b/lib/compatibility/4.12.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <4.11 to Nomsu 4.11
(overhaul of function literals, deleting (if all of ...), etc. shorthand)
diff --git a/lib/compatibility/4.8.10.nom b/lib/compatibility/4.8.10.nom
index 250dc4a..15a502b 100644
--- a/lib/compatibility/4.8.10.nom
+++ b/lib/compatibility/4.8.10.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <4.8.10 to 4.8.10 (renaming "action" -> "means")
use "compatibility/compatibility"
diff --git a/lib/compatibility/4.9.nom b/lib/compatibility/4.9.nom
index 14b5dd6..d8260a4 100644
--- a/lib/compatibility/4.9.nom
+++ b/lib/compatibility/4.9.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <4.9 to 4.9
use "compatibility/compatibility"
diff --git a/lib/compatibility/5.13.nom b/lib/compatibility/5.13.nom
index 1e0db6d..92c8ebe 100644
--- a/lib/compatibility/5.13.nom
+++ b/lib/compatibility/5.13.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V5.13
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <5.13 to 5.13
use "compatibility/compatibility"
@@ -6,19 +6,15 @@ use "compatibility/compatibility"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
upgrade action (size of $) to "5.13" as (#$)
-
-upgrade action "with" to "5.13" via (..)
+upgrade action "with" to "5.13" via
for $tree:
$assignments = $tree.2
$body = $tree.3
- if ($assignments.type != "Dict"):
- return $tree
+ if ($assignments.type != "Dict"): return $tree
$new_assignments = \[]
for $a in $assignments at $i:
when:
- (($a.type == "DictEntry") and ((#$a) == 1)):
- $a = $a.1
- (all of [$a.type == "DictEntry", (#$a) == 2]):
- $a = \($a.1 = $a.2)
+ (($a.type == "DictEntry") and ((#$a) == 1)): $a = $a.1
+ (all of [$a.type == "DictEntry", (#$a) == 2]): $a = \($a.1 = $a.2)
$new_assignments.$i = $a
return \(with $new_assignments $body)
diff --git a/lib/compatibility/6.14.nom b/lib/compatibility/6.14.nom
index 8443157..0e742d0 100644
--- a/lib/compatibility/6.14.nom
+++ b/lib/compatibility/6.14.nom
@@ -1,6 +1,7 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines upgrades from Nomsu <6.14 to 6.14
+
use "compatibility/compatibility"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -26,16 +27,12 @@ upgrade action (assume $assumption or barf $err) to "6.14" as
unless $assumption: fail $err
upgrade action (barf $msg) to "6.14" as (fail $msg)
-
upgrade action (\(1's meaning)).stub to "6.14" via
$tree -> (SyntaxTree {.source = $tree.source, .type = "Var", $tree.1})
-
upgrade action (log base $b of $n) to "6.14" as (log $n base $b)
-
upgrade action "use" to "6.14" via
for $tree:
$path = $tree.2.1
$path = ($path, with "%.nom$" -> "")
$path = ($path, with "^lib/" -> "")
- return \(use (SyntaxTree {.source = $tree.2.source, .type="Text"} $path))
-
+ return \(use (SyntaxTree {.source = $tree.2.source, .type = "Text"} $path))
diff --git a/lib/compatibility/6.15.nom b/lib/compatibility/6.15.nom
new file mode 100644
index 0000000..a911624
--- /dev/null
+++ b/lib/compatibility/6.15.nom
@@ -0,0 +1,20 @@
+#!/usr/bin/env nomsu -V6.15.13.8
+#
+ This file defines upgrades from Nomsu <6.15 to 6.15
+
+use "compatibility/compatibility"
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+upgrade action (external $x = $y) to "6.15" as (external ($x = $y))
+upgrade action (externally $x means $y) to "6.15" as (external ($x means $y))
+upgrade action (externally $x all mean $y) to "6.15" as
+ external ($x all mean $y)
+
+upgrade action ($lists flattened) to "6.15" as [
+ : for $ in recursive $lists:
+ if ($ is a "List"):
+ for $child in $:
+ recurse $ on $child
+ ..else: add $
+]
diff --git a/lib/compatibility/compatibility.nom b/lib/compatibility/compatibility.nom
index 8e48903..419f589 100644
--- a/lib/compatibility/compatibility.nom
+++ b/lib/compatibility/compatibility.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains code for defining ways to upgrade code between different versions
of Nomsu.
@@ -8,126 +8,123 @@ use "filesystem"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$UPGRADES = {}
-externally (upgrade to $version via $upgrade_fn) means:
- $UPGRADES.$version = $upgrade_fn
$ACTION_UPGRADES = ({} with fallback $ -> {})
-externally (upgrade action $stub to $version via $upgrade_fn) means:
- $ACTION_UPGRADES.$version.$stub = $upgrade_fn
-
-(upgrade $tree to $version as $body) parses as
- upgrade to $version via (($ $end_version) -> ($ with $tree -> $body))
-
-(upgrade action $actions to $version as $body) compiles to:
- if ($actions is "Action" syntax tree):
- $actions = \[$actions]
- $lua = (Lua "")
- for $action in $actions:
- $replacements = {}
- for $i in 1 to (size of $action):
- if ($action.$i is "Var" syntax tree):
- $replacements.($action.$i.1) = "\(\$tree as lua id)[\$i]"
- define mangler
- (make tree $t) means:
- when:
- ($t is "Var" syntax tree):
- if $replacements.($t.1):
- return $replacements.($t.1)
- ..else:
- external $needs_mangle = (yes)
- return ("
- SyntaxTree{type=\(quote $t.type), source=\(quote "\($t.source)"), \(quote (mangle $t.1))}
- ")
-
- ($t is syntax tree):
- $args = []
- for $k = $v in $t:
- if ((type of $k) == "number"):
- $args, add (make tree $v)
+external:
+ (upgrade to $version via $upgrade_fn) means:
+ $UPGRADES.$version = $upgrade_fn
+
+ (upgrade action $stub to $version via $upgrade_fn) means:
+ $ACTION_UPGRADES.$version.$stub = $upgrade_fn
+
+ (upgrade $tree to $version as $body) parses as
+ upgrade to $version via (($ $end_version) -> ($ with $tree -> $body))
+
+ (upgrade action $actions to $version as $body) compiles to:
+ if ($actions is "Action" syntax tree):
+ $actions = \[$actions]
+ $lua = (Lua "")
+ for $action in $actions:
+ $replacements = {}
+ for $i in 1 to (size of $action):
+ if ($action.$i is "Var" syntax tree):
+ $replacements.($action.$i.1) = "\(\$tree as lua id)[\$i]"
+ define mangler
+ (make tree $t) means:
+ when:
+ ($t is "Var" syntax tree):
+ if $replacements.($t.1):
+ return $replacements.($t.1)
..else:
- $args, add "\($k)=\(make tree $v)"
- return "SyntaxTree{\($args, joined with ", ")}"
-
- else:
- return (quote $t)
+ external ($needs_mangle = (yes))
+ return ("
+ SyntaxTree{type=\(quote $t.type), source=\(quote "\($t.source)"), \(quote (mangle $t.1))}
+ ")
+
+ ($t is syntax tree):
+ $args = []
+ for $k = $v in $t:
+ if ((type of $k) == "number"):
+ $args, add (make tree $v)
+ ..else:
+ $args, add "\($k)=\(make tree $v)"
+ return "SyntaxTree{\($args, joined with ", ")}"
+
+ else:
+ return (quote $t)
+
+ unless ("\$lua" == ""):
+ $lua, add "\n"
+
+ $retval = (make tree $body)
+ $lua, add
+ Lua ("
+ upgrade_action_1_to_2_via(\(quote $action.stub), \($version as lua expr), function(\
+ ..\(\$tree as lua id))
+ return \$retval
+ end)
+ ")
+ return $lua
+
+ [
+ $tree upgraded from $start_version to $end_version
+ $tree upgraded to $end_version from $start_version
+ ] all mean:
+ unless ($tree is syntax tree): return $tree
+ ($ver as list) means (($ as number) for $ in $ver matching "[0-9]+")
+ (Ver $) means:
+ [$lib, $ver] = ($, match "(.*)/([0-9.]+)")
+ if $lib:
+ return {.lib = $lib, .version = ($ver as list)}
+ return {.version = ($ as list)}
+ $start = (Ver $start_version)
+ $end = (Ver $end_version)
+ $end.lib or= $start.lib
+ assume $start.lib == $end.lib
+ $seen = {}
+ $versions = {}
+ for $v = $ in $UPGRADES:
+ $versions.$v = (yes)
- unless ("\$lua" == ""):
- $lua, add "\n"
+ for $v = $ in $ACTION_UPGRADES:
+ $versions.$v = (yes)
- $retval = (make tree $body)
- $lua, add
- Lua ("
- upgrade_action_1_to_2_via(\(quote $action.stub), \($version as lua expr), function(\
- ..\(\$tree as lua id))
- return \$retval
- end)
- ")
- return $lua
-
-externally [
- $tree upgraded from $start_version to $end_version
- $tree upgraded to $end_version from $start_version
-] all mean:
- unless ($tree is syntax tree): return $tree
-
- ($ver as list) means (($ as number) for $ in $ver matching "[0-9]+")
-
- (Ver $) means:
- [$lib, $ver] = ($, match "(.*)/([0-9.]+)")
- if $lib:
- return {.lib = $lib, .version = ($ver as list)}
- return {.version = ($ as list)}
-
- $start = (Ver $start_version)
- $end = (Ver $end_version)
- $end.lib or= $start.lib
- assume $start.lib == $end.lib
-
- $seen = {}
- $versions = {}
- for $v = $ in $UPGRADES: $versions.$v = (yes)
- for $v = $ in $ACTION_UPGRADES: $versions.$v = (yes)
- $versions = [
- :for $v = $ in $versions:
- if ((Ver $v).lib == $start.lib):
- add $v
- ]
-
- sort $versions by $ -> ($ as list)
- for $ver in $versions:
- if (($ver as list) <= $start.version): do next $ver
- if (($ver as list) > $end.version): stop $ver
- if $ACTION_UPGRADES.$ver:
- $tree =
- $tree with $ ->:
- if (($ is "Action" syntax tree) and $ACTION_UPGRADES.$ver.($.stub)):
- $with_upgraded_args = {
- : for $k = $v in $:
- add $k = ($v upgraded from $start_version to $end_version)
- }
- set $with_upgraded_args's metatable to ($'s metatable)
- return ($ACTION_UPGRADES.$ver.($.stub) $with_upgraded_args $end_version)
+ $versions = [: for $v = $ in $versions: if ((Ver $v).lib == $start.lib): add $v]
+ sort $versions by $ -> ($ as list)
+ for $ver in $versions:
+ if (($ver as list) <= $start.version): do next $ver
+ if (($ver as list) > $end.version): stop $ver
+ if $ACTION_UPGRADES.$ver:
+ $tree =
+ $tree with $ ->:
+ if (($ is "Action" syntax tree) and $ACTION_UPGRADES.$ver.($.stub)):
+ $with_upgraded_args = {
+ : for $k = $v in $:
+ add $k = ($v upgraded from $start_version to $end_version)
+ }
+ set $with_upgraded_args's metatable to ($'s metatable)
+ return ($ACTION_UPGRADES.$ver.($.stub) $with_upgraded_args $end_version)
+
+ if $UPGRADES.$ver:
+ $with_upgraded_args = {
+ : for $k = $v in $tree:
+ add $k = ($v upgraded from $start_version to $end_version)
+ }
+ set $with_upgraded_args's metatable to ($tree's metatable)
+ $tree = ($UPGRADES.$ver $with_upgraded_args $end_version)
+
+ if ($tree.version != $end_version):
+ $tree = (SyntaxTree {: for $k = $v in $tree: add $k = $v})
+ $tree.version = $end_version
+ if $tree.shebang:
+ $tree.shebang = "#!/usr/bin/env nomsu -V\$end_version\n"
- if $UPGRADES.$ver:
- $with_upgraded_args = {
- : for $k = $v in $tree:
- add $k = ($v upgraded from $start_version to $end_version)
- }
- set $with_upgraded_args's metatable to ($tree's metatable)
- $tree = ($UPGRADES.$ver $with_upgraded_args $end_version)
+ return $tree
- if ($tree.version != $end_version):
- $tree = (SyntaxTree {: for $k = $v in $tree: add $k = $v})
- $tree.version = $end_version
- if $tree.shebang:
- $tree.shebang = "#!/usr/bin/env nomsu -V\$end_version\n"
+ ($tree upgraded from $start_version) means
+ $tree upgraded from $start_version to (Nomsu version)
- return $tree
-
-externally ($tree upgraded from $start_version) means
- $tree upgraded from $start_version to (Nomsu version)
-
-externally ($tree upgraded to $end_version) means
- $tree upgraded from ($tree.version or (Nomsu version)) to $end_version
-
-externally ($tree upgraded) means
- $tree upgraded from ($tree.version or (Nomsu version)) to (Nomsu version)
+ ($tree upgraded to $end_version) means
+ $tree upgraded from ($tree.version or (Nomsu version)) to $end_version
+
+ ($tree upgraded) means
+ $tree upgraded from ($tree.version or (Nomsu version)) to (Nomsu version)
diff --git a/lib/compatibility/init.nom b/lib/compatibility/init.nom
index 40cafff..42834bb 100644
--- a/lib/compatibility/init.nom
+++ b/lib/compatibility/init.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14.13.8
+#!/usr/bin/env nomsu -V6.15.13.8
export "compatibility/compatibility"
export "compatibility/2"
export "compatibility/2.3"
diff --git a/lib/consolecolor/init.nom b/lib/consolecolor/init.nom
index d1da247..19dc5ea 100644
--- a/lib/consolecolor/init.nom
+++ b/lib/consolecolor/init.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines actions for ANSI console color escape codes.
diff --git a/lib/core/collections.nom b/lib/core/collections.nom
index 4cf54cd..dbe6900 100644
--- a/lib/core/collections.nom
+++ b/lib/core/collections.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains code that supports manipulating and using collections like lists
and dictionaries.
@@ -45,19 +45,6 @@ test:
assume ({.x = 1, .y = 1} ~ {.y = 10, .z = 10}) == {.x = 1, .z = 10}
test:
- assume (([[1, 2], [3, 4]] flattened) == [1, 2, 3, 4])
-
-externally ($lists flattened) means:
- $flat = []
- for $item in recursive $lists:
- if ($item is a "List"):
- for $ in $item:
- recurse $item on $
- ..else:
- $flat, add $item
- return $flat
-
-test:
assume ((entries in {.x = 1}) == [{.key = "x", .value = 1}])
(entries in $dict) parses as [
@@ -118,28 +105,29 @@ test:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test:
- assume ((sorted [3, 1, 2]) == [1, 2, 3])
-
-externally [$items sorted, sorted $items] all mean:
- $copy = [: for $ in $items: add $]
- sort $copy
- return $copy
-
-[$items sorted by $item = $key, $items sorted by $item -> $key] all parse as
- result of:
+external:
+ test:
+ assume ((sorted [3, 1, 2]) == [1, 2, 3])
+
+ [$items sorted, sorted $items] all mean:
$copy = [: for $ in $items: add $]
- sort $copy by $item = $key
+ sort $copy
return $copy
-
-test:
- assume ((unique [1, 2, 1, 3, 2, 3]) == [1, 2, 3])
-
-externally (unique $items) means:
- $unique = []
- $seen = {}
- for $ in $items:
- unless $seen.$:
- $unique, add $
- $seen.$ = (yes)
- return $unique
+
+ [$items sorted by $item = $key, $items sorted by $item -> $key] all parse as
+ result of:
+ $copy = [: for $ in $items: add $]
+ sort $copy by $item = $key
+ return $copy
+
+ test:
+ assume ((unique [1, 2, 1, 3, 2, 3]) == [1, 2, 3])
+
+ (unique $items) means:
+ $unique = []
+ $seen = {}
+ for $ in $items:
+ unless $seen.$:
+ $unique, add $
+ $seen.$ = (yes)
+ return $unique
diff --git a/lib/core/control_flow.nom b/lib/core/control_flow.nom
index b0c4f27..715630b 100644
--- a/lib/core/control_flow.nom
+++ b/lib/core/control_flow.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains compile-time actions that define basic control flow structures
like "if" statements and loops.
@@ -466,6 +466,7 @@ test:
# Recurion control flow
(recurse $v on $x) compiles to
Lua "table.insert(_stack_\($v as lua expr), \($x as lua expr))"
+
(for $var in recursive $structure $body) compiles to:
$lua =
Lua ("
diff --git a/lib/core/coroutines.nom b/lib/core/coroutines.nom
index 6a99f7e..3bfb346 100644
--- a/lib/core/coroutines.nom
+++ b/lib/core/coroutines.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines the code that creates and manipulates coroutines
diff --git a/lib/core/errors.nom b/lib/core/errors.nom
index 950de49..9a2cc9b 100644
--- a/lib/core/errors.nom
+++ b/lib/core/errors.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains basic error reporting code
@@ -23,9 +23,7 @@ use "core/control_flow"
(assume $a == $b) compiles to:
lua> "local \$assumption = 'Assumption failed: '..tostring(\(\($a == $b) as nomsu))"
-
define mangler
-
return
Lua ("
do
diff --git a/lib/core/id.nom b/lib/core/id.nom
index d2427b5..936fd40 100644
--- a/lib/core/id.nom
+++ b/lib/core/id.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
A simple UUID function based on RFC 4122: http://www.ietf.org/rfc/rfc4122.txt
@@ -33,34 +33,35 @@ set $id_by_obj's metatable to {
return $id
}
-externally (uuid) means:
- # Set all the other bits to randomly (or pseudo-randomly) chosen values.
- $bytes = [
- # time-low, time-mid, time-high-and-version
- randint (2 ^ (4 * 8)), randint (2 ^ (2 * 8)), randint (2 ^ (2 * 8 - 4))
- # clock-seq-and-reserved, clock-seq-low
- randint (2 ^ (1 * 8 - 2)), randint (2 ^ (1 * 8)), randint (2 ^ (3 * 8))
- # node
- randint (2 ^ (3 * 8))
- ]
+external:
+ (uuid) means:
+ # Set all the other bits to randomly (or pseudo-randomly) chosen values.
+ $bytes = [
+ # time-low, time-mid, time-high-and-version
+ randint (2 ^ (4 * 8)), randint (2 ^ (2 * 8)), randint (2 ^ (2 * 8 - 4))
+ # clock-seq-and-reserved, clock-seq-low
+ randint (2 ^ (1 * 8 - 2)), randint (2 ^ (1 * 8)), randint (2 ^ (3 * 8))
+ # node
+ randint (2 ^ (3 * 8))
+ ]
+
+ # Set the four most significant bits (bits 12 through 15) of the
+ # time_hi_and_version field to the 4-bit version number from
+ # Section 4.1.3.
+ $bytes.3 += 0x4000
+
+ # Set the two most significant bits (bits 6 and 7) of the
+ # clock_seq_hi_and_reserved to zero and one, respectively.
+ $bytes.4 += 0xC0
+ return (=lua "('%08x-%04x-%04x-%02x%02x-%6x%6x'):format(unpack(\$bytes))")
- # Set the four most significant bits (bits 12 through 15) of the
- # time_hi_and_version field to the 4-bit version number from
- # Section 4.1.3.
- $bytes.3 += 0x4000
-
- # Set the two most significant bits (bits 6 and 7) of the
- # clock_seq_hi_and_reserved to zero and one, respectively.
- $bytes.4 += 0xC0
- return (=lua "('%08x-%04x-%04x-%02x%02x-%6x%6x'):format(unpack(\$bytes))")
-
-# For strict identity checking, use ($x's id) == ($y's id)
-test:
- assume (([] == []) and ((id of []) != (id of [])))
- seed random with 0
- $x = []
- assume ((id of $x) == (id of $x))
- seed random with 0
- assume ((id of $x) != (id of []))
- seed random
-externally [id of $, $'s id, $'id] all mean $id_by_obj.$
+ # For strict identity checking, use ($x's id) == ($y's id)
+ test:
+ assume (([] == []) and ((id of []) != (id of [])))
+ seed random with 0
+ $x = []
+ assume ((id of $x) == (id of $x))
+ seed random with 0
+ assume ((id of $x) != (id of []))
+ seed random
+ [id of $, $'s id, $'id] all mean $id_by_obj.$
diff --git a/lib/core/init.nom b/lib/core/init.nom
index 5b1074f..1319c5f 100644
--- a/lib/core/init.nom
+++ b/lib/core/init.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14.13.8
+#!/usr/bin/env nomsu -V6.15.13.8
# Export everything
export "core/metaprogramming"
export "core/operators"
diff --git a/lib/core/io.nom b/lib/core/io.nom
index 7afe889..90cfbd4 100644
--- a/lib/core/io.nom
+++ b/lib/core/io.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains basic input/output code
@@ -6,24 +6,25 @@ use "core/metaprogramming"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-(say $message) compiles to:
- lua> ("
- if \$message.type == "Text" then
- return LuaCode("say(", \($message as lua expr), ");");
- else
- return LuaCode("say(tostring(", \($message as lua expr), "));");
- end
- ")
-
-(say $message inline) compiles to:
- lua> ("
- if \$message.type == "Text" then
- return LuaCode("io.write(", \($message as lua expr), ")");
- else
- return LuaCode("io.write(tostring(", \($message as lua expr), "))");
- end
- ")
-
-externally (ask $prompt) means:
- $io.write $prompt
- return ($io.read())
+external:
+ (say $message) compiles to:
+ lua> ("
+ if \$message.type == "Text" then
+ return LuaCode("say(", \($message as lua expr), ");");
+ else
+ return LuaCode("say(tostring(", \($message as lua expr), "));");
+ end
+ ")
+
+ (say $message inline) compiles to:
+ lua> ("
+ if \$message.type == "Text" then
+ return LuaCode("io.write(", \($message as lua expr), ")");
+ else
+ return LuaCode("io.write(tostring(", \($message as lua expr), "))");
+ end
+ ")
+
+ (ask $prompt) means:
+ $io.write $prompt
+ return ($io.read())
diff --git a/lib/core/math.nom b/lib/core/math.nom
index 685ab1e..e2c759a 100644
--- a/lib/core/math.nom
+++ b/lib/core/math.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines some common math literals and functions
@@ -10,203 +10,201 @@ use "core/collections"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-# Literals:
-test:
- unless (all of [inf, NaN, pi, tau, golden ratio, e]):
- fail "math constants failed"
- $nan = (NaN)
- unless ($nan != $nan):
- fail "NaN failed"
-[infinity, inf] all compile to "math.huge"
-[not a number, NaN, nan] all compile to "(0/0)"
-[pi, Pi, PI] all compile to "math.pi"
-[tau, Tau, TAU] all compile to "(2*math.pi)"
-(golden ratio) compiles to "((1+math.sqrt(5))/2)"
-(e) compiles to "math.exp(1)"
-
-# Functions:
-test:
- assume (("5" as a number) == 5)
-external $($ as a number) = $(tonumber $)
-external $($ as number) = $(tonumber $)
-test:
- unless
- all of [
- abs 5, | 5 |, sqrt 5, √ 5, sine 5, cosine 5, tangent 5, arc sine 5, arc cosine 5
- arc tangent 5, arc tangent 5 / 10, hyperbolic sine 5, hyperbolic cosine 5
- hyperbolic tangent 5, e^ 5, ln 5, log 5 base 2, floor 5, ceiling 5, round 5
- ]
- ..:
- fail "math functions failed"
-external [$(absolute value $), $(absolute value of $), $(| $ |), $(abs $)] =
- [$math.abs, $math.abs, $math.abs, $math.abs]
-external [$(square root $), $(square root of $), $(√ $), $(sqrt $)] =
- [$math.sqrt, $math.sqrt, $math.sqrt, $math.sqrt]
-external [$(sine $), $(sin $)] = [$math.sin, $math.sin]
-external [$(cosine $), $(cos $)] = [$math.cos, $math.cos]
-external [$(tangent $), $(tan $)] = [$math.tan, $math.tan]
-external [$(arc sine $), $(asin $)] = [$math.asin, $math.asin]
-external [$(arc cosine $), $(acos $)] = [$math.acos, $math.acos]
-external [$(arc tangent $), $(atan $)] = [$math.atan, $math.atan]
-external [$(arc tangent $y / $x), $(atan2 $y $x)] = [$math.atan2, $math.atan2]
-external [$(hyperbolic sine $), $(sinh $)] = [$math.sinh, $math.sinh]
-external [$(hyperbolic cosine $), $(cosh $)] = [$math.cosh, $math.cosh]
-external [$(hyperbolic tangent $), $(tanh $)] = [$math.tanh, $math.tanh]
-external [$(e^ $), $(exp $)] = [$math.exp, $math.exp]
-external [$(natural log $), $(ln $), $(log $), $(log $ base $)] = [$math.log, $math.log, $math.log, $math.log]
-external $(floor $) = $math.floor
-external [$(ceiling $), $(ceil $)] = [$math.ceil, $math.ceil]
-externally [round $, $ rounded] all mean
- floor ($ + 0.5)
-test:
- unless ((463 to the nearest 100) == 500): fail "rounding failed"
- unless ((2.6 to the nearest 0.25) == 2.5): fail "rounding failed"
-
-externally ($n to the nearest $rounder) means
- $rounder * (floor ($n / $rounder + 0.5))
-
-# Any/all
-externally [all of $items, all $items] all mean:
- for $ in $items:
- unless $:
- return (no)
- return (yes)
-[not all of $items, not all $items] all parse as (not (all of $items))
-externally [any of $items, any $items] all mean:
- for $ in $items:
- if $:
- return (yes)
- return (no)
-[none of $items, none $items] all parse as (not (any of $items))
-
-# Sum/product
-externally [sum of $items, sum $items] all mean:
- $total = 0
- for $ in $items:
- $total += $
- return $total
-
-externally [product of $items, product $items] all mean:
- $prod = 1
- for $ in $items:
- $prod *= $
- return $prod
-
-externally [avg of $items, average of $items] all mean
- (sum of $items) / (size of $items)
-
-# Min/max
-externally [min of $items, smallest of $items, lowest of $items] all mean:
- $best = (nil)
- for $ in $items:
- if (($best == (nil)) or ($ < $best)): $best = $
- return $best
-
-externally [
- max of $items, biggest of $items, largest of $items, highest of $items
-] all mean:
- $best = (nil)
- for $ in $items:
- if (($best == (nil)) or ($ > $best)): $best = $
- return $best
-
-test:
- assume ((min of [3, -4, 1, 2] by $ = ($ * $)) == 1)
- assume ((max of [3, -4, 1, 2] by $ = ($ * $)) == -4)
-
-(min of $items by $item = $value_expr) parses as
- result of:
+external:
+ # Literals:
+ test:
+ unless (all of [inf, NaN, pi, tau, golden ratio, e]):
+ fail "math constants failed"
+ $nan = (NaN)
+ unless ($nan != $nan):
+ fail "NaN failed"
+ [infinity, inf] all compile to "math.huge"
+ [not a number, NaN, nan] all compile to "(0/0)"
+ [pi, Pi, PI] all compile to "math.pi"
+ [tau, Tau, TAU] all compile to "(2*math.pi)"
+ (golden ratio) compiles to "((1+math.sqrt(5))/2)"
+ (e) compiles to "math.exp(1)"
+
+ # Functions:
+ test:
+ assume (("5" as a number) == 5)
+ $($ as a number) = $(tonumber $)
+ $($ as number) = $(tonumber $)
+ test:
+ unless
+ all of [
+ abs 5, | 5 |, sqrt 5, √ 5, sine 5, cosine 5, tangent 5, arc sine 5, arc cosine 5
+ arc tangent 5, arc tangent 5 / 10, hyperbolic sine 5, hyperbolic cosine 5
+ hyperbolic tangent 5, e^ 5, ln 5, log 5 base 2, floor 5, ceiling 5, round 5
+ ]
+ ..:
+ fail "math functions failed"
+
+ [$(absolute value $), $(absolute value of $), $(| $ |), $(abs $)] =
+ [$math.abs, $math.abs, $math.abs, $math.abs]
+
+ [$(square root $), $(square root of $), $(√ $), $(sqrt $)] =
+ [$math.sqrt, $math.sqrt, $math.sqrt, $math.sqrt]
+
+ [$(sine $), $(sin $)] = [$math.sin, $math.sin]
+ [$(cosine $), $(cos $)] = [$math.cos, $math.cos]
+ [$(tangent $), $(tan $)] = [$math.tan, $math.tan]
+ [$(arc sine $), $(asin $)] = [$math.asin, $math.asin]
+ [$(arc cosine $), $(acos $)] = [$math.acos, $math.acos]
+ [$(arc tangent $), $(atan $)] = [$math.atan, $math.atan]
+ [$(arc tangent $y / $x), $(atan2 $y $x)] = [$math.atan2, $math.atan2]
+ [$(hyperbolic sine $), $(sinh $)] = [$math.sinh, $math.sinh]
+ [$(hyperbolic cosine $), $(cosh $)] = [$math.cosh, $math.cosh]
+ [$(hyperbolic tangent $), $(tanh $)] = [$math.tanh, $math.tanh]
+ [$(e^ $), $(exp $)] = [$math.exp, $math.exp]
+ [$(natural log $), $(ln $), $(log $), $(log $ base $)] =
+ [$math.log, $math.log, $math.log, $math.log]
+ $(floor $) = $math.floor
+ [$(ceiling $), $(ceil $)] = [$math.ceil, $math.ceil]
+ [round $, $ rounded] all mean (floor ($ + 0.5))
+ test:
+ unless ((463 to the nearest 100) == 500): fail "rounding failed"
+ unless ((2.6 to the nearest 0.25) == 2.5): fail "rounding failed"
+ ($n to the nearest $rounder) means ($rounder * (floor ($n / $rounder + 0.5)))
+
+ # Any/all
+ [all of $items, all $items] all mean:
+ for $ in $items:
+ unless $:
+ return (no)
+ return (yes)
+ [not all of $items, not all $items] all parse as (not (all of $items))
+ [any of $items, any $items] all mean:
+ for $ in $items:
+ if $:
+ return (yes)
+ return (no)
+ [none of $items, none $items] all parse as (not (any of $items))
+
+ # Sum/product
+ [sum of $items, sum $items] all mean:
+ $total = 0
+ for $ in $items:
+ $total += $
+ return $total
+
+ [product of $items, product $items] all mean:
+ $prod = 1
+ for $ in $items:
+ $prod *= $
+ return $prod
+
+ [avg of $items, average of $items] all mean ((sum of $items) / (size of $items))
+
+ # Min/max
+ [min of $items, smallest of $items, lowest of $items] all mean:
$best = (nil)
- $best_key = (nil)
- for $item in $items:
- $key = $value_expr
- if (($best == (nil)) or ($key < $best_key)):
- $best = $item
- $best_key = $key
+ for $ in $items:
+ if (($best == (nil)) or ($ < $best)): $best = $
return $best
-
-(max of $items by $item = $value_expr) parses as
- result of:
+
+ [max of $items, biggest of $items, largest of $items, highest of $items] all mean:
$best = (nil)
- $best_key = (nil)
- for $item in $items:
- $key = $value_expr
- if (($best == (nil)) or ($key > $best_key)):
- $best = $item
- $best_key = $key
+ for $ in $items:
+ if (($best == (nil)) or ($ > $best)): $best = $
return $best
-
-test:
- assume (100 clamped between 0 and 10) == 10
-
-externally ($ clamped between $min and $max) means:
- when:
- ($ < $min):
- return $min
-
- ($ > $max):
- return $max
-
- else:
- return $
-
-test:
- assume (-0.1 smoothed by 2.7) == 0
- assume (0 smoothed by 2.7) == 0
- assume (0.5 smoothed by 2.7) == 0.5
- assume (1 smoothed by 2.7) == 1
- assume (1.1 smoothed by 2.7) == 1
-
-externally ($ smoothed by $smoothness) means:
- $ = ($ clamped between 0 and 1)
- if ($smoothness == 0): return $
- $k = (2 ^ $smoothness)
- if ($ < 0.5):
- return (0.5 * (2 * $) ^ $k)
- ..else:
- return (1 - 0.5 * (2 - 2 * $) ^ $k)
-
-test:
- assume (5 to 7 mixed by -1.0) == 5
- assume (5 to 7 mixed by 0.0) == 5
- assume (5 to 7 mixed by 0.5) == 6
- assume (5 to 7 mixed by 1.0) == 7
- assume (5 to 7 mixed by 2.0) == 7
-
-externally ($lo to $hi mixed by $amount) means:
- $ = ($amount clamped between 0 and 1)
- return ((1 - $) * $lo + $ * $hi)
-
-test:
- assume ([0, 1, 11] mixed by 0.0) == 0
- assume ([0, 1, 11] mixed by 0.25) == 0.5
- assume ([0, 1, 11] mixed by 0.5) == 1
- assume ([0, 1, 11] mixed by 0.75) == 6
- assume ([0, 1, 11] mixed by 1.0) == 11
- assume ([99] mixed by 0.5) == 99
-
-externally ($nums mixed by $amount) means:
- $ = ($amount clamped between 0 and 1)
- $i = (1 + ($ * ((#$nums) - 1)))
- if ((floor $i) == (#$nums)):
- return $nums.(floor $i)
- [$lo, $hi] = [$nums.(floor $i), $nums.(floor ($i + 1))]
- return ($lo to $hi mixed by ($i mod 1))
-
-# Random functions
-externally (seed random with $) means:
- lua> ("
- math.randomseed(\$);
- for i=1,20 do math.random(); end
- ")
-(seed random) parses as (seed random with (=lua "os.time()"))
-[random number, random, rand] all compile to "math.random()"
-[random int $n, random integer $n, randint $n] all compile to
- "math.random(\($n as lua expr))"
-
-[random from $low to $high, random number from $low to $high, rand $low $high]
-..all compile to "math.random(\($low as lua expr), \($high as lua expr))"
-
-externally [
- random choice from $elements, random choice $elements, random $elements
-] all mean (=lua "\$elements[math.random(#\$elements)]")
+
+ test:
+ assume ((min of [3, -4, 1, 2] by $ = ($ * $)) == 1)
+ assume ((max of [3, -4, 1, 2] by $ = ($ * $)) == -4)
+
+ (min of $items by $item = $value_expr) parses as
+ result of:
+ $best = (nil)
+ $best_key = (nil)
+ for $item in $items:
+ $key = $value_expr
+ if (($best == (nil)) or ($key < $best_key)):
+ $best = $item
+ $best_key = $key
+ return $best
+
+ (max of $items by $item = $value_expr) parses as
+ result of:
+ $best = (nil)
+ $best_key = (nil)
+ for $item in $items:
+ $key = $value_expr
+ if (($best == (nil)) or ($key > $best_key)):
+ $best = $item
+ $best_key = $key
+ return $best
+
+ test:
+ assume (100 clamped between 0 and 10) == 10
+
+ ($ clamped between $min and $max) means:
+ when:
+ ($ < $min):
+ return $min
+
+ ($ > $max):
+ return $max
+
+ else:
+ return $
+
+ test:
+ assume (-0.1 smoothed by 2.7) == 0
+ assume (0 smoothed by 2.7) == 0
+ assume (0.5 smoothed by 2.7) == 0.5
+ assume (1 smoothed by 2.7) == 1
+ assume (1.1 smoothed by 2.7) == 1
+
+ ($ smoothed by $smoothness) means:
+ $ = ($ clamped between 0 and 1)
+ if ($smoothness == 0): return $
+ $k = (2 ^ $smoothness)
+ if ($ < 0.5):
+ return (0.5 * (2 * $) ^ $k)
+ ..else:
+ return (1 - 0.5 * (2 - 2 * $) ^ $k)
+
+ test:
+ assume (5 to 7 mixed by -1) == 5
+ assume (5 to 7 mixed by 0) == 5
+ assume (5 to 7 mixed by 0.5) == 6
+ assume (5 to 7 mixed by 1) == 7
+ assume (5 to 7 mixed by 2) == 7
+
+ ($lo to $hi mixed by $amount) means:
+ $ = ($amount clamped between 0 and 1)
+ return ((1 - $) * $lo + $ * $hi)
+
+ test:
+ assume ([0, 1, 11] mixed by 0) == 0
+ assume ([0, 1, 11] mixed by 0.25) == 0.5
+ assume ([0, 1, 11] mixed by 0.5) == 1
+ assume ([0, 1, 11] mixed by 0.75) == 6
+ assume ([0, 1, 11] mixed by 1) == 11
+ assume ([99] mixed by 0.5) == 99
+
+ ($nums mixed by $amount) means:
+ $ = ($amount clamped between 0 and 1)
+ $i = (1 + ($ * ((#$nums) - 1)))
+ if ((floor $i) == (#$nums)):
+ return $nums.(floor $i)
+ [$lo, $hi] = [$nums.(floor $i), $nums.(floor ($i + 1))]
+ return ($lo to $hi mixed by ($i mod 1))
+
+ # Random functions
+ (seed random with $) means:
+ lua> ("
+ math.randomseed(\$);
+ for i=1,20 do math.random(); end
+ ")
+ (seed random) parses as (seed random with (=lua "os.time()"))
+ [random number, random, rand] all compile to "math.random()"
+ [random int $n, random integer $n, randint $n] all compile to
+ "math.random(\($n as lua expr))"
+
+ [random from $low to $high, random number from $low to $high, rand $low $high]
+ ..all compile to "math.random(\($low as lua expr), \($high as lua expr))"
+
+ [random choice from $elements, random choice $elements, random $elements]
+ ..all mean (=lua "\$elements[math.random(#\$elements)]")
diff --git a/lib/core/metaprogramming.nom b/lib/core/metaprogramming.nom
index 936f9bd..9b3d5c4 100644
--- a/lib/core/metaprogramming.nom
+++ b/lib/core/metaprogramming.nom
@@ -1,9 +1,9 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This File contains actions for making actions and compile-time actions and some helper
functions to make that easier.
-lua> "NOMSU_CORE_VERSION = 14"
+lua> "NOMSU_CORE_VERSION = 15"
lua> "NOMSU_LIB_VERSION = 8"
lua> ("
do
@@ -25,8 +25,7 @@ lua> ("
COMPILE_RULES["1 ->"] = function(\(nomsu environment), \$args, \$body)
if \$args and not \$body then \$args, \$body = {}, \$args end
local body_lua = SyntaxTree:is_instance(\$body) and \(nomsu environment):compile(\$body) or \$body
- if SyntaxTree:is_instance(\$body) and \$body.type ~= "Block" then body_lua:prepend("\
- ..return ") end
+ if SyntaxTree:is_instance(\$body) and \$body.type ~= "Block" then body_lua:prepend("return ") end
local lua = LuaCode("(function(")
if SyntaxTree:is_instance(\$args) and (\$args.type == "Action" or \$args.type == "MethodCall") then
\$args = \$args:get_args()
@@ -41,8 +40,7 @@ lua> ("
end
elseif not arg_lua:is_lua_id() then
compile_error_at(SyntaxTree:is_instance(arg) and arg or nil,
- "This does not compile to a Lua identifier, so it can't be used as a function \
- ..argument.",
+ "This does not compile to a Lua identifier, so it can't be used as a function argument.",
"This should probably be a Nomsu variable instead (like $x).")
end
lua:add(i > 1 and ", " or "", arg_lua)
@@ -186,26 +184,40 @@ test:
")
test:
- externally (baz1) means:
- return "baz1"
- externally (baz2) means "baz2"
+ $loc = 99
+ external ($glob = 99)
test:
- assume ((baz1) == "baz1")
- assume ((baz2) == "baz2")
+ assume $loc == (nil)
+ assume $glob == 99
-(externally $action means $body) compiles to:
+(external $body) compiles to:
lua> ("
- local lua = \(\($action means $body) as lua)
- lua:remove_free_vars({\$action:get_stub():as_lua_id()})
+ local lua = \($body as lua)
+ lua:remove_free_vars()
return lua
")
-(externally $actions all mean $body) compiles to:
+test:
+ [$x, $y] = ["outer", "outer"]
+ external:
+ (set external x local y) means:
+ with external [$x]:
+ $x = "inner"
+ $y = "inner"
+ set external x local y
+ unless (($x == "inner") and ($y == "outer")):
+ fail "'with external' failed."
+
+(with external $externals $body) compiles to:
lua> ("
- local lua = \(\($actions all mean $body) as lua)
- lua:remove_free_vars(table.map(\$actions, function(a) return a:get_stub():as_lua_id() end))
- return lua
+ local body_lua = \($body as lua)
+ local varnames = {}
+ for i,\$v in ipairs(\$externals) do
+ varnames[i] = \($v as lua):text()
+ end
+ body_lua:remove_free_vars(varnames)
+ return body_lua
")
test:
@@ -239,8 +251,8 @@ test:
if replacements[t:as_var()] then
return replacements[t:as_var()]
else
- return "SyntaxTree{mangle("..t:as_var():as_lua().."), type="..t.type:as_lua()..", \
- ..source="..tostring(t.source):as_lua().."}"
+ return "SyntaxTree{mangle("..t:as_var():as_lua().."), type="..t.type:as_lua(\
+ ..)..", source="..tostring(t.source):as_lua().."}"
end
elseif SyntaxTree:is_instance(t) then
local ret = {}
@@ -274,34 +286,37 @@ test:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[$action parses as $body] all parse as ([$action] all parse as $body)
-externally (in (nomsu environment) $tree as lua expr) means:
- lua> ("
- local tree_lua = \(nomsu environment):compile(\$tree)
- if \$tree.type == 'Block' then
- tree_lua = LuaCode:from(\$tree.source, '(function()\\n ', tree_lua, '\\nend)()')
- elseif \$tree.type == 'MethodCall' and #\$tree > 2 then
- compile_error_at(\$tree, "This must be a single value instead of "..(#\$tree - 1).."\
- .. method calls.",
- "Replace this with a single method call.")
- end
- return tree_lua
- ")
+external:
+ (in (nomsu environment) $tree as lua expr) means:
+ lua> ("
+ local tree_lua = \(nomsu environment):compile(\$tree)
+ if \$tree.type == 'Block' then
+ tree_lua = LuaCode:from(\$tree.source, '(function()\\n ', tree_lua, '\\nend)()')
+ elseif \$tree.type == 'MethodCall' and #\$tree > 2 then
+ compile_error_at(\$tree, "This must be a single value instead of "..(#\$tree - 1).."\
+ .. method calls.",
+ "Replace this with a single method call.")
+ end
+ return tree_lua
+ ")
# Need to make sure the proper environment is used for compilation (i.e. the caller's environment)
-($tree as lua expr) compiles to (\(in \(nomsu environment) $tree as lua expr) as lua)
+($tree as lua expr) compiles to
+ \(in \(nomsu environment) $tree as lua expr) as lua
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-externally [$var as lua identifier, $var as lua id] all mean:
- lua> ("
- local lua = \($var as lua)
- if not lua:text():is_a_lua_id() then
- compile_error(\$var,
- "This is supposed to be something that compiles to a valid Lua identifier.",
- "This should probably be a variable.")
- end
- return lua
- ")
+external:
+ [$var as lua identifier, $var as lua id] all mean:
+ lua> ("
+ local lua = \($var as lua)
+ if not lua:text():is_a_lua_id() then
+ compile_error(\$var,
+ "This is supposed to be something that compiles to a valid Lua identifier.",
+ "This should probably be a variable.")
+ end
+ return lua
+ ")
test:
(num args (*extra arguments*)) means (select "#" (*extra arguments*))
@@ -312,11 +327,10 @@ test:
assume (third arg 5 6 7 8) == 7
(*extra arguments*) compiles to "..."
-
($ is syntax tree) compiles to "SyntaxTree:is_instance(\($ as lua expr))"
-
-externally ($ is $kind syntax tree) means
- =lua "SyntaxTree:is_instance(\$) and \$.type == \$kind"
+external:
+ ($ is $kind syntax tree) means
+ =lua "SyntaxTree:is_instance(\$) and \$.type == \$kind"
($tree with $t -> $replacement) compiles to ("
\($tree as lua expr):map(function(\($t as lua expr))
@@ -329,14 +343,15 @@ externally ($ is $kind syntax tree) means
end)
")
-externally ($tree with vars $replacements) means
- =lua ("
- \$tree:map(function(\$t)
- if \$t.type == "Var" then
- return \$replacements[\$t:as_var()]
- end
- end)
- ")
+external:
+ ($tree with vars $replacements) means
+ =lua ("
+ \$tree:map(function(\$t)
+ if \$t.type == "Var" then
+ return \$replacements[\$t:as_var()]
+ end
+ end)
+ ")
(tree $tree with vars $replacements) compiles to ("
\(=lua "(\$tree):as_lua()"):map(function(t)
@@ -355,24 +370,25 @@ externally ($tree with vars $replacements) means
end)()
")
-externally (match $tree with $patt) means:
- lua> ("
- if \$patt.type == "Var" then return Dict{[\$patt:as_var()]=\$tree} end
- if \$patt.type == "Action" and \$patt:get_stub() ~= \$tree:get_stub() then return nil end
- if #\$patt ~= #\$tree then return nil end
- local matches = Dict{}
- for \($i)=1,#\$patt do
- if SyntaxTree:is_instance(\$tree[\$i]) then
- local submatch = \(match $tree.$i with $patt.$i)
- if not submatch then return nil end
- for k,v in pairs(submatch) do
- if matches[k] and matches[k] ~= v then return nil end
- matches[k] = v
+external:
+ (match $tree with $patt) means:
+ lua> ("
+ if \$patt.type == "Var" then return Dict{[\$patt:as_var()]=\$tree} end
+ if \$patt.type == "Action" and \$patt:get_stub() ~= \$tree:get_stub() then return nil end
+ if #\$patt ~= #\$tree then return nil end
+ local matches = Dict{}
+ for \($i)=1,#\$patt do
+ if SyntaxTree:is_instance(\$tree[\$i]) then
+ local submatch = \(match $tree.$i with $patt.$i)
+ if not submatch then return nil end
+ for k,v in pairs(submatch) do
+ if matches[k] and matches[k] ~= v then return nil end
+ matches[k] = v
+ end
end
end
- end
- return matches
- ")
+ return matches
+ ")
test:
assume
@@ -390,20 +406,20 @@ test:
assume ({} is a "Dict")
assume ("" is text)
assume ("" isn't a "Dict")
-externally ($ is text) means (=lua "\(lua type of $) == 'string'")
-externally [$ is not text, $ isn't text] all mean
- =lua "\(lua type of $) ~= 'string'"
-externally (type of $) means:
- lua> ("
- local lua_type = \(lua type of $)
- if lua_type == 'string' then return 'Text'
- elseif lua_type == 'table' or lua_type == 'userdata' then
- local mt = getmetatable(\$)
- if mt and mt.__type then return mt.__type end
- end
- return lua_type
- ")
+external:
+ ($ is text) means (=lua "\(lua type of $) == 'string'")
+ [$ is not text, $ isn't text] all mean (=lua "\(lua type of $) ~= 'string'")
+ (type of $) means:
+ lua> ("
+ local lua_type = \(lua type of $)
+ if lua_type == 'string' then return 'Text'
+ elseif lua_type == 'table' or lua_type == 'userdata' then
+ local mt = getmetatable(\$)
+ if mt and mt.__type then return mt.__type end
+ end
+ return lua_type
+ ")
[$ is a $type, $ is an $type] all parse as ((type of $) == $type)
[$ isn't a $type, $ isn't an $type, $ is not a $type, $ is not an $type]
@@ -441,19 +457,24 @@ test:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-#
- (with local compile actions $body) compiles to ("
- do
- local OLD_RULES = COMPILE_RULES
- local OLD_ENV = \(nomsu environment)
- local \(nomsu environment) = setmetatable({
- COMPILE_RULES=setmetatable({}, {__index=OLD_RULES})
- }, {__index=OLD_ENV})
- \($body as lua)
- end
+test:
+ using compile rules:
+ (yes) compiles to "3"
+ assume $(COMPILE RULES).yes
+ ..do:
+ assume (yes) == 3
+ assume (yes) == (=lua "true")
+
+(using compile rules $rules do $body) compiles to:
+ lua> ("
+ local env = \(new environment)
+ env:run(\$rules)
+ local lua = env:compile(\$body)
+ return lua
")
-externally (Nomsu version) means:
- return ("
- \(Nomsu syntax version).\(core version).\(Nomsu compiler version).\(lib version)
- ")
+external:
+ (Nomsu version) means:
+ return ("
+ \(Nomsu syntax version).\(core version).\(Nomsu compiler version).\(lib version)
+ ")
diff --git a/lib/core/operators.nom b/lib/core/operators.nom
index 912b7c1..b0f37f0 100644
--- a/lib/core/operators.nom
+++ b/lib/core/operators.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains definitions of operators like "+" and "and".
@@ -78,34 +78,6 @@ test:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test:
- [$foozle, $y] = ["outer", "outer"]
- externally (set global x local y) means:
- external $foozle = "inner"
- $y = "inner"
- set global x local y
- unless (($foozle == "inner") and ($y == "outer")): fail "external failed."
-(external $var = $value) compiles to:
- $lua = ((SyntaxTree {.type = "Action", .source = $var.source} $var "=" $value) as lua)
- $lua, remove free vars
- return $lua
-test:
- [$foozle, $y] = ["outer", "outer"]
- externally (set global x local y) means:
- with external [$foozle]:
- $foozle = "inner"
- $y = "inner"
- set global x local y
- unless (($foozle == "inner") and ($y == "outer")):
- fail "'with external' failed."
-
-(with external $externs $body) compiles to:
- $body_lua = ($body as lua)
- lua> ("
- \$body_lua:remove_free_vars(table.map(\$externs, function(v) return \(nomsu environment):compile(v):text() end))
- ")
- return $body_lua
-
-test:
[$x, $y] = [1, 2]
with [$z, $x = 999]:
assume $z == (nil)
@@ -156,7 +128,8 @@ test:
test:
$calls = 0
(one) means:
- external $calls = ($calls + 1)
+ external:
+ $calls = ($calls + 1)
return 1
unless (0 <= (one) <= 2):
diff --git a/lib/core/text.nom b/lib/core/text.nom
index 1351af6..a1fcaae 100644
--- a/lib/core/text.nom
+++ b/lib/core/text.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains some definitions of text escape sequences, including ANSI console
color codes.
@@ -34,7 +34,6 @@ test:
"), lines
..== ["one", "two", ""]
-
($spec とは $body) parses as ($spec means $body)
test:
@@ -61,16 +60,18 @@ test:
test:
assume (0xDEADBEEF as hex) == "0xDEADBEEF"
-externally ($num as hex) means:
- if ($num < 0):
- return ("-0x%X", formatted with (- $num))
- ..else:
- return ("0x%X", formatted with $num)
+external:
+ ($num as hex) means:
+ if ($num < 0):
+ return ("-0x%X", formatted with (- $num))
+ ..else:
+ return ("0x%X", formatted with $num)
# Text literals
$escapes = {
- .nl = "\n", .newline = "\n", .tab = "\t", .bell = "\a", .cr = "\r", ."carriage return" = "\r"
- .backspace = "\b", ."form feed" = "\f", .formfeed = "\f", ."vertical tab" = "\v"
+ .nl = "\n", .newline = "\n", .tab = "\t", .bell = "\a", .cr = "\r"
+ ."carriage return" = "\r", .backspace = "\b", ."form feed" = "\f"
+ .formfeed = "\f", ."vertical tab" = "\v"
}
for $name = $str in $escapes:
diff --git a/lib/file_hash/init.nom b/lib/file_hash/init.nom
index 7b428cd..709c622 100644
--- a/lib/file_hash/init.nom
+++ b/lib/file_hash/init.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines some actions for hashing files and looking up files by hash.
@@ -32,9 +32,10 @@ test:
assume ((hash "hello world") == "Kq5sNclPz7QV2+lfQIuc6R7oRu0=")
if $use_sha1:
- externally (hash $) means:
- $hash = (=lua "\$hashlib.new('sha1'):final(\$)")
- return (base64 $hash)
+ external:
+ (hash $) means:
+ $hash = (=lua "\$hashlib.new('sha1'):final(\$)")
+ return (base64 $hash)
..else:
# TODO: remove warning?
say ("
@@ -42,19 +43,20 @@ if $use_sha1:
..hash function.\027[0m
")
- externally (hash $) means:
- $bytes = ($, bytes)
- $hash = ($bytes.1 << 7)
- for $i in 2 to (size of $bytes):
- $hash = ((1000003 * $hash) ~ $bytes.$i)
- $hash = ($hash ~ (size of $bytes))
- return "\$hash"
+ external:
+ (hash $) means:
+ $bytes = ($, bytes)
+ $hash = ($bytes.1 << 7)
+ for $i in 2 to (size of $bytes):
+ $hash = ((1000003 * $hash) ~ $bytes.$i)
+ $hash = ($hash ~ (size of $bytes))
+ return "\$hash"
-externally (file with hash $hash) means:
- for $filename in (files for "."):
- $contents = (read file $filename)
- $file_hash = (hash $contents)
- if ($file_hash == $hash):
- return $filename
-
-(hash of file $filename) parses as (hash (read file $filename))
+external:
+ (file with hash $hash) means:
+ for $filename in (files for "."):
+ $contents = (read file $filename)
+ $file_hash = (hash $contents)
+ if ($file_hash == $hash):
+ return $filename
+ (hash of file $filename) parses as (hash (read file $filename))
diff --git a/lib/filesystem/init.nom b/lib/filesystem/init.nom
index a228bdc..3e819f8 100644
--- a/lib/filesystem/init.nom
+++ b/lib/filesystem/init.nom
@@ -1,36 +1,36 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines some actions that interact with the filesystem.
-externally (files for $path) means:
- $files = (=lua "Files.list(\$path)")
- if $files:
- $files = (List $files)
- return $files
-
-external $(read file $filename) = $Files.read
-externally [
- write to file $filename $text, to file $filename write $text
- write $text to file $filename
-] all mean:
- unless ($filename != "stdin"):
- fail "Cannot write to stdin"
+external:
+ (files for $path) means:
+ $files = (=lua "Files.list(\$path)")
+ if $files:
+ $files = (List $files)
+ return $files
+ $(read file $filename) = $Files.read
+ [
+ write to file $filename $text, to file $filename write $text
+ write $text to file $filename
+ ] all mean:
+ unless ($filename != "stdin"):
+ fail "Cannot write to stdin"
+
+ lua> ("
+ local file = io.open(\$filename, 'w')
+ file:write(\$text)
+ file:close()
+ ")
- lua> ("
- local file = io.open(\$filename, 'w')
- file:write(\$text)
- file:close()
- ")
-
-externally (source lines of $tree) means:
- $source = ($tree.source if ($tree is syntax tree) else $tree)
- $file = (read file $source.filename)
- return
- [
- : for $ in ($file, line number at $source.start) to
- $file, line number at $source.stop
- ..: add ($file, line $)
- ], joined with "\n"
-
-external $(spoof file $text) = $Files.spoof
-external $(spoof file $filename = $text) = $Files.spoof
+ (source lines of $tree) means:
+ $source = ($tree.source if ($tree is syntax tree) else $tree)
+ $file = (read file $source.filename)
+ return
+ [
+ : for $ in ($file, line number at $source.start) to
+ $file, line number at $source.stop
+ ..: add ($file, line $)
+ ], joined with "\n"
+
+ $(spoof file $text) = $Files.spoof
+ $(spoof file $filename = $text) = $Files.spoof
diff --git a/lib/object.nom b/lib/object.nom
index a3a8d93..99981a0 100644
--- a/lib/object.nom
+++ b/lib/object.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file contains the implementation of an Object-Oriented programming system.
diff --git a/lib/progressbar/init.nom b/lib/progressbar/init.nom
index a7ff5aa..5da9360 100644
--- a/lib/progressbar/init.nom
+++ b/lib/progressbar/init.nom
@@ -1,16 +1,12 @@
+#!/usr/bin/env nomsu -V6.15.13.8
# A progress bar
-
-externally ($x / $w progress bar) means:
- $x = ($x clamped between 0 and $w)
- $bits = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]
- $middle =
- "" if ($x == $w) else
- $bits.(1 + (floor ((#$bits) * ($x mod 1))))
- return ("
- \027[32;40m\($bits, last, rep (floor $x))\$middle\
- ..\(" ", rep ($w - ((floor $x) + 1)))\027[0m
- ")
-
-externally ($w wide $ progress bar) means
- ($ * $w) / $w progress bar
+external:
+ ($x / $w progress bar) means:
+ $x = ($x clamped between 0 and $w)
+ $bits = [" ", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"]
+ $middle = ("" if ($x == $w) else $bits.(1 + (floor ((#$bits) * ($x mod 1)))))
+ return ("
+ \027[32;40m\($bits, last, rep (floor $x))\$middle\(" ", rep ($w - ((floor $x) + 1)))\027[0m
+ ")
+ ($w wide $ progress bar) means (($ * $w) / $w progress bar)
diff --git a/lib/shell/init.nom b/lib/shell/init.nom
index 6a8970e..d58894e 100644
--- a/lib/shell/init.nom
+++ b/lib/shell/init.nom
@@ -1,12 +1,12 @@
#
This file defines some actions for running shell commands.
-
-externally (=sh $cmd) means:
- lua> ("
- local result = io.popen(\$cmd)
- local contents = result:read("*a")
- result:close()
- return contents
- ")
-
-external $(sh> $) = $os.execute
+
+external:
+ (=sh $cmd) means:
+ lua> ("
+ local result = io.popen(\$cmd)
+ local contents = result:read("*a")
+ result:close()
+ return contents
+ ")
+ $(sh> $) = $os.execute
diff --git a/lib/things.nom b/lib/things.nom
index 95f175d..92cb444 100644
--- a/lib/things.nom
+++ b/lib/things.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
A library for simple object oriented programming.
@@ -91,67 +91,70 @@ $METAMETHOD_MAP = {
}
$($ as text like a dict) = ({}'s metatable).__tostring
-externally (a class named $classname with $members $(initialize $)) means:
- $class = {.__type = $classname}
- $class.__index = $class
- $class.class = $class
- $class.__tostring = ($ -> "\($.__type) \($ as text like a dict)")
- $class.__eq = ({}'s metatable).__eq
- $class.__len = ({}'s metatable).__len
- if $members:
- $class.__members = $members
- $class.__newindex =
- for ($its $key = $value):
- if $members.$key:
- rawset $its $key $value
- ..else:
- fail "Cannot set \$key, it's not one of the allowed member fields."
-
- set $class's metatable to {
- .__tostring = ($class -> $class.__type)
- .__call =
- for ($class with $initial_values):
- if ($initial_values == (nil)): return $class
- set $initial_values's metatable to $class
- if $initial_values.set_up:
- $initial_values, set up
- return $initial_values
- }
-
- if $(initialize $):
- initialize $class
- for $stub = $metamethod in $METAMETHOD_MAP:
- if $class.($stub, as lua id):
- $class.$metamethod = $class.($stub, as lua id)
+external:
+ (a class named $classname with $members $(initialize $)) means:
+ $class = {.__type = $classname}
+ $class.__index = $class
+ $class.class = $class
+ $class.__tostring = ($ -> "\($.__type) \($ as text like a dict)")
+ $class.__eq = ({}'s metatable).__eq
+ $class.__len = ({}'s metatable).__len
+ if $members:
+ $class.__members = $members
+ $class.__newindex =
+ for ($its $key = $value):
+ if $members.$key:
+ rawset $its $key $value
+ ..else:
+ fail "Cannot set \$key, it's not one of the allowed member fields."
+
+ set $class's metatable to {
+ .__tostring = ($class -> $class.__type)
+ .__call =
+ for ($class with $initial_values):
+ if ($initial_values == (nil)): return $class
+ set $initial_values's metatable to $class
+ if $initial_values.set_up:
+ $initial_values, set up
+ return $initial_values
+ }
+
+ if $(initialize $):
+ initialize $class
+ for $stub = $metamethod in $METAMETHOD_MAP:
+ if $class.($stub, as lua id):
+ $class.$metamethod = $class.($stub, as lua id)
+
+ return $class
- return $class
-
-[
- a $classname is a thing with $members $class_body
- an $classname is a thing with $members $class_body
-] all compile to:
- $class_id = ($classname.stub, as lua id)
- if $class_body:
- $body_lua = ($class_body as lua)
- $body_lua, remove free vars [$class_id]
- $body_lua, declare locals
+ [
+ a $classname is a thing with $members $class_body
+ an $classname is a thing with $members $class_body
+ ] all compile to:
+ $class_id = ($classname.stub, as lua id)
+ if $class_body:
+ $body_lua = ($class_body as lua)
+ $body_lua, remove free vars [$class_id]
+ $body_lua, declare locals
+
+ $lua =
+ Lua ("
+ \$class_id = a_class_named_1_with(\(quote $classname.stub), \($members as lua)\(
+ (
+ Lua ("
+ , function(\$class_id)
+ local it, its = \$class_id, \$class_id;
+ \$body_lua
+ end
+ ")
+ ) if $class_body else ""
+ ))
+ a_\$class_id = function(initial_values) return \($classname.stub, as lua id)(initial_values or {}) end
+ an_\$class_id, a_\($class_id)_with, an_\($class_id)_with = a_\$class_id, a_\$class_id, a_\$class_id
+ ")
+
+ $lua, add free vars [$class_id, "a_\$class_id", "an_\$class_id"]
+ return $lua
- return
- Lua ("
- \$class_id = a_class_named_1_with(\(quote $classname.stub), \($members as lua)\(
- (
- Lua ("
- , function(\$class_id)
- local it, its = \$class_id, \$class_id;
- \$body_lua
- end
- ")
- ) if $class_body else ""
- ))
- a_\$class_id = function(initial_values) return \($classname.stub, as lua id)(initial_values \
- ..or {}) end
- an_\$class_id, a_\($class_id)_with, an_\($class_id)_with = a_\$class_id, a_\$class_id, a_\$class_id
- ")
-
-[a $classname is a thing $class_body, an $classname is a thing] all parse as
- a $classname is a thing with (nil) $class_body
+ [a $classname is a thing $class_body, an $classname is a thing] all parse as
+ a $classname is a thing with (nil) $class_body
diff --git a/lib/tools/find.nom b/lib/tools/find.nom
index a4db987..db7a2c5 100755
--- a/lib/tools/find.nom
+++ b/lib/tools/find.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This is a tool to find syntax trees matching a pattern. "*" is a wildcard
that will match any subtree, and "**" is a wildcard that will match any
@@ -55,7 +55,7 @@ command line program with $args:
Warning: searching stdin (ctrl-d to abort). To avoid this message, use nomsu -t find -
")
$filenames = ["stdin"]
-
+
for $filename in $filenames:
$file = (read file $filename)
unless $file:
@@ -79,7 +79,11 @@ command line program with $args:
if ($t matches $pattern_tree):
$line_num = ($file, line number at $t.source.start)
$results, add {
- .line = $line_num, .text = "\(blue "\$filename:\$line_num:")\n\(source lines of $t)"
+ .line = $line_num
+ .text = ("
+ \(blue "\$filename:\$line_num:")
+ \(source lines of $t)
+ ")
}
for $sub in $t:
diff --git a/lib/tools/format.nom b/lib/tools/format.nom
index 445f35e..eee1316 100755
--- a/lib/tools/format.nom
+++ b/lib/tools/format.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
Auto-format Nomsu code. Usage:
nomsu -t format [-i] file1 file2...
@@ -19,7 +19,7 @@ command line program with $args:
Warning: reading from stdin (ctrl-d to abort). To avoid this message, use nomsu -t format -
")
$filenames = ["stdin"]
-
+
for $filename in $filenames:
$file = (read file $filename)
unless $file:
diff --git a/lib/tools/parse.nom b/lib/tools/parse.nom
index 63cc247..a7e306e 100755
--- a/lib/tools/parse.nom
+++ b/lib/tools/parse.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
Tool to print out a parse tree of files in an easy-to-read format. Usage:
nomsu tools/parse.nom file1 file2 directory1 ...
@@ -8,7 +8,7 @@ use "commandline"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-externally (print tree $t at indent $indent) means:
+(print tree $t at indent $indent) means:
if $t.type is:
"Action":
say "\($indent)Action (\($t.stub)):"
diff --git a/lib/tools/repl.nom b/lib/tools/repl.nom
index 2c0d3df..63d9e30 100755
--- a/lib/tools/repl.nom
+++ b/lib/tools/repl.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This file defines a Read-Evaluate-Print-Loop (REPL) for Nomsu
@@ -8,12 +8,13 @@ use "commandline"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-externally (help) means:
- say ("
- This is the Nomsu v\(Nomsu version) interactive console.
- You can type in Nomsu code here and hit 'enter' twice to run it.
- To exit, type 'exit' or 'quit' and hit enter twice.
- ")
+external:
+ (help) means:
+ say ("
+ This is the Nomsu v\(Nomsu version) interactive console.
+ You can type in Nomsu code here and hit 'enter' twice to run it.
+ To exit, type 'exit' or 'quit' and hit enter twice.
+ ")
command line program with $args:
say ("
@@ -23,7 +24,7 @@ command line program with $args:
press 'enter' twice to run a command
")
-
+
repeat:
say (bright (yellow ">> ")) inline
$buff = []
@@ -38,9 +39,7 @@ command line program with $args:
go to (run buffer)
$buff, add ($line, with "\t" -> " ")
say (dim (yellow ".. ")) inline
-
--- (run buffer) ---
-
if ((size of $buff) == 0): stop
$buff = ($buff, joined)
spoof file $buff
diff --git a/lib/tools/replace.nom b/lib/tools/replace.nom
index efc4d09..d9926cf 100755
--- a/lib/tools/replace.nom
+++ b/lib/tools/replace.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
This is a tool to replace syntax trees with something new.
@@ -34,10 +34,10 @@ command line program with $args:
if $args.literal:
for $var in ($args.literal, all matches of "$([^ ]*)"):
$literal_vars.$var = (yes)
-
+
if (($pattern_tree.type == "Var") and (not $literal_vars.($pattern_tree.1))):
fail "Pattern matches every part of the file."
-
+
$pattern_vars = {
: for $ in recursive $pattern_tree:
if (($.type == "Var") and (not $literal_vars.($.1))): add $.1
@@ -45,7 +45,7 @@ command line program with $args:
if ($child is a "Syntax Tree"):
recurse $ on $child
}
-
+
# TODO: support wildcards and unpacking
e.g. nomsu -t replace "test(: $test; *$more_tests)" "*$more_tests; *$test"
($tree matches $patt with $substitution_values) means:
@@ -85,7 +85,7 @@ command line program with $args:
Warning: searching stdin (ctrl-d to abort). To avoid this message, use nomsu -t find -
")
$filenames = ["stdin"]
-
+
for $filename in $filenames:
$file = (read file $filename)
unless $file:
@@ -95,7 +95,8 @@ command line program with $args:
$tree = ($code parsed)
..if it fails with $msg:
if $args.q:
- unless $args.i: say $code
+ unless $args.i:
+ say $code
..else:
say $msg
@@ -124,13 +125,10 @@ command line program with $args:
..\(reset color)
")
say "\(bright)..be replaced with:"
-
say ("
\(bright)\(blue)\("\($ret as nomsu)", with "\n" -> "\n ")\(reset color)
")
-
$user_answers.$t = (ask "\(bright)..? [Y/n]\(reset color) ")
-
if ($user_answers.$t == "n"): return (nil)
$replaced.$t = (yes)
return $ret
diff --git a/lib/tools/test.nom b/lib/tools/test.nom
index 4663bd4..761ec55 100755
--- a/lib/tools/test.nom
+++ b/lib/tools/test.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
Tool to run all tests in a file (i.e. the code block inside a call to 'test $'). Usage:
nomsu tools/test.nom file1 file2 directory1 ...
@@ -14,7 +14,6 @@ command line program with $args:
$file = (read file $filename)
unless $file:
fail "Couldn't find \$filename"
-
$(test environment) = (new environment)
$(test environment), export $filename
$version =
@@ -24,7 +23,7 @@ command line program with $args:
]*)
")
$file_tests = []
- for $src = $test in $(test environment).TESTS:
+ for $src = $test in (nomsu environment, Module $filename).TESTS:
if $version:
$test = ("
#!/usr/bin/env nomsu -V\$version
@@ -36,20 +35,22 @@ command line program with $args:
sort $file_tests by $ -> $.source
say "[ .. ] \$filename" inline
$io.flush()
-
if $args.v: say ""
-
$failures = []
for $ in $file_tests:
if $args.v:
say " \(yellow ($.test, with "\n" -> "\n "))"
+
try:
$(test environment), run $.test
..if it fails with $msg:
$src = ($Source, from string $.source)
$l1 = ($file, line number at $src.start)
$l2 = ($file, line number at $src.stop)
- $failures, add "\(yellow "\($src.filename):\($l1)-\$l2:")\n\(bright (red ($msg, indented)))"
+ $failures, add ("
+ \(yellow "\($src.filename):\($l1)-\$l2:")
+ \(bright (red ($msg, indented)))
+ ")
if ($failures is empty):
if $args.v:
@@ -62,4 +63,3 @@ command line program with $args:
..else:
say "\r[\(red (bright "FAIL"))"
say "\($failures, joined with "\n", indented)"
-
diff --git a/lib/tools/upgrade.nom b/lib/tools/upgrade.nom
index 2c63411..30b6cab 100755
--- a/lib/tools/upgrade.nom
+++ b/lib/tools/upgrade.nom
@@ -1,4 +1,4 @@
-#!/usr/bin/env nomsu -V6.14
+#!/usr/bin/env nomsu -V6.15.13.8
#
Tool to automatically update code from old versions of Nomsu. Usage:
nomsu tools/upgrade.nom [-i] file1 file2 directory1 ...