nomsu/lib/object.nom
2018-07-18 01:28:17 -07:00

57 lines
2.0 KiB
Plaintext

#!/usr/bin/env nomsu -V2.3.4.3
#
This file contains the implementation of an Object-Oriented programming system.
use "core"
compile [@, me] to (Lua value "self")
compile [method %actions %body] to:
%lua = (compile as (action %actions %body))
add free vars ((% as lua id) for % in %actions) to %lua
declare locals in %lua
for % in %actions:
to %lua write "\nclass.\(% as lua id) = \(% as lua id)"
return (..)
Lua "do -- Method: \(%actions.(1).stub)\n \%lua\nend"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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