aboutsummaryrefslogtreecommitdiff
path: root/lib/object.nom
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2019-01-16 16:31:49 -0800
committerBruce Hill <bruce@bruce-hill.com>2019-01-16 16:32:02 -0800
commit8ca7749b5509a40256195563fa52d3ede4bd1a34 (patch)
treea3e597668b6a53048e440d9630b48f3a2efb3926 /lib/object.nom
parent25e1ccc025e27d5ef7f1cc23e82e4836aa5a07f4 (diff)
Better error messaging (using pretty_error in more places)
Diffstat (limited to 'lib/object.nom')
-rw-r--r--lib/object.nom125
1 files changed, 0 insertions, 125 deletions
diff --git a/lib/object.nom b/lib/object.nom
deleted file mode 100644
index 99981a0..0000000
--- a/lib/object.nom
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env nomsu -V6.15.13.8
-#
- This file contains the implementation of an Object-Oriented programming system.
-
-$globals.METAMETHOD_MAP = {
- ."as text" = "__tostring", ."clean up" = "__gc", ."+ 1" = "__add"
- ."- 1" = "__sub", ."* 1" = "__mul", ."/ 1" = "__div", ."-" = "__unm"
- ."// 1" = "__idiv", ."mod 1" = "__mod", ."^ 1" = "__pow", ."& 1" = "__band"
- ."| 1" = "__bor", ."~ 1" = "__bxor", ."~" = "__bnot", ."<< 1" = "__bshl"
- .">> 1" = "__bshr", ."== 1" = "__eq", ."< 1" = "__lt", ."<= 1" = "__le"
- ."set 1 = 2" = "__newindex", .size = "__len", .iterate = "__ipairs"
- ."iterate all" = "__pairs"
-}
-
-test:
- object (Dog):
- (Dog).genus = "Canus"
- my action [set up]:
- $me.barks or= 0
-
- my action [bark, woof]:
- $barks = [: for $ in 1 to $me.barks: add "Bark!"]
- return ($barks, joined with " ")
-
- my action [get pissed off]: $me.barks += 1
- $d = (Dog {.barks = 2})
- assume (type of $d) == "Dog"
- assume ($d is a "Dog")
- assume $d.barks == 2
- assume (($d, bark) == "Bark! Bark!")
- assume (($d, woof) == "Bark! Bark!")
- $d, get pissed off
- assume ($d.barks == 3)
- assume (($d, bark) == "Bark! Bark! Bark!")
- assume ($d.genus == "Canus")
- assume ("\($d.class)" == "Dog")
- assume ($d.genus == "Canus")
- assume ($d.barks == 3)
- $d2 = (Dog {})
- unless ($d2.barks == 0):
- fail "Default initializer failed"
-
- with [$d = (Dog {.barks = 1})]:
- assume (($d, bark) == "Bark!")
-
- object (Corgi) extends (Dog):
- my action [sploot] "splooted"
- my action [bark, woof]:
- $barks = [: for $ in 1 to $me.barks: add "Yip!"]
- return ($barks, joined with " ")
-
- $corg = (Corgi {})
- assume ($corg.barks == 0)
- with [$d = (Corgi {.barks = 1})]:
- unless (($d, sploot) == "splooted"):
- fail "subclass method failed"
-
- unless (($d, bark) == "Yip!"):
- fail "inheritance failed"
-
- assume (($d, woof) == "Yip!")
-
- with [$d = (Dog {.barks = 2})]:
- assume (($d, bark) == "Bark! Bark!")
-
-(my action $actions $body) compiles to:
- lua> ("
- local fn_name = \$actions[1].stub:as_lua_id()
- local \$args = List(\$actions[1]:get_args())
- table.insert(\$args, 1, \(\$me))
- local lua = LuaCode("class.", fn_name, " = ", \(\($args -> $body) as lua))
- for i=2,#\$actions do
- local alias = \$actions[i]
- local alias_name = alias.stub:as_lua_id()
- local \$alias_args = List(alias:get_args())
- table.insert(\$alias_args, 1, \(\$me))
- lua:add("\\nclass.", alias_name, " = ")
- if \$args == \$alias_args then
- lua:add("class.", fn_name)
- else
- lua:add(\(\($alias_args -> $actions.1) as lua))
- end
- end
- return lua
- ")
-
-(object $classname extends $parent $class_body) compiles to:
- unless ($classname.type == "Action"):
- compile error at $classname
- "Expected this to be an action, not a \$classname.type"
-
- for $ in $classname:
- unless ($ is text):
- compile error at $ "Class names should not have arguments."
-
- return
- Lua ("
- do
- local class = {name=\(quote $classname.stub)}
- class.__type = class.name
- setmetatable(class, {
- __index=\($parent as lua expr),
- __tostring=function(cls) return cls.name end,
- __call=function(cls, inst)
- if inst == nil then return cls end
- inst = setmetatable(inst, cls)
- if inst.set_up then inst:set_up() end
- return inst
- end,
- })
- \(nomsu environment name)[class.name:as_lua_id()] = class
- class.__index = class
- class.class = class
- class.__tostring = function(inst)
- return inst.name..getmetatable(Dict{}).__tostring(inst)
- end
- \($class_body as lua)
- for stub,metamethod in pairs(globals.METAMETHOD_MAP) do
- class[metamethod] = class[stub:as_lua_id()]
- end
- end
- ")
-
-(object $classname $class_body) parses as
- object $classname extends (nil) $class_body