# 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