diff --git a/src/examples/pebblisp.pbl b/src/examples/pebblisp.pbl index 063e3b4..37ac328 100644 --- a/src/examples/pebblisp.pbl +++ b/src/examples/pebblisp.pbl @@ -31,7 +31,7 @@ (def aliases ( (Alias "ls" "ls --color") (Alias "alias" "(alias)") - (Alias "pbl" "vim ~/.pebblisp.pbl") + (Alias "pbl" (cat (env "EDITOR") " ~/.pebblisp.pbl")) (Alias "r" "(reloadConfig)") )) @@ -39,6 +39,16 @@ (reduce (map (fn (a) (cat nl a.name " -> " a.value)) aliases) cat "") ))) +(def commRunning F) + +(def promptUpdater (fn () ( + (if commRunning () ( + (prn (cat "" (prompt ""))) + )) + (sys "sleep 1") + (promptUpdater) +))) + (def preprocess (fn (text) ( (def matches (fil (fn (a) (= text a.name)) aliases)) (def match (first matches)) diff --git a/src/tests.sh b/src/tests.sh index a143e79..d3513b5 100755 --- a/src/tests.sh +++ b/src/tests.sh @@ -91,63 +91,62 @@ check() { echo "::SHELL TESTS::" -title "Plain returns" -check "PlainRet" "10" "10" -check "StrRetrn" '"hey"' "hey" -check "HexReturn" "0x0f0f0" "61680" -check "BinaryReturn" "0b011010011010011" "13523" +title "Basic Parsing" +check "Number" "10" "10" +check "String" '"hey"' "hey" +check "Hex Number" "0x0f0f0" "61680" +check "Binary Number" "0b011010011010011" "13523" title "Arithmetic" check "Addition" "(+ 1093 102852)" "103945" check "Multiply" "(* 1000 10000)" "10000000" check "Division" "(/ 6418425 65)" "98745" -check "ChainAdd" "(+ 3917 17304 1293844 400 100000)" "1415465" -check "ChainMul" "(* 8263 23 123)" "23376027" -check "ChainDiv" "(/ 1493856 741 96 7)" "3" +check "Chain Addition" "(+ 3917 17304 1293844 400 100000)" "1415465" +check "Chain Multiplication" "(* 8263 23 123)" "23376027" +check "Chain Division" "(/ 1493856 741 96 7)" "3" title "Comparison" -check "GratrThn" "(> 23847123 19375933)" "T" -check "GratrThnMulti" "(> 9999 55 1 0)" "T" -check "LessThan" "(< 23847123 19375933)" "F" +check "Greater-Than" "(> 23847123 19375933)" "T" +check "Multiple Greater-Than" "(> 9999 55 1 0)" "T" +check "Less-Than" "(< 23847123 19375933)" "F" check "Equality" "(= 987654321 987654321 )" "T" -check "StringEquality" '(= "Bean" "Bean" )' "T" -check "StringInequality" '(= "Beans" "Bean" )' "F" -check "NullInequality" '(= "Beans" "" )' "F" +check "String Equality" '(= "Bean" "Bean" )' "T" +check "String Inequality" '(= "Beans" "Bean" )' "F" +check "Null Inequality" '(= "Beans" "" )' "F" -title "ComplexStrings" -check "TripleQuoting" '"""Hello"""' 'Hello' -check "TripleQuotingWithQuotes" '"""My name is "yoink"."""' 'My name is "yoink".' +title "Complex Strings" +check "Triple Quoting" '"""Hello"""' 'Hello' +check "Triple Quoting With Quotes" '"""My name is "yoink"."""' 'My name is "yoink".' title "TypeCheck" -check "IsNum" "(isnum 23847123)" "T" -check "IsntNum" '(isnum "WORDS")' "F" -check "IsString" '(isstr "words")' "T" -check "IsStringEmpty" '(isstr "")' "T" -check "NumNotString" "(isstr 5)" "F" -check "ListNotString" '(isstr ("hello"))' "F" +check "Is Num" "(isnum 23847123)" "T" +check "Is String" '(isstr "words")' "T" +check "Empty String Is String" '(isstr "")' "T" +check "String Is Not Num" '(isnum "WORDS")' "F" +check "List Is Not String" '(isstr ("hello"))' "F" +check "Num Is Not String" "(isstr 5)" "F" title "Ifs/Bools" -check "IfReturn" "(if (T) 123456789 987654321)" "123456789" +check "IfReturn" "(if T 123456789 987654321)" "123456789" check "IfRetTwo" "(if F 123456789 987654321)" "987654321" check "EmptyCnd" "(if () T F)" "F" check "EtyLstLt" "(if (()) T F)" "T" title "Lists" -check "RegLists" "(1 2 3 4 5)" "( 1 2 3 4 5 )" -check "MultiTypeList" '(10 20 "rascals")' "( 10 20 rascals )" -check "EmptyLst" "()" "( )" -check "EmptLst2" "( )" "( )" -check "ListIndex" "(at (+ 1 1) (1 2 1000 4 5))" "1000" -check "EvalElems" "((* 10 10) 7)" "( 100 7 )" -check "AppendToList" "(ap (1 20 300 4000 50000) 600000)" "( 1 20 300 4000 50000 600000 )" -check "AppndToEnvList" "(def l (50000 4000 300 20)) (def l (ap l 1)) l" "( 50000 4000 300 20 1 )" -check "PrependToList" "(pre (1 20 300 4000 50000) 600000)" "( 600000 1 20 300 4000 50000 )" -check "PrepndToEnvList" "(def l (50000 4000 300 20)) (def l (pre l 1)) l" "( 1 50000 4000 300 20 )" -check "Rest(Tail)OfList" "(def l (50000 4000 300 20)) (rest l)" "( 4000 300 20 )" -check "ListLength" "(def l (1 20 3 \"abc\" \"banana\" (+ 10 5))) (len l)" "6" -check "Identifying list" "(islist (1 2 3))" "T" -check "Identifying empty list" "(islist ())" "T" -check "Identifying not a list" "(islist 1)" "F" +check "Normal List" "(1 2 3 4 5)" "( 1 2 3 4 5 )" +check "Heterogenous List" '(10 20 "rascals")' "( 10 20 rascals )" +check "Empty List" "()" "( )" +check "List Index" "(at (+ 1 1) (1 2 1000 4 5))" "1000" +check "Eval List Elements" "((* 10 10) 7)" "( 100 7 )" +check "Append To List" "(ap (1 20 300 4000 50000) 600000)" "( 1 20 300 4000 50000 600000 )" +check "Append To List In Env" "(def l (50000 4000 300 20)) (def l (ap l 1)) l" "( 50000 4000 300 20 1 )" +check "Prepend On List" "(pre (1 20 300 4000 50000) 600000)" "( 600000 1 20 300 4000 50000 )" +check "Prepend On Env List" "(def l (50000 4000 300 20)) (def l (pre l 1)) l" "( 1 50000 4000 300 20 )" +check "Rest Of List" "(def l (50000 4000 300 20)) (rest l)" "( 4000 300 20 )" +check "List Length" "(def l (1 20 3 \"abc\" \"banana\" (+ 10 5))) (len l)" "6" +check "Identifying List" "(islist (1 2 3))" "T" +check "Identifying Empty List" "(islist ())" "T" +check "Identifying Not A List" "(islist 1)" "F" deep_nesting="10" for _ in {0..25}; do deep_nesting="( $deep_nesting )"; done @@ -156,6 +155,7 @@ check "DeepNesting" "$deep_nesting" "$deep_nesting" # Above 25 it starts to stac title "Spacing" check "Wide Spacing" "( + 1093 102852 )" "103945" check "Very Wide Spacing" " ( + 1093 102852 ) " "103945" +check "Wide Empty List" "( )" "( )" title "DemoFunctions" check "Squaring" "(sq 9876)" "97535376" @@ -167,9 +167,9 @@ check "MinRight" "(min 8429 192449)" "8429" check "MinLeft" "(min 17294722 17294721)" "17294721" title "Lambdas" -check "MultStmt" "(def yee (fn (a) (* 10 a))) ; (yee 5)" "50" -check "MultStmtNoSemi" "(def yee (fn (a) (* 10 a)))(yee 5)" "50" -check "DefinMap" "(def yee (fn (a) (* 10 a))) ; (map yee (5 10 2 (+ 12 0)))" "( 50 100 20 120 )" +check "Multi-Statement" "(def yee (fn (a) (* 10 a))) ; (yee 5)" "50" +check "Multi-Statement, No Semicolon" "(def yee (fn (a) (* 10 a)))(yee 5)" "50" +check "Pre-Defined Map" "(def yee (fn (a) (* 10 a))) ; (map yee (5 10 2 (+ 12 0)))" "( 50 100 20 120 )" check "AnonymousLambda" "\ (map (fn (a) (* a a)) (5 6 7))" "( 25 36 49 )" check "FbnciSeq" "\ @@ -186,12 +186,12 @@ check "Factorial" "\ (* a (fac (- a 1)) ) \ )));\ (fac 11)" "39916800" -check "LambdaClone" "(def y (fn (a) (* 10 a))) (def b y) (def y 12345) ((b 5) y)" "( 50 12345 )" +check "Lambda Clone" "(def y (fn (a) (* 10 a))) (def b y) (def y 12345) ((b 5) y)" "( 50 12345 )" check "Duplicate" "(def dupe (fn (a) (() (a a a))));(dupe (* 10 10))" "( 100 100 100 )" title "Cat" -check "ExplicitCat" '(cat "Big" " Kitty")' "Big Kitty" -check "CatNums" '(cat "There are " (+ 2 3) " kitties")' "There are 5 kitties" +check "Basic Cat" '(cat "Big" " Kitty")' "Big Kitty" +check "Cat Nums" '(cat "There are " (+ 2 3) " kitties")' "There are 5 kitties" title "Filtering" check "Filtering" "(fil (fn (a) (< 321 a)) (30 300 90 1200 135 801))" "( 1200 801 )" @@ -199,7 +199,7 @@ check "FilterEval" "(fil (fn (a) (= 1000 a)) ((+ 450 550) (* 20 50) (/ 30 3) (- check "MapFilter" "(fil (fn (a) (< 50 a)) (map sq (1 2 3 4 5 6 7 8 9 10 11 12)))" "( 64 81 100 121 144 )" title "Structs" -check "StructDef" "(struct Post (title body))" "T" +check "Struct Definition" "(struct Post (title body))" "T" check "Building a struct"\ '(struct Post (title body)) (Post "A title" "The Body")'\ '{ title: "A title", body: "The Body" }' @@ -208,37 +208,39 @@ check "Accessing struct fields"\ "( TITLE BODY )" title "HigherOrder" -check "Simple reducing" '(reduce (1 2 3) + 0)' '6' -check "NonListReducing" '(reduce 1 + 0)' '1' -check "StringReducing" '(reduce (" my" " friend") cat "Hello,")' 'Hello, my friend' -check "FuncReturningAFunc" "(def plusser (fn (outer) (fn (inner) (+ outer inner))))\ +check "Simple Reduction" '(reduce (1 2 3) + 0)' '6' +check "Non-List Reduction" '(reduce 1 + 0)' '1' +check "String Reduction" '(reduce (" my" " friend") cat "Hello,")' 'Hello, my friend' +check "Lambda Returning a Lambda" "(def plusser (fn (outer) (fn (inner) (+ outer inner))))\ (def plusFive (plusser 5))\ (plusFive 10)" "15" title "ShouldError" -check "LenOfNotList" "(len 5)" regex "BAD_PARAMS.*" -check "NoMapList" "(map sq)" "NULL_MAP_ARGS" -check "BadNumber" "(5df)" regex "BAD_NUMBER.*" -check "BadHex" "(0x0zf)" regex "BAD_NUMBER.*" -check "BadBinary" "(0b01120)" regex "BAD_NUMBER.*" -check "UnsupportedNumber" "(00000)" regex "UNSUPPORTED_NUMBER.*" -check "BadParens1" "(hey()" regex "MISMATCHED_PARENS.*" -check "BadParens2" "(hey)(" regex "MISMATCHED_PARENS.*" -check "BadParens3" "((hey(" regex "MISMATCHED_PARENS.*" -check "BadParens4" ")))hey" regex "MISMATCHED_PARENS.*" -check "BadParens5" "hey))(" regex "MISMATCHED_PARENS.*" -check "BadParens6" '(ey")"' regex "MISMATCHED_PARENS.*" +check "Len of Not-List" "(len 5)" regex "BAD_PARAMS.*" +check "Map With No List" "(map sq)" "NULL_MAP_ARGS" +check "Bad Number" "(5df)" regex "BAD_NUMBER.*" +check "Bad Hex" "(0x0zf)" regex "BAD_NUMBER.*" +check "Bad Binary" "(0b01120)" regex "BAD_NUMBER.*" +check "Unsupported Number" "(00000)" regex "UNSUPPORTED_NUMBER.*" +check "Bad Parens 1" "(hey()" regex "MISMATCHED_PARENS.*" +check "Bad Parens 2" "(hey)(" regex "MISMATCHED_PARENS.*" +check "Bad Parens 3" "((hey(" regex "MISMATCHED_PARENS.*" +check "Bad Parens 4" ")))hey" regex "MISMATCHED_PARENS.*" +check "Bad Parens 5" "hey))(" regex "MISMATCHED_PARENS.*" +check "Bad Parens 6" '(ey")"' regex "MISMATCHED_PARENS.*" title "ListArithmetic" disabled -check "UnevenLists" "(+ (1 2) (1 2 3))" "LISTS_NOT_SAME_SIZE" -check "ListAddi" "(+ 5 (1 2 3 (+ 10 10)))" "( 6 7 8 25 )" -check "ListModu" "(% 5 (1 2 3 (* 11 11)))" "( 1 2 3 1 )" -check "ListsMul" "(* (10 20 30) (1 20 300))" "( 10 400 9000 )" +check "Uneven Lists" "(+ (1 2) (1 2 3))" "LISTS_NOT_SAME_SIZE" +check "List Addition" "(+ 5 (1 2 3 (+ 10 10)))" "( 6 7 8 25 )" +check "List Modulo" "(% 5 (1 2 3 (* 11 11)))" "( 1 2 3 1 )" +check "List Multiplication" "(* (10 20 30) (1 20 300))" "( 10 400 9000 )" title "Eval" -check "BasicNumberEval" '(eval "5")' "5" -check "BasicOpEval" '(eval "(+ 5 10)")' "15" -check "MapFilter" '(eval "(fil (fn (a) (< 50 a)) (map sq (1 2 3 4 5 6 7 8 9 10 11 12)))")' "( 64 81 100 121 144 )" +check "Basic Number Eval" '(eval "5")' "5" +check "Basic Op Eval" '(eval "(+ 5 10)")' "15" +check "Map Filter" \ + '(eval "(fil (fn (a) (< 50 a)) (map sq (1 2 3 4 5 6 7 8 9 10 11 12)))")' \ + "( 64 81 100 121 144 )" title "Forbble" disabled check "BasicForbbleOp" '(loadfile "examples/forbble.pbl") (feval (10 10 * .)) ""' "100"