aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/cgol.sloth75
-rw-r--r--examples/hello.sloth19
-rw-r--r--sloth/src/codegen/mod.rs8
-rw-r--r--std/stdio.c4
-rw-r--r--std/stdlib.c8
-rw-r--r--std/stdlib.sloth6
-rw-r--r--test.c2
7 files changed, 79 insertions, 43 deletions
diff --git a/examples/cgol.sloth b/examples/cgol.sloth
index b1a6998..a5b761f 100644
--- a/examples/cgol.sloth
+++ b/examples/cgol.sloth
@@ -5,9 +5,8 @@ fn populate() [Int] {
# Fill the vector with random values
var i: Int = 0;
- while i < 100 {
+ while i < 2500 {
var n: Int = randGen(0,1);
- println(istr(n));
vpushi(life, n);
i = i+1;
}
@@ -16,69 +15,79 @@ fn populate() [Int] {
}
fn coord(x: Int, y: Int) Int {
- println("COORD");
var res: Int = -1;
# Calculate index based on coordinates
if x >= 0 && y >= 0 {
- println("COORD1");
- res = y*10 + x;
+ res = y*50 + x;
}
# if coordinate is invalid, return -1
return res;
}
fn cval(x: Int, y: Int, life: [Int]) Int {
- println("CVAL");
# Check to make sure index exists before returning
var res: Int = 0;
var c: Int = coord(x, y);
- println("CVAL1");
if c >= 0 {
- println("CVAL2");
res = vgeti(life, c);
}
- println("CVAL3");
return res;
}
-fn update(life: [Int]) [Int] {
+fn update(life: [Int], new: [Int]) {
# Iterate through life
var x: Int = 0;
- while x < 10 {
+ while x < 50 {
var y: Int = 0;
- while y < 10 {
+ while y < 50 {
# Calculate total score around selected cell
- var total: Int = cval(x-1, y-1) + cval(x-1, y) + cval(x-1, y+1) + cval(x, y-1) + cval(x, y+1) + cval(x+1, y-1) + cval(x+1, y) + cval(x+1, y+1);
+ var total: Int =
+ cval(x-1, y-1, life) + # Top Left
+ cval(x-1, y , life) +
+ cval(x-1, y+1, life) +
+ cval(x , y-1, life) +
+ cval(x , y+1, life) +
+ cval(x+1, y-1, life) +
+ cval(x+1, y , life) +
+ cval(x+1, y+1, life);
# Apply game of life rules
- if cval(x, y) == 1 && total < 2 || total > 3 {
- vseti(life, 0);
- } else if total == 3 {
- vseti(life, 1);
- }
+ var idx: Int = coord(x, y);
+
+ if cval(x, y, life) == 1 {
+ if total < 2 || total > 3 {
+ vseti(new, idx, 0);
+ } else {
+ vseti(new, idx, 1);
+ }
+ } else {
+ if total == 3 {
+ vseti(new, idx, 1);
+ } else {
+ vseti(new, idx, 0);
+ }
+ }
+
y = y+1;
}
x = x+1;
}
-
- return life;
}
fn display(life: [Int]) {
- println("DISPLAY");
# Iterate through life
+ #termclear();
var x: Int = 0;
- while x < 10 {
- println("DISPLAY1");
+ while x < 50 {
var y: Int = 0;
- while y < 10 {
- println("DISPLAY2");
+ while y < 50 {
# if the cell is alive, print
- if cval(x, y) == 1{
- println("DISPLAY3");
- termpos(x, y);
+ termpos(x, y);
+ if cval(x, y, life) == 1{
print("#");
- }
+ } else {
+ print(" ");
+ }
y = y+1;
}
x = x+1;
@@ -91,9 +100,11 @@ fn main() Int {
display(life);
# Play forever
while true {
- life = update(life);
- display(life);
- wait(0.5);
+ var new: [Int] = populate();
+ update(life, new);
+ display(new);
+ life = new;
+ wait(1.0);
}
return 0;
}
diff --git a/examples/hello.sloth b/examples/hello.sloth
index 8abb65c..75071c3 100644
--- a/examples/hello.sloth
+++ b/examples/hello.sloth
@@ -1,4 +1,23 @@
+foreign fn printdeez(nutz: Int);
+foreign fn print(str: String);
+foreign fn randGen(min: Int, max: Int) Int;
+
fn main() Int {
+ var x: [Int] = [5];
+ vpopi(x);
+ var i: Int = 0;
+ while i < 100 {
+ vpushi(x, randGen(0, 100));
+ i = i + 1;
+ }
+
+ var y: Int = vgeti(x, 42);
+ var y: Int = vgeti(x, 45);
+ var y: Int = vgeti(x, 41);
+ var y: Int = vgeti(x, 49);
+ printdeez(y);
+
+
print("Hello World\n");
return 0;
}
diff --git a/sloth/src/codegen/mod.rs b/sloth/src/codegen/mod.rs
index 3120d11..debc151 100644
--- a/sloth/src/codegen/mod.rs
+++ b/sloth/src/codegen/mod.rs
@@ -433,7 +433,11 @@ impl<'ctx> Codegen<'ctx> {
let inner_ptr = self
.builder
- .build_array_malloc(element_type, i32_type.const_int(100, false), "vecinnerptr")
+ .build_array_malloc(
+ element_type,
+ i32_type.const_int(5000, false),
+ "vecinnerptr",
+ )
.unwrap();
for (idx, value) in values.iter().enumerate() {
@@ -479,7 +483,7 @@ impl<'ctx> Codegen<'ctx> {
.build_store(size_ptr, i32_type.const_int(values.len() as u64, false));
self.builder
- .build_store(cap_ptr, i32_type.const_int(100, false));
+ .build_store(cap_ptr, i32_type.const_int(2500, false));
self.builder.build_store(inner, inner_ptr);
diff --git a/std/stdio.c b/std/stdio.c
index a257f67..d3ff5a0 100644
--- a/std/stdio.c
+++ b/std/stdio.c
@@ -14,3 +14,7 @@ void print(char *str) {
void termpos(int x, int y) {
printf("\x1b[%d;%dH", x, y);
}
+
+void termclear() {
+ printf("\x1b[2J\x1b[H");
+}
diff --git a/std/stdlib.c b/std/stdlib.c
index 9510866..b70f5b7 100644
--- a/std/stdlib.c
+++ b/std/stdlib.c
@@ -22,7 +22,7 @@ int as_int(float x) {
return (int) x;
}
-char* istr(int x) {
- char snum[100];
- return (char* )itoa(x, snum, 10);
-}
+// char* istr(int x) {
+// char snum[100];
+// return (char* )itoa(x, snum, 10);
+// }
diff --git a/std/stdlib.sloth b/std/stdlib.sloth
index 913fd0b..eb6000d 100644
--- a/std/stdlib.sloth
+++ b/std/stdlib.sloth
@@ -5,8 +5,6 @@ foreign fn slen(str: String) Int;
foreign fn parse_int(str: String) Int;
foreign fn termpos(x: Int, y: Int);
foreign fn as_int(x: Float) Int;
-foreign fn istr(x: Int) Int;
+#foreign fn istr(x: Int) Int;
-fn termclear() Void {
- print("\x1b[2J\x1b[H");
-}
+foreign fn termclear() Void;
diff --git a/test.c b/test.c
index f19dee9..1bf5e4f 100644
--- a/test.c
+++ b/test.c
@@ -6,7 +6,7 @@ void print(char* x) {
void printfl(float x) {
printf("%f", x);
}
-void printint(int x) {
+void printdeez(int x) {
printf("%d", x);
}