arrays
This commit is contained in:
10
examples/arrays.zr
Normal file
10
examples/arrays.zr
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
func main[] : I64
|
||||||
|
let xs: Array = Array.new()
|
||||||
|
Array.push(xs, 5242)
|
||||||
|
Array.push(xs, 6533)
|
||||||
|
Array.push(xs, 4574)
|
||||||
|
|
||||||
|
for i in 0:Array.size(xs)
|
||||||
|
xs
|
||||||
|
|> Array.nth(i)
|
||||||
|
|> print_i64()
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
func num_divisors[n: I64] : I64
|
func num_divisors[n: I64] : I64
|
||||||
let end: I64 = isqrt(n)
|
let end: I64 = Math.isqrt(n)
|
||||||
|
|
||||||
let result: I64 = 0
|
let result: I64 = 0
|
||||||
for i in 1:end+1
|
for i in 1:end+1
|
||||||
@@ -13,7 +13,7 @@ func num_divisors[n: I64] : I64
|
|||||||
func main[] : I64
|
func main[] : I64
|
||||||
let n: I64 = 0
|
let n: I64 = 0
|
||||||
let i: I64 = 1
|
let i: I64 = 1
|
||||||
while 1
|
while true
|
||||||
n = n + i
|
n = n + i
|
||||||
if num_divisors(n) > 500
|
if num_divisors(n) > 500
|
||||||
print_i64(n)
|
print_i64(n)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ func main[] : I64
|
|||||||
let found: I64 = 0
|
let found: I64 = 0
|
||||||
|
|
||||||
let i: I64 = 1
|
let i: I64 = 1
|
||||||
while 1
|
while true
|
||||||
if Math.is_prime(i)
|
if Math.is_prime(i)
|
||||||
found = found + 1
|
found = found + 1
|
||||||
if found == 10001
|
if found == 10001
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ func main[] : I64
|
|||||||
let s: I64 = 1
|
let s: I64 = 1
|
||||||
let j: I64 = 0
|
let j: I64 = 0
|
||||||
while j < 13
|
while j < 13
|
||||||
s = s * Char.to_i64(nth(n, i + j))
|
s = s * Char.to_i64(String.nth(n, i + j))
|
||||||
j = j + 1
|
j = j + 1
|
||||||
if s > out
|
if s > out
|
||||||
out = s
|
out = s
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ macro_rules! emit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static REGISTERS: [&str; 6] = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"];
|
static REGISTERS: [&str; 6] = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"];
|
||||||
static TYPES: [&str; 5] = ["I64", "String", "Bool", "Ptr", "Char"];
|
static TYPES: [&str; 6] = ["I64", "String", "Bool", "Ptr", "Char", "Array"];
|
||||||
|
|
||||||
pub struct CodegenX86_64 {
|
pub struct CodegenX86_64 {
|
||||||
output: String,
|
output: String,
|
||||||
@@ -97,6 +97,8 @@ impl CodegenX86_64 {
|
|||||||
"
|
"
|
||||||
section .text
|
section .text
|
||||||
extern malloc
|
extern malloc
|
||||||
|
extern calloc
|
||||||
|
extern realloc
|
||||||
extern free
|
extern free
|
||||||
extern printf
|
extern printf
|
||||||
extern sprintf
|
extern sprintf
|
||||||
@@ -117,11 +119,11 @@ extern exit
|
|||||||
extern gettimeofday
|
extern gettimeofday
|
||||||
copystr equ strdup
|
copystr equ strdup
|
||||||
|
|
||||||
nth:
|
String.nth:
|
||||||
movzx rax, byte [rdi + rsi]
|
movzx rax, byte [rdi + rsi]
|
||||||
ret
|
ret
|
||||||
|
|
||||||
set:
|
String.set:
|
||||||
mov [rdi + rsi], dl
|
mov [rdi + rsi], dl
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@@ -142,7 +144,58 @@ time:
|
|||||||
pop rbx
|
pop rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
isqrt:
|
Array.new:
|
||||||
|
mov rdi, 1
|
||||||
|
mov rsi, 24
|
||||||
|
jmp calloc
|
||||||
|
|
||||||
|
Array.nth:
|
||||||
|
mov rax, [rdi]
|
||||||
|
mov rax, [rax + rsi*8]
|
||||||
|
ret
|
||||||
|
|
||||||
|
Array.push:
|
||||||
|
push r14
|
||||||
|
push rbx
|
||||||
|
push rax
|
||||||
|
mov r14, rsi
|
||||||
|
mov rbx, rdi
|
||||||
|
mov rax, [rdi]
|
||||||
|
mov rcx, [rdi + 16]
|
||||||
|
cmp rcx, [rdi + 8]
|
||||||
|
jne .no_realloc
|
||||||
|
lea rdx, [rcx + rcx]
|
||||||
|
mov rsi, 4
|
||||||
|
test rcx, rcx
|
||||||
|
cmovnz rsi, rdx
|
||||||
|
mov [rbx + 8], rsi
|
||||||
|
shl rsi, 3
|
||||||
|
mov rdi, rax
|
||||||
|
call realloc
|
||||||
|
mov [rbx], rax
|
||||||
|
mov rcx, [rbx + 16]
|
||||||
|
.no_realloc:
|
||||||
|
mov [rax + rcx*8], r14
|
||||||
|
inc qword [rbx + 16]
|
||||||
|
add rsp, 8
|
||||||
|
pop rbx
|
||||||
|
pop r14
|
||||||
|
ret
|
||||||
|
|
||||||
|
Array.size:
|
||||||
|
mov rax, [rdi + 16]
|
||||||
|
ret
|
||||||
|
|
||||||
|
Array.free:
|
||||||
|
push rbx
|
||||||
|
mov rbx, rdi
|
||||||
|
mov rdi, [rdi]
|
||||||
|
call free
|
||||||
|
mov rdi, rbx
|
||||||
|
pop rbx
|
||||||
|
jmp free
|
||||||
|
|
||||||
|
Math.isqrt:
|
||||||
xor rax, rax
|
xor rax, rax
|
||||||
mov rcx, 1
|
mov rcx, 1
|
||||||
mov rbx, rdi
|
mov rbx, rdi
|
||||||
@@ -400,7 +453,12 @@ isqrt:
|
|||||||
}
|
}
|
||||||
TokenType::String => {
|
TokenType::String => {
|
||||||
// TODO: actual string parsing in the tokenizer
|
// TODO: actual string parsing in the tokenizer
|
||||||
let value = &token.lexeme[1..token.lexeme.len() - 1].replace("\\n", "\n");
|
let value = &token.lexeme[1..token.lexeme.len() - 1]
|
||||||
|
.replace("\\n", "\n")
|
||||||
|
.replace("\\r", "\r")
|
||||||
|
.replace("\\t", "\t")
|
||||||
|
.replace("\\033", "\x1b")
|
||||||
|
.replace("\\0", "\0");
|
||||||
|
|
||||||
if value.is_empty() {
|
if value.is_empty() {
|
||||||
emit!(&mut self.data_section, " S{} db 0", self.data_counter);
|
emit!(&mut self.data_section, " S{} db 0", self.data_counter);
|
||||||
|
|||||||
16
src/std.zr
16
src/std.zr
@@ -23,12 +23,10 @@ func strrev[s: String] : String
|
|||||||
let len: I64 = strlen(s)
|
let len: I64 = strlen(s)
|
||||||
let out: String = malloc(len + 1)
|
let out: String = malloc(len + 1)
|
||||||
|
|
||||||
let i: I64 = 0
|
for i in 0:len
|
||||||
while i < len
|
let c: Char = String.nth(s, len - i - 1)
|
||||||
let c: Char = nth(s, len - i - 1)
|
String.set(out, i, c)
|
||||||
set(out, i, c)
|
String.set(out, len, 0)
|
||||||
i = i + 1
|
|
||||||
set(out, len, 0)
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
func IO.read_file[path: String]: String
|
func IO.read_file[path: String]: String
|
||||||
@@ -43,7 +41,7 @@ func IO.read_file[path: String]: String
|
|||||||
let buffer: String = malloc(size + 1)
|
let buffer: String = malloc(size + 1)
|
||||||
|
|
||||||
let n: I64 = fread(buffer, 1, size, file)
|
let n: I64 = fread(buffer, 1, size, file)
|
||||||
set(buffer, n, 0)
|
String.set(buffer, n, 0)
|
||||||
return buffer
|
return buffer
|
||||||
|
|
||||||
func Char.to_i64[c: Char]: I64
|
func Char.to_i64[c: Char]: I64
|
||||||
@@ -78,10 +76,8 @@ func Math.abs[n: I64] : I64
|
|||||||
|
|
||||||
func Math.pow[b: I64, e: I64] : I64
|
func Math.pow[b: I64, e: I64] : I64
|
||||||
let out: I64 = 1
|
let out: I64 = 1
|
||||||
let i: I64 = 0
|
for i in 0:e
|
||||||
while i < e
|
|
||||||
out = out * b
|
out = out * b
|
||||||
i = i + 1
|
|
||||||
return out
|
return out
|
||||||
|
|
||||||
func Math.lcm[a: I64, b: I64] : I64
|
func Math.lcm[a: I64, b: I64] : I64
|
||||||
|
|||||||
7
test.zr
7
test.zr
@@ -1,5 +1,6 @@
|
|||||||
func run_test[x: String] : I64
|
func run_test[x: String] : I64
|
||||||
printf("[93mBuilding %s...[0m", x)
|
// TODO: escape sequences
|
||||||
|
printf("\033[93mBuilding %s...\033[0m", x)
|
||||||
let cmd: String = concat("./target/release/zern examples/", x)
|
let cmd: String = concat("./target/release/zern examples/", x)
|
||||||
|
|
||||||
let build_start_time: I64 = time()
|
let build_start_time: I64 = time()
|
||||||
@@ -15,12 +16,12 @@ func run_test[x: String] : I64
|
|||||||
exit(1)
|
exit(1)
|
||||||
let run_end_time: I64 = time()
|
let run_end_time: I64 = time()
|
||||||
|
|
||||||
printf("[93mRunning %s...[0m %ldms\n", x, run_end_time - run_start_time)
|
printf("\033[93mRunning %s...\033[0m %ldms\n", x, run_end_time - run_start_time)
|
||||||
|
|
||||||
func main[] : I64
|
func main[] : I64
|
||||||
system("cargo build --release")
|
system("cargo build --release")
|
||||||
|
|
||||||
// TODO
|
// TODO: listdir
|
||||||
run_test("euler1.zr")
|
run_test("euler1.zr")
|
||||||
run_test("euler2.zr")
|
run_test("euler2.zr")
|
||||||
run_test("euler3.zr")
|
run_test("euler3.zr")
|
||||||
|
|||||||
Reference in New Issue
Block a user