summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Hall <hallmatthew314@gmail.com>2023-02-18 17:19:09 +1300
committerMatthew Hall <hallmatthew314@gmail.com>2023-02-18 17:19:09 +1300
commit28ab4a097fb73a138850a3fb7f6e480765c702ee (patch)
tree2521dcbff013b670caec4b5b8de0eac8a0f150cc
parent8c33b3d2c69b6800ca34155d62c000250980e47e (diff)
Add STRCAT, update fizzbuzz
-rw-r--r--DSL/Interpretation.hs1
-rw-r--r--DSL/Intrinsics.hs7
-rw-r--r--DSL/Parsing.hs1
-rw-r--r--DSL/Types.hs2
-rw-r--r--DSL/Util.hs4
-rw-r--r--examples/fizzbuzz.dumb13
6 files changed, 19 insertions, 9 deletions
diff --git a/DSL/Interpretation.hs b/DSL/Interpretation.hs
index 02105f4..02f741d 100644
--- a/DSL/Interpretation.hs
+++ b/DSL/Interpretation.hs
@@ -40,6 +40,7 @@ applyIntrinsic i m = do
I_AND -> and'
I_OR -> or'
I_XOR -> xor
+ I_STRCAT -> strcat
I_EQUAL -> equal
I_LESSTHAN -> lessThan
I_GREATERTHAN -> greaterThan
diff --git a/DSL/Intrinsics.hs b/DSL/Intrinsics.hs
index 72bee4f..ecb0fad 100644
--- a/DSL/Intrinsics.hs
+++ b/DSL/Intrinsics.hs
@@ -91,6 +91,13 @@ or' = binBoolean "OR" $ \ x y -> [x || y]
xor :: StackModifier
xor = binBoolean "XOR" $ \ x y -> [x /= y]
+strcat :: StackModifier
+strcat = StackModifier { smName="STRCAT", smTypes=ts, smFunc=f }
+ where
+ ts = [tString, tString]
+ f (StackString x:StackString y:xs) = return $ StackString (x ++ y):xs
+ f _ = unreachable
+
equal :: StackModifier
equal = StackModifier { smName="EQUAL", smTypes=ts, smFunc=f }
where
diff --git a/DSL/Parsing.hs b/DSL/Parsing.hs
index ba6a5ee..fad68f1 100644
--- a/DSL/Parsing.hs
+++ b/DSL/Parsing.hs
@@ -74,6 +74,7 @@ intrinsicL = fromTableL [ (".", T_INTRINSIC I_DUMP)
, ("&&", T_INTRINSIC I_AND)
, ("||", T_INTRINSIC I_OR)
, ("^", T_INTRINSIC I_XOR)
+ , ("++", T_INTRINSIC I_STRCAT)
, ("==", T_INTRINSIC I_EQUAL)
, ("<", T_INTRINSIC I_LESSTHAN)
, (">", T_INTRINSIC I_GREATERTHAN)
diff --git a/DSL/Types.hs b/DSL/Types.hs
index 0a4de3f..7bd9f56 100644
--- a/DSL/Types.hs
+++ b/DSL/Types.hs
@@ -36,6 +36,8 @@ data Intrinsic
| I_AND
| I_OR
| I_XOR
+ -- core string operations
+ | I_STRCAT
-- core logical operations
| I_EQUAL
| I_LESSTHAN
diff --git a/DSL/Util.hs b/DSL/Util.hs
index 67435a2..7767b4b 100644
--- a/DSL/Util.hs
+++ b/DSL/Util.hs
@@ -13,6 +13,10 @@ tInt :: TypeCheck
tInt (StackInt _) = True
tInt _ = False
+tString :: TypeCheck
+tString (StackString _) = True
+tString _ = False
+
runChecks :: [TypeCheck] -> Stack -> Maybe String
runChecks fs s
| length fs > length s = Just "stack underflow"
diff --git a/examples/fizzbuzz.dumb b/examples/fizzbuzz.dumb
index 692402a..43b4d82 100644
--- a/examples/fizzbuzz.dumb
+++ b/examples/fizzbuzz.dumb
@@ -1,13 +1,8 @@
1
WHILE 100 OVER <= DO
- 3 OVER %
- OVER 5 SWAP %
- IF 0 ==
- DO
- IF 0 == DO "Fizzbuzz" ELSE "Buzz" END
- ELSE
- IF 0 == DO "Fizz" ELSE DUP END
- END
- . 1 +
+ 5 OVER % IF 0 == DO "Buzz" ELSE "" END
+ OVER 3 SWAP % IF 0 == DO "Fizz" ELSE "" END
+ ++ OVER SWAP IF DUP "" == DO SWAP END
+ . DROP 1 +
END