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 |