-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoop.luaisp
More file actions
75 lines (51 loc) · 1.28 KB
/
oop.luaisp
File metadata and controls
75 lines (51 loc) · 1.28 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(setl class (metafun (lambda (environ rest)
(set rval (newtable))
(set methods (cdr rest))
(set nilenv (newenv environ))
(set exec-list (lambda (f l)
(if l
(cons (f (car l)) (exec-list f (cdr l)))
nil
)
))
(set dtr (lambda (val)
(print (display val))
val
))
(while methods
(do
(if (eqv (car (car methods)) 'method)
(do
(:= rval (car (car (cdr (car methods))))
(metacall lambda environ
(cons (cons 'self (cdr (car (cdr (car methods))))) (cdr (cdr (car methods))) )
)
)
)
(if (eqv (car (car methods)) 'superclass)
(set rval.__superclass__ (exec-list (lambda (expr) (exec-environ expr nilenv)) (cdr (car methods)) ))
(error "Only methods are allowed in class body")
)
)
(set methods (cdr methods))
)
)
(:= environ (idstring (car rest)) rval)
)) )
(setl instance
(lambda (cl)
(set rval (newtable))
(set rvalmeta (newtable))
(setmetatable rval rvalmeta)
(if (not (eq cl.__superclass__ nil))
(do
(set souper (apply instance cl.__superclass__))
(set rvalmeta.__index (lambda (t i) (if (eq (: cl i) nil) (: souper i) (: cl i))))
)
(set rvalmeta.__index cl)
)
(if cl.__init__ (apply cl.__init__ (cons rval #)))
rval
)
)
nil