hcl/lang.txt

298 lines
6.4 KiB
Plaintext
Raw Normal View History

2023-12-05 17:30:38 +00:00
## TODO:
can we allow commas between arguments in xlist/mlist to make it more like conventional programming langauges?
2023-12-05 17:30:38 +00:00
make literal frame in the compiler not use object momory. ask VM to take the byte codes and create literal frame using object memory
-> hcl->code.lit.arr must be composed of plain data. not using object memory
-> it must ask VM(locally via a function call, remotely via some communication) to create objects in the object memory
static class -> collect class info(variables information) in the compiler
dyna-class -> compiler doesn't know about classes in advance
for static cleases, super.var-name can be allowed.
for dyna-clases, the super prefix is now allowed for varibles. it's allowed for method calls only.
double-check symbol and dsymbol resolution in set, set-r, defun, defclass to decide how to make it more logical and reasonable
2024-01-05 06:01:59 +00:00
assignment syntax
(k := 20) -> (set k 20)
k := 20 -> (set k 20)
[a, b] := (multi-retvar-fun 10 20) -> (set-r a b (multi-retvar-fun 10 20))
2024-01-05 06:01:59 +00:00
2023-12-05 17:30:38 +00:00
implement module -> ::, ., or what notation?
implement namespace -> ::, ., or what notation?
review the . notation used for C-module loading... may have to change it
2023-12-27 00:09:40 +00:00
dynamic byte array is supported but we need yet to support byte-string(byte-array) constant
b"..." or B"..." for an byte string constant notation
u"..." or U"..." for an explicit unicode string constant notation?
-> change u to c???
2023-12-27 00:09:40 +00:00
#[ ] normal array?
#b[ ] byte array??
#c[ ] charcter array??
#w[ ] word array??
#hw[ ] half-word array??
#u8[ ]
#u16[ ]
#u32[ ]
#u64[ ]
#i8[ ]
#i16[ ]
#i32[ ]
#i64[ ]
2024-01-27 05:26:51 +00:00
allow b'X' or 'X' in byte array in #b[] notation?
signal handling
full oop
2023-12-27 00:09:40 +00:00
make basic branded types to an object if possible.
for example (#[10 20]:at 1)
2023-12-27 00:09:40 +00:00
2024-02-02 05:57:46 +00:00
isn't : for method call confliting with key value spearator in a dictionary?
default return value for some class methods.
::: method -> return what??
2024-02-03 09:50:10 +00:00
:* method -> return the new instance
normal method -> return the last evaluated value?
2023-12-05 17:30:38 +00:00
2022-01-14 16:09:52 +00:00
## dictionary list (DIC)
2023-12-05 17:30:38 +00:00
#{ 1 2 3 4 }
#{ 1: 2, 3: 4}
#{} -> empty dictionary
#{ 1 } -> error, no value. dictionary requires even number of items.
2022-01-14 16:09:52 +00:00
## array list
[ 1 2 3 4]
[ 1, 2, 3, 4 ]
[] -> empty array
## byte array list
#[ 1 2 3 4 ]
#[ 1, 2, 3, 4 ]
each item must be in the byte range.
if a given value is not a number in the allowed range, an exception error is raised.
(try
(set a 20)
#[ 1 2 3 (+ a 300)] ; this throws an catchable exception.
catch(e)
(printf "EXCEPTION - %O\n" e)
)
## non-executable list (QLIST)
#(1 2 3 4)
#(1 2 3 4 . 5)
#() -> same as null
comma not allowed to seperate items.
## varaible declaration list (VLIST)
| a b c |
## class declaration with methods.
(defclass X
2022-01-14 16:09:52 +00:00
| x y | ; instance variables
::: | bob jim | ; class variables
2022-01-14 16:09:52 +00:00
; instance variables and class variables must not collide with those of parent classes.
; they must not collide with method names of parent classes
(set bob "Bob") ; can access class variables. disallowed to access instance variables
(defun setX (a)
(set x a)
)
; instance method. a method name must not collide with instance variable names and class variable names.
; the name can be the same as method names of parent classes.
(defun K (a b)
(self:Y a)
(return (+ a b x y))
)
(defun Y (a)
(printf "Y=>%d [%s]\n" a bob)
)
2022-01-14 16:09:52 +00:00
(defun ::: KK (a b)
(printf "K=>%s\n" bob) ; a class method can access class variables but not instance variables
(return (+ a b))
)
2022-01-14 16:09:52 +00:00
(set jim (lambda (a b) (+ a b))) ; an anonymous function created
2022-01-14 16:09:52 +00:00
)
(set r (object-new X))
(r:Y 10)
(printf ">>%d\n" (X:KK 77 99))
2022-01-14 16:09:52 +00:00
## method invocation
2022-01-14 16:09:52 +00:00
send the message aaa to the receiver
(self:aaa)
2022-01-14 16:09:52 +00:00
send the message aaa to the receiver but let it resolve the method in the superclass side.
(super:aaa)
2022-01-14 16:09:52 +00:00
send the message dump to the object pointed to by x with arguments 1, 2, 3.
(x:dump 1 2 3)
2022-01-14 16:09:52 +00:00
## method types
2022-01-14 16:09:52 +00:00
- class method
2022-03-22 14:45:56 +00:00
- class instantiation method
2022-03-22 14:45:56 +00:00
(defclass P
| x y |
2024-02-03 09:50:10 +00:00
(defun :* new ()
2022-03-22 14:45:56 +00:00
(set x 1)
(set y 1)
(return self)
)
(defun get-x() x)
(defun get-y() y)
)
(defclass X ::: P
| x y |
2024-02-03 09:50:10 +00:00
(defun :* new (a b)
(super:new)
2022-03-22 14:45:56 +00:00
x = a
y = b
(return self)
)
(defun get-xx() x)
(defun get-yy() y)
)
(set t (X:new 10 20)) ;t is an instance of X
(printf "%d %d %d %d\n" (t:get-x) (t:get-y) (t:get-xx) (t:get-yy)) ; must print 1 1 10 20
(t:new 100 300) ;the x, y in the X part get reset to 100 and 300. doesn't create a new instance
(printf "%d %d %d %d\n" (t:get-x) (t:get-y) (t:get-xx) (t:get-yy)) ; must print 1 1 100 300
2022-03-22 14:45:56 +00:00
- instance method
2022-01-14 16:09:52 +00:00
2022-03-22 14:45:56 +00:00
## dynamic dispatching by method name
(defclass X
(defun t1 (x) (printf "t1 = %d\n" (+ x x x)))
(defun t2 (x) (printf "t2 = %d\n" (* x x x)))
)
2022-01-14 16:09:52 +00:00
(defun get-name-1() "t1")
(defun get-name-2() "t2")
(set x (object-new X))
(x:(get-name-1) 100) ; must be same as (x:t1 100)
(x:(get-name-2) 100) ; must be same as (x:t2 100)
## Something to look into..
2022-01-14 16:09:52 +00:00
normal function call
(f arg1 arg2 arg3)
(rcv f arg1 arg2)
## dynamic method invocation???
(X:(f) arg1 arg2)
2022-01-14 16:09:52 +00:00
as long as f returns a symbol, it can also invoke a method??
(defun getX() X) ; ->it must return an object
((getX)->show "hello")
X.Y
push X
push_symbol Y
lookup
(X.Y)
push X
push_symbol Y
lookup
call 0
X.Y.Z
push X
push_symbol Y
lookup
push_symbol Z
lookup
--- if this is within a method, it must become push_instvar
self.x
push self
push symbol x
lookup
fun f(a, b)
{
}
fun f(a, b) -> (c, d)
{
}
class X
{
var x, y, z
var! printer;
printer := Printer.new();
fun! new(a, b)
{
return super.new().init(a, b);
}
fun init(a, b)
{
}
fun show(a, b)
{
Printer.dump(a, b);
}
}
x := X.new(10, 20);
x.show (40, 50);
---------------
variadic arguments -> supported
multiple return variables -> supported
(defun ff(a b ::: x y z)
(set x (+ a b))
(set y (+ x x))
(set z (+ 999 x))
)
(set-r v1 v2 v3 (ff 10 20))
(printf "%d %d %d\n" v1 v2 v3)
variadic multiple return variables -> not supported as of now
(defun ff(a b ::: x y z ...) <--- can i support something like this???
(set x (+ a b))
(set y (+ x x))
(set z (+ 999 x))
)
(set-r v1 v2 v3 (ff 10 20))
(printf "%d %d %d\n" v1 v2 v3)
since va-get is used to get a variadic argument, can i create vr-put
to set a variadic return variable?