aboutsummaryrefslogtreecommitdiff
path: root/lib/object.nom
blob: 45f7551dd53951b9cc0652c819f0c9a6ee8c4b2a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env nomsu -V1
#
    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)
                \%lua
            end

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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