aboutsummaryrefslogtreecommitdiff
path: root/lib/object.nom
blob: d41557b3935330cea4dde55fa719e280b64eef83 (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 -V2.2.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)
                \%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