nomsu/lib/object.nom
2018-06-18 15:44:35 -07:00

61 lines
2.0 KiB
Plaintext

#
This file contains the implementation of an Object-Oriented programming system.
use "core"
compile [@, me] to: Lua value "self"
compile [set methods %methods] to
%lua <- (Lua "")
for %m in %methods
to %lua write "\nclass.\(%m as lua id) = \(%m as lua id)"
return %lua
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parse [method %actions %body] as
with local %actions
action %actions %body
set methods %actions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parse [as %instance %body] as
result of
%old_self <- (me)
(me) <- %instance
try
%body
..and if it barfs %msg
(me) <- %old_self
barf %msg
..or if it succeeds
(me) <- %old_self
compile [object %classname extends %parent %class_body] to
Lua ".."
do
local class = {name=\(%classname as lua expr)}
setmetatable(class, {
__index=\(%parent as lua expr),
__tostring=function(cls) return cls.name end,
__call=function(cls, inst)
inst = setmetatable(inst or {}, cls)
if cls.A_initialize_1 then
cls.A_initialize_1(inst)
end
return inst
end,
})
_ENV["A"..string.as_lua_id("new "..class.name)] = class
_ENV["A"..string.as_lua_id("new "..class.name.." 1")] = class
_ENV["A"..string.as_lua_id("class "..class.name)] = function() return class end
class.__index = class
class.class = class
\(%class_body as lua statements)
class.__tostring = class["A"..string.as_lua_id("as text")]
end
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
parse [object %classname %class_body] as: object %classname extends (nil) %class_body