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 Binary files /dev/null and b/cgol 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 Binary files a/mandelbrot and b/mandelbrot 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 #include -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; }