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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123 
extern Fn malloc int -> void'
extern Fn free void' -> void
extern Fn realloc void' uint -> void'
extern Fn calloc uint uint -> void'
extern Fn recalloc void' uint uint -> void'

extern Fn puts str -> int
;extern Fn itoa int str int -> str

fn fac2 n:int -> int = if(n <= 1) 1 fi fac n-1 * n
fn f = 0
fn fff = f
fn fac n:int -> int = if((fff()()); n <= 1) ret 1 fi ret fac2 n-1 * n
fn caf n:int -> int = if(-1 <= n) ret 1 fi ret caf n+1 * n
fn get-fac b:bool = if(b) ret fac fi ret caf ;-> Fn int -> int

; fn main = argc:int argv:str'

rec vec
	x: float
	y: float
fn main argc:int argv:str'
	v: vec
	aa: char'30
	a: char'
	a = &(aa'(f()))
	a = aa
	b := 5
	bb := "hello"
	c := a'13
	d := bb'
	e := "f"'
	argc = 6
	aa'0 = "h"'0
	aa'1 = bb'1
	aa'2 = "\0"'
	g := 3.0e-50
	if(1 < 2 and 2 > 3) puts aa
	fi puts bb
	itoa -((get-fac true) 14) a 12 10
	puts a
	; puts (itoa 42 a -10)

	puts argv'0
	b = 3
	itoa b a 30 10
	puts a
	b+ = 5
	itoa b a 30 10
	puts a
	;a2: int = 1

	;p: char'

	p := malloc 1024
	free p

fn itoa value:int result:str size:int base:int -> bool =
	; check that the base if valid

	if base < 2 or base > 36
		result' = "\0"'
		ret false
	ptr := result
	neg := value < 0
	if(neg) value = -value
	while
		if ptr >= result + size - 1
			result' = "\0"'
			ret false
		ptr' = "0123456789abcdefghijklmnopqrstuvwxyz" ' value%base
		value = value / base
		ptr+
		value != 0
	if neg and base == 10
		if ptr >= result + size - 1
			result' = "\0"'
			ret false
		ptr' = "-"'
		ptr+
	ptr' = "\0"'
	ptr-
	ptr1 := result
	while ptr1 < ptr
		tmp-char := ptr'
		ptr' = ptr1'
		ptr1' = tmp-char
		ptr1+
		ptr-
	true

; fn fft data:double' nn:uint

; 	; reverse-binary reindexing

; 	n := ulong nn<1

; 	for (i,j) := (1,1); i < n; i =+ 2

; 		if j > i

; 			swap data'(j - 1) data'(i - 1)

; 			swap data'j data'i

; 		m := nn

; 		while m >= 2 and j > m

; 			j =- m

; 			m =>> 1

; 		j =+ m

; 	; here begins the Danielson-Lanczos section

; 	mx := 2

; 	while n > mx

; 		istep := mx << 1

; 		theta := -2 * PI / mx

; 		wtemp := sin 0.5*theta

; 		wpr := -2.0 * wtemp^2

; 		wpi := sin theta

; 		wr := 1.0

; 		wi := 0

; 		for m := 1; m < mx; m =+ 2

; 			for i := m; i <= n; i =+ istep

; 				j := i + mx

; 				tempr := wr * data'(j-1) - wi * data'j

; 				tempi := wr * data'j + wi * data'(j-1)

; 				data'(j-1) = data'(i-1) - tempr

; 				data'j = data'i - tempi

; 				data'(i-1) =+ tempr

; 				data'i =+ tempi

; 			wtemp = wr

; 			wr =+ wr * wpr - wr * wpi

; 			wi =+ wi * wpr + wtemp * wpi

; 		mx = istep

; [T] fn swap mod a:T mod b:T

; 	tmp := a

; 	a = b

; 	b = tmp