aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornic-gaffney <gaffney_nic@protonmail.com>2023-06-27 03:19:39 -0500
committernic-gaffney <gaffney_nic@protonmail.com>2023-06-27 03:19:39 -0500
commit5d958f8af1646f9cb4763bb2f020bb2e6de8a3c0 (patch)
tree32321069ed7dd49c567b53a13dfbb07e1e95f88b
parent9f7f0f925f9304ac46499caf0fef245083a78828 (diff)
downloadsloth-5d958f8af1646f9cb4763bb2f020bb2e6de8a3c0.tar.gz
help
-rwxr-xr-xbuild.sh9
-rwxr-xr-xcgolbin0 -> 22096 bytes
-rw-r--r--examples/cgol.sloth76
-rw-r--r--examples/mandelbrot.sloth8
-rwxr-xr-xmandelbrotbin21024 -> 21936 bytes
-rw-r--r--mandelbrot.py22
-rw-r--r--std/stdio.c4
-rw-r--r--std/stdlib.c9
-rw-r--r--std/stdlib.sloth11
-rw-r--r--std/stdmath.c6
10 files changed, 80 insertions, 65 deletions
diff --git a/build.sh b/build.sh
index b8a9b9c..62bd830 100755
--- a/build.sh
+++ b/build.sh
@@ -1,8 +1,11 @@
# Build Sloth
cargo build
-
+FILENAME="$1"
# Compile standard library
-./target/debug/sloth std/stdio.sloth std/stdlib.sloth std/stdmath.sloth "$1"
+./target/debug/sloth std/stdio.sloth std/stdlib.sloth std/stdmath.sloth $FILENAME
# Generate binary
-clang output.o std/stdio.c std/stdlib.c std/stdmath.c -o program
+clang output.o std/stdio.c std/stdlib.c std/stdmath.c -o "${FILENAME%.sloth}"
+
+# Move file
+mv "${FILENAME%.sloth}" .
diff --git a/cgol b/cgol
new file mode 100755
index 0000000..9a1335c
--- /dev/null
+++ b/cgol
Binary files differ
diff --git a/examples/cgol.sloth b/examples/cgol.sloth
index eea14c3..b1a6998 100644
--- a/examples/cgol.sloth
+++ b/examples/cgol.sloth
@@ -1,73 +1,99 @@
-foreign fn print(str: String);
-foreign fn randGen(min: Int, max: Int) Int;
-foreign fn wait(time: Float);
-foreign fn termpos(x: Int, y: Int);
-
-
fn populate() [Int] {
+ # Initialize life vector
var life: [Int] = [0];
vpopi(life);
+
+ # Fill the vector with random values
var i: Int = 0;
while i < 100 {
- n: Int = randGen(0,1);
+ var n: Int = randGen(0,1);
+ println(istr(n));
vpushi(life, n);
+ i = i+1;
}
+
return life;
}
fn coord(x: Int, y: Int) Int {
+ println("COORD");
+ var res: Int = -1;
+ # Calculate index based on coordinates
if x >= 0 && y >= 0 {
- return y*10 + x;
+ println("COORD1");
+ res = y*10 + x;
}
- return -1;
-
+ # if coordinate is invalid, return -1
+ return res;
}
fn cval(x: Int, y: Int, life: [Int]) Int {
- c: Int = coord(x, y);
- if c < 0 {
- return 0;
+ 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);
}
- return vgeti(life, c);
+ println("CVAL3");
+ return res;
}
fn update(life: [Int]) [Int] {
- x: Int = 0;
- while x < 10 Int {
- y: Int = 0;
+ # Iterate through life
+ var x: Int = 0;
+ while x < 10 {
+ var y: Int = 0;
while y < 10 {
- 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);
- if cval(x, y) == 1 && total < 2 || total > 3{
+ # 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);
+
+ # Apply game of life rules
+ if cval(x, y) == 1 && total < 2 || total > 3 {
vseti(life, 0);
} else if total == 3 {
vseti(life, 1);
}
+ y = y+1;
}
+ x = x+1;
}
+
return life;
}
fn display(life: [Int]) {
- x: Int = 0;
+ println("DISPLAY");
+ # Iterate through life
+ var x: Int = 0;
while x < 10 {
- y: Int = 0;
+ println("DISPLAY1");
+ var y: Int = 0;
while y < 10 {
- alive: Bool = cval(x, y) == 1;
- if alive {
+ println("DISPLAY2");
+ # if the cell is alive, print
+ if cval(x, y) == 1{
+ println("DISPLAY3");
termpos(x, y);
print("#");
}
-
-
+ y = y+1;
}
+ x = x+1;
}
}
fn main() Int {
+ # Populate
var life: [Int] = populate();
+ display(life);
+ # Play forever
while true {
life = update(life);
display(life);
wait(0.5);
}
+ return 0;
}
diff --git a/examples/mandelbrot.sloth b/examples/mandelbrot.sloth
index 6bf7727..391e86e 100644
--- a/examples/mandelbrot.sloth
+++ b/examples/mandelbrot.sloth
@@ -1,8 +1,8 @@
-foreign fn print(str: String);
-foreign fn printint(i: Int);
-foreign fn as_int(x: Float) Int;
+#foreign fn print(str: String);
+#foreign fn printint(i: Int);
+#foreign fn as_int(x: Float) Int;
-foreign fn termpos(x: Int, y: Int) Void;
+#foreign fn termpos(x: Int, y: Int) Void;
fn main() Int{
var size: Float = 1000.0;
diff --git a/mandelbrot b/mandelbrot
index 1196b0f..53f907c 100755
--- a/mandelbrot
+++ b/mandelbrot
Binary files differ
diff --git a/mandelbrot.py b/mandelbrot.py
deleted file mode 100644
index 82aa65c..0000000
--- a/mandelbrot.py
+++ /dev/null
@@ -1,22 +0,0 @@
-size = 200
-
-# constants:
-MaxValue = 4
-MaxIterations = 50
-planeWidth = 4
-
-for x in range(0, size):
- for y in range(0, size): # for each pixel do:
- cReal = (x * planeWidth / size) - 2
- cImg = (y * planeWidth / size) - 2
- zReal = 0
- zImg = 0
- count = 0
- while (zReal*zReal + zImg*zImg) <= MaxValue and count < MaxIterations:
- temp = (zReal * zReal) - (zImg * zImg) + cReal
- zImg = 2 * zReal * zImg + cImg
- zReal = temp
- count += 1
-
- if count == MaxIterations:
- print(f"\x1b[{x};{y}H*")
diff --git a/std/stdio.c b/std/stdio.c
index 1a4d98c..a257f67 100644
--- a/std/stdio.c
+++ b/std/stdio.c
@@ -10,3 +10,7 @@ char* readln() {
void print(char *str) {
fputs(str, stdout);
}
+
+void termpos(int x, int y) {
+ printf("\x1b[%d;%dH", x, y);
+}
diff --git a/std/stdlib.c b/std/stdlib.c
index f405b6f..9510866 100644
--- a/std/stdlib.c
+++ b/std/stdlib.c
@@ -17,3 +17,12 @@ char charAt(char *str, int x) {
int parse_int(char *str) {
return (int) atoi(str);
}
+
+int as_int(float x) {
+ return (int) x;
+}
+
+char* istr(int x) {
+ char snum[100];
+ return (char* )itoa(x, snum, 10);
+}
diff --git a/std/stdlib.sloth b/std/stdlib.sloth
index e15d4dc..913fd0b 100644
--- a/std/stdlib.sloth
+++ b/std/stdlib.sloth
@@ -3,14 +3,9 @@ foreign fn print(str: String) Void;
foreign fn slen(str: String) Int;
# foreign fn charAt(str: String) Char;
foreign fn parse_int(str: String) Int;
-
-fn termpos(x: Int, y: Int) Void {
- print("\x1b[");
- print(x);
- print(";");
- print(y);
- print("H");
-}
+foreign fn termpos(x: Int, y: Int);
+foreign fn as_int(x: Float) Int;
+foreign fn istr(x: Int) Int;
fn termclear() Void {
print("\x1b[2J\x1b[H");
diff --git a/std/stdmath.c b/std/stdmath.c
index f7f79c6..a650129 100644
--- a/std/stdmath.c
+++ b/std/stdmath.c
@@ -2,12 +2,12 @@
#include <stdlib.h>
#include <time.h>
-bool random_setup = false;
+int random_setup = 0;
int randGen(int min, int max) {
- if random_setup == false {
+ if (random_setup == 0) {
srandom(time(NULL));
- random_setup = true;
+ random_setup = 1;
}
return random() % (max - min + 1) + min;
}