| 
									
										
										
										
											2023-12-06 02:30:38 +09:00
										 |  |  | ## TODO: | 
					
						
							| 
									
										
										
										
											2023-12-06 11:09:15 +09:00
										 |  |  | 	can we allow commas between arguments in xlist/mlist to make it more like conventional programming langauges? | 
					
						
							| 
									
										
										
										
											2023-12-06 02:30:38 +09: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 | 
					
						
							| 
									
										
										
										
											2025-09-02 23:58:15 +09:00
										 |  |  | 		-> hak->code.lit.arr must be composed of plain data. not using object memory | 
					
						
							| 
									
										
										
										
											2023-12-06 02:30:38 +09:00
										 |  |  | 		-> 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-02 01:41:41 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-05 15:01:59 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	assignment syntax | 
					
						
							|  |  |  | 		(k := 20) -> (set k 20) | 
					
						
							| 
									
										
										
										
											2024-01-28 00:03:40 +09:00
										 |  |  | 		k := 20  -> (set k 20) | 
					
						
							| 
									
										
										
										
											2024-01-19 13:25:23 +09:00
										 |  |  | 		[a, b] := (multi-retvar-fun 10 20) -> (set-r a b (multi-retvar-fun 10 20)) | 
					
						
							| 
									
										
										
										
											2024-01-05 15:01:59 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-06 02:30:38 +09: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 09:09:40 +09: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? | 
					
						
							| 
									
										
										
										
											2024-01-28 00:03:40 +09:00
										 |  |  | 		-> change u to c??? | 
					
						
							| 
									
										
										
										
											2023-12-27 09:09:40 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-24 16:26:30 +09:00
										 |  |  | 		#[ ] normal array? | 
					
						
							| 
									
										
										
										
											2024-01-28 00:03:40 +09:00
										 |  |  | 		#b[ ] byte array?? | 
					
						
							|  |  |  | 		#c[ ] charcter array?? | 
					
						
							|  |  |  | 		#w[ ] word array?? | 
					
						
							|  |  |  | 		#hw[ ] half-word array?? | 
					
						
							|  |  |  | 		#u8[ ] | 
					
						
							|  |  |  | 		#u16[ ] | 
					
						
							|  |  |  | 		#u32[ ] | 
					
						
							|  |  |  | 		#u64[ ] | 
					
						
							|  |  |  | 		#i8[ ] | 
					
						
							|  |  |  | 		#i16[ ] | 
					
						
							|  |  |  | 		#i32[ ] | 
					
						
							|  |  |  | 		#i64[ ] | 
					
						
							| 
									
										
										
										
											2024-01-24 16:26:30 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-27 14:26:51 +09:00
										 |  |  | 	allow b'X' or 'X' in byte array in #b[] notation? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	signal handling | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	full oop | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 09:09:40 +09:00
										 |  |  | 	make basic branded types to an object if possible. | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	for example (#[10 20]:at 1) | 
					
						
							| 
									
										
										
										
											2023-12-27 09:09:40 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-02 14:57:46 +09:00
										 |  |  | 	isn't : for method call  confliting with key value spearator in a dictionary? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-02 13:59:03 +09:00
										 |  |  | 	default return value for some class methods. | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  | 		:: method -> return what?? | 
					
						
							| 
									
										
										
										
											2024-02-03 18:50:10 +09:00
										 |  |  | 		:* method -> return the new instance | 
					
						
							| 
									
										
										
										
											2024-01-02 13:59:03 +09:00
										 |  |  | 		normal method -> return the last evaluated value? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-06 02:30:38 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | ## dictionary list (DIC) | 
					
						
							| 
									
										
										
										
											2023-12-06 02:30:38 +09: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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 	(defclass X  | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 		| x y |                 ; instance variables  | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  | 		:: | bob jim |             ; class variables | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +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) | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 			(self:Y a) | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 			(return (+ a b x y)) | 
					
						
							|  |  |  | 		) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 		(defun Y (a) | 
					
						
							|  |  |  | 			(printf "Y=>%d [%s]\n" a bob)  | 
					
						
							|  |  |  | 		) | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  | 		(defun :: KK (a b) | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 			(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 		(set jim (lambda (a b) (+ a b))) ; an anonymous function created  | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 	(set r (object-new X)) | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(r:Y 10) | 
					
						
							|  |  |  | 	(printf ">>%d\n" (X:KK 77 99)) | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | ## method invocation | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | send the message aaa to the receiver | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(self:aaa) | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | send the message aaa to the receiver but let it resolve the method in the superclass side. | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(super:aaa) | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | send the message dump to the object pointed to by x with arguments 1, 2, 3. | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(x:dump 1 2 3) | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | ## method types | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | - class method | 
					
						
							| 
									
										
										
										
											2022-03-22 14:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | - class instantiation method | 
					
						
							| 
									
										
										
										
											2022-03-22 14:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	(defclass P | 
					
						
							|  |  |  | 		| x y | | 
					
						
							| 
									
										
										
										
											2024-02-03 18:50:10 +09: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) | 
					
						
							|  |  |  | 	) | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  | 	(defclass X :: P | 
					
						
							| 
									
										
										
										
											2022-03-22 14:45:56 +00:00
										 |  |  | 		| x y | | 
					
						
							| 
									
										
										
										
											2024-02-03 18:50:10 +09:00
										 |  |  | 		(defun :* new (a b) | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 			(super:new) | 
					
						
							| 
									
										
										
										
											2022-03-22 14:45:56 +00:00
										 |  |  | 			x = a | 
					
						
							|  |  |  | 			y = b | 
					
						
							|  |  |  | 			(return self) | 
					
						
							|  |  |  | 		) | 
					
						
							|  |  |  | 		(defun get-xx() x) | 
					
						
							|  |  |  | 		(defun get-yy() y) | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | - instance method | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 14:45:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 	(defun get-name-1() "t1") | 
					
						
							|  |  |  | 	(defun get-name-2() "t2") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	(set x (object-new X)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | 	(x:(get-name-1) 100) ; must be same as (x:t1 100) | 
					
						
							|  |  |  | 	(x:(get-name-2) 100) ; must be same as (x:t2 100) | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## Something to look into.. | 
					
						
							| 
									
										
										
										
											2022-01-14 16:09:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | normal function call | 
					
						
							|  |  |  | (f arg1 arg2 arg3) | 
					
						
							|  |  |  | (rcv f arg1 arg2) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-27 19:35:47 +00:00
										 |  |  | ## dynamic method invocation??? | 
					
						
							| 
									
										
										
										
											2024-01-02 01:41:41 +09:00
										 |  |  | (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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --------------- | 
					
						
							| 
									
										
										
										
											2022-07-31 11:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | variadic arguments -> supported | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | multiple return variables -> supported | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  |         (defun ff(a b :: x y z) | 
					
						
							| 
									
										
										
										
											2022-07-31 11:29:58 +00:00
										 |  |  |                 (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 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2024-02-04 01:57:53 +09:00
										 |  |  |         (defun ff(a b :: x y z ...) <--- can i support something like this??? | 
					
						
							| 
									
										
										
										
											2022-07-31 11:29:58 +00:00
										 |  |  |                 (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? |