298 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			298 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
## TODO:
 | 
						|
	can we allow commas between arguments in xlist/mlist to make it more like conventional programming langauges?
 | 
						|
	make literal frame in the compiler not use  object momory. ask VM to take the byte codes and create literal frame using object memory
 | 
						|
		-> hak->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
 | 
						|
 | 
						|
 | 
						|
	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))
 | 
						|
 | 
						|
	implement module -> ::, ., or what notation?
 | 
						|
	implement namespace -> ::, ., or what notation?
 | 
						|
	review the . notation used for C-module loading... may have to change it
 | 
						|
 | 
						|
	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???
 | 
						|
 | 
						|
		#[ ] normal array?
 | 
						|
		#b[ ] byte array??
 | 
						|
		#c[ ] charcter array??
 | 
						|
		#w[ ] word array??
 | 
						|
		#hw[ ] half-word array??
 | 
						|
		#u8[ ]
 | 
						|
		#u16[ ]
 | 
						|
		#u32[ ]
 | 
						|
		#u64[ ]
 | 
						|
		#i8[ ]
 | 
						|
		#i16[ ]
 | 
						|
		#i32[ ]
 | 
						|
		#i64[ ]
 | 
						|
 | 
						|
	allow b'X' or 'X' in byte array in #b[] notation?
 | 
						|
 | 
						|
	signal handling
 | 
						|
 | 
						|
	full oop
 | 
						|
 | 
						|
	make basic branded types to an object if possible.
 | 
						|
	for example (#[10 20]:at 1)
 | 
						|
 | 
						|
	isn't : for method call  confliting with key value spearator in a dictionary?
 | 
						|
 | 
						|
	default return value for some class methods.
 | 
						|
		:: method -> return what??
 | 
						|
		:* method -> return the new instance
 | 
						|
		normal method -> return the last evaluated value?
 | 
						|
 | 
						|
 | 
						|
## dictionary list (DIC)
 | 
						|
	#{ 1 2 3 4 }
 | 
						|
	#{ 1: 2, 3: 4}
 | 
						|
	#{} -> empty dictionary
 | 
						|
	#{ 1 } -> error, no value.  dictionary requires even number of items.
 | 
						|
 | 
						|
## 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 
 | 
						|
 | 
						|
		| x y |                 ; instance variables 
 | 
						|
		:: | bob jim |             ; class variables
 | 
						|
 | 
						|
		; 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) 
 | 
						|
		)
 | 
						|
 | 
						|
		(defun :: KK (a b)
 | 
						|
			(printf "K=>%s\n" bob) ; a class method can access class variables but not instance variables
 | 
						|
			(return (+ a b))
 | 
						|
		)
 | 
						|
 | 
						|
		(set jim (lambda (a b) (+ a b))) ; an anonymous function created 
 | 
						|
	)
 | 
						|
 | 
						|
	(set r (object-new X))
 | 
						|
	(r:Y 10)
 | 
						|
	(printf ">>%d\n" (X:KK 77 99))
 | 
						|
 | 
						|
 | 
						|
## method invocation
 | 
						|
 | 
						|
send the message aaa to the receiver
 | 
						|
	(self:aaa)
 | 
						|
 | 
						|
send the message aaa to the receiver but let it resolve the method in the superclass side.
 | 
						|
	(super:aaa)
 | 
						|
 | 
						|
send the message dump to the object pointed to by x with arguments 1, 2, 3.
 | 
						|
	(x:dump 1 2 3)
 | 
						|
 | 
						|
## method types
 | 
						|
 | 
						|
- class method
 | 
						|
 | 
						|
 | 
						|
- class instantiation method
 | 
						|
 | 
						|
	(defclass P
 | 
						|
		| x y |
 | 
						|
		(defun :* new ()
 | 
						|
			(set x 1)	
 | 
						|
			(set y 1)	
 | 
						|
			(return self)
 | 
						|
		)
 | 
						|
		(defun get-x() x)
 | 
						|
		(defun get-y() y)
 | 
						|
	)
 | 
						|
	(defclass X :: P
 | 
						|
		| x y |
 | 
						|
		(defun :* new (a b)
 | 
						|
			(super:new)
 | 
						|
			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
 | 
						|
 | 
						|
- instance method
 | 
						|
 | 
						|
 | 
						|
 | 
						|
## 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)))
 | 
						|
	)
 | 
						|
 | 
						|
	(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..
 | 
						|
 | 
						|
normal function call
 | 
						|
(f arg1 arg2 arg3)
 | 
						|
(rcv f arg1 arg2)
 | 
						|
 | 
						|
## dynamic method invocation???
 | 
						|
(X:(f) arg1 arg2)
 | 
						|
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?
 |