aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-01-15 18:10:56 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-01-15 18:10:56 -0800
commit4e712fd8d360f39fdb97c7bbd589d676ebd3310a (patch)
tree9290e6a7be6aa92956e6729418c32f6c9af60948 /lib
parente6d53864f71b53e150e1f914ff783d0c374d9f5a (diff)
Updated things API for inheritance.
Diffstat (limited to 'lib')
-rw-r--r--lib/things.nom62
1 files changed, 30 insertions, 32 deletions
diff --git a/lib/things.nom b/lib/things.nom
index 92cb444..7113325 100644
--- a/lib/things.nom
+++ b/lib/things.nom
@@ -12,7 +12,7 @@ test:
$barks = [: for $ in 1 to $its.barks: add "Bark!"]
return ($barks, joined with " ")
- ($it, gets pissed off) means: $it.barks += 1
+ ($its, get pissed off) means: $its.barks += 1
(Dog).genus = "Canus"
$d = (a Dog with {.barks = 2})
assume "\$d" == "Dog {barks: 2}"
@@ -21,7 +21,7 @@ test:
assume $d.barks == 2
assume (($d, bark) == "Bark! Bark!")
assume (($d, woof) == "Bark! Bark!")
- $d, gets pissed off
+ $d, get pissed off
assume ($d.barks == 3)
assume (($d, bark) == "Bark! Bark! Bark!")
assume ($d.genus == "Canus")
@@ -35,8 +35,7 @@ test:
with [$d = (a Dog with {.barks = 1})]:
assume (($d, bark) == "Bark!")
- a (Corgi) is a thing:
- $it can [set up, gets pissed off] like a (Dog)
+ a (Corgi) is a (Dog):
($it, as text) means "Dogloaf \{: for $k = $v in $it: add $k = $v}"
($its, sploot) means "sploooot"
[($its, bark), ($its, woof)] all mean:
@@ -67,20 +66,6 @@ test:
assume
((Vec {.x = 1, .y = 2}) + (Vec {.x = 10, .y = 10})) != (Vec {.x = 0, .y = 0})
-[
- $it can $actions like a $class, $it can $actions like an $class
- $it has $actions like a $class, $it has $actions like an $class
- $it $actions like a $class, $it $actions like an $class
-] all compile to:
- $lua = (Lua "")
- $class_expr = ($class as lua expr)
- $lines = []
- for $a in $actions:
- $lines,
- add "\($it as lua expr).\($a.stub, as lua id) = \$class_expr.\($a.stub, as lua id)"
- $lua, add $lines joined with "\n"
- return $lua
-
$METAMETHOD_MAP = {
."as text" = "__tostring", ."clean up" = "__gc", ."+" = "__add", ."-" = "__sub"
."*" = "__mul", ."/" = "__div", .negative = "__unm", ."//" = "__idiv"
@@ -92,7 +77,10 @@ $METAMETHOD_MAP = {
$($ as text like a dict) = ({}'s metatable).__tostring
external:
- (a class named $classname with $members $(initialize $)) means:
+ [
+ a $parent class named $classname with $members $(initialize $)
+ an $parent class named $classname with $members $(initialize $)
+ ] all mean:
$class = {.__type = $classname}
$class.__index = $class
$class.class = $class
@@ -109,6 +97,7 @@ external:
fail "Cannot set \$key, it's not one of the allowed member fields."
set $class's metatable to {
+ .__index = $parent
.__tostring = ($class -> $class.__type)
.__call =
for ($class with $initial_values):
@@ -128,33 +117,42 @@ external:
return $class
[
- a $classname is a thing with $members $class_body
- an $classname is a thing with $members $class_body
+ a $classname is a $parent with $members $class_body
+ an $classname is a $parent with $members $class_body
+ a $classname is an $parent with $members $class_body
+ an $classname is an $parent 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)\(
+ \$class_id = a_1_class_named_2_with(\($parent as lua), \(quote $classname.stub), \($members as lua)\(
(
Lua ("
, function(\$class_id)
local it, its = \$class_id, \$class_id;
- \$body_lua
+ \($class_body as lua)
end
")
) if $class_body else ""
))
- a_\$class_id = function(initial_values) return \($classname.stub, as lua id)(initial_values or {}) end
+ a_\$class_id = function(initial_values) return \$class_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
-
- [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 with $members $class_body
+ an $classname is a thing with $members $class_body
+ a $classname is an thing with $members $class_body
+ an $classname is an thing with $members $class_body
+ ] all parse as (a $classname is a (nil) with $members $class_body)
+
+ [a $classname is a thing $class_body, an $classname is a thing $class_body]
+ ..all parse as (a $classname is a (nil) with (nil) $class_body)
+
+ [
+ a $classname is a $parent $class_body, an $classname is a $parent $class_body
+ a $classname is an $parent $class_body, an $classname is an $parent $class_body
+ ] all parse as (a $classname is a $parent with (nil) $class_body)