156 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| fun aaa(a b) {
 | |
| 	| c |
 | |
| 	set c (+ a b);
 | |
| 	return c;
 | |
| };
 | |
| 
 | |
| set k (aaa 10 20);
 | |
| 
 | |
| if (== k 30) {
 | |
| 	printf "OK - %d\n" k;
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" k;
 | |
| };
 | |
| 
 | |
| ## --------------------------------------
 | |
| 
 | |
| fun mkfun(t) {
 | |
| 	return (fun(c) {
 | |
| 		return (+ t c);
 | |
| 	});
 | |
| }
 | |
| 
 | |
| fun mkfun2(t) {
 | |
| 	return {fun(c) {
 | |
| 		return (fun(d) {
 | |
| 			return (+ d c t)
 | |
| 		})
 | |
| 	}}
 | |
| }
 | |
| 
 | |
| f := (mkfun 20);
 | |
| set k (f 50);
 | |
| if (== k 70) {
 | |
| 	printf "OK - %d\n" k;
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" k;
 | |
| };
 | |
| 
 | |
| k := {
 | |
| 	(mkfun 20) 30
 | |
| }
 | |
| if (== k 50) {
 | |
| 	printf "OK - %d\n" k
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" k
 | |
| };
 | |
| 
 | |
| k := {
 | |
| 	(mkfun 20) 30 ## the return value of this expression is ignored
 | |
| 	(mkfun 20) 40 ## the return value of this expression is the return value of the block expression
 | |
| }
 | |
| if (== k 60) {
 | |
| 	printf "OK - %d\n" k
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" k
 | |
| };
 | |
| 
 | |
| k := (((mkfun2 10) 40) 30)
 | |
| if (== k 80) {
 | |
| 	printf "OK - %d\n" k
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" k
 | |
| };
 | |
| ## --------------------------------------
 | |
| 
 | |
| ## multiple return values
 | |
| fun f(a :: b c) { b := (+ a 10); c := (+ a 20) }
 | |
| [x, y] := (f 9)
 | |
| if (== x 19) {
 | |
| 	printf "OK - %d\n" x
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" x
 | |
| }
 | |
| if (== y 29) {
 | |
| 	printf "OK - %d\n" y
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" y
 | |
| }
 | |
| 
 | |
| ## --------------------------------------
 | |
| k := (fun qq(t) (+ t 20))
 | |
| x := (k 8)
 | |
| y := (qq 9)
 | |
| 
 | |
| if (== x 28) {
 | |
| 	printf "OK - %d\n" x
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" x
 | |
| }
 | |
| 
 | |
| if (== y 29) {
 | |
| 	printf "OK - %d\n" x
 | |
| } else {
 | |
| 	printf "ERROR - %d\n" x
 | |
| }
 | |
| 
 | |
| ## --------------------------------------
 | |
| 
 | |
| class A {
 | |
| 	var a b c
 | |
| 	fun[#ci] newInstance(x y z) {
 | |
| 		set a x
 | |
| 		set b y
 | |
| 		set c z
 | |
| 		return self
 | |
| 	};
 | |
| 
 | |
| 	fun get-a() { return a; };
 | |
| 	##fun get-b() b;
 | |
| 	##fun get-c() c;
 | |
| };
 | |
| 
 | |
| k := (A:newInstance 11 22 33);
 | |
| ##set k (A:newInstance 11 22 33);
 | |
| 
 | |
| set v (k:get-a);
 | |
| if (== v 11) { printf "OK - %d\n" v; } else { printf "ERROR - %d, ot 11\n" v; };
 | |
| 
 | |
| ## --------------------------------------
 | |
| 
 | |
| k := (fun (x) { + x 20 }) ## (+ x 20) would be syntax error, must be { + x 20 }
 | |
| v := (k 10)
 | |
| if (== v 30) { printf "OK - %d\n" v } else { printf "ERROR - %d, not 30\n" v };
 | |
| 
 | |
| ## --------------------------------------
 | |
| fun k(x) (+ x 30)  ## (+ x 30) is valid function body
 | |
| v := (k 10)
 | |
| if (== v 40) { printf "OK - %d\n" v } else { printf "ERROR - %d, not 40\n" v };
 | |
| 
 | |
| 
 | |
| ## ----------------------------------------
 | |
| fun plus(x y) {
 | |
|      ##printf "plus %d %d\n" x y
 | |
|      fun minus(x y) {
 | |
|           ##printf "minus %d %d\n" x y
 | |
|           - x y
 | |
|      }
 | |
|      + x y
 | |
| }
 | |
| 
 | |
| fun dummy(q) {
 | |
|      printf "%s\n" q
 | |
| }
 | |
| 
 | |
| plus 10 20 ## minus is now available after plus is executed
 | |
| v := (minus 10 1)
 | |
| if (== v 9) { printf "OK - %d\n" v } else { printf "ERROR - %d, not 9\n" v }
 | |
| 
 | |
| 
 | |
| ## ----------------------------------------
 | |
| fun sum (x) {
 | |
| 	if (core.< x 2) 1 else { core.+ x (sum (core.- x 1)) }
 | |
| }
 | |
| v := (sum 10)
 | |
| if (== v 55) { printf "OK - %d\n" v } else { printf "ERROR - %d, not 55\n" v }
 |