strictness, ci master
authorMart Lubbers <mart@martlubbers.net>
Wed, 31 Jul 2019 08:31:39 +0000 (10:31 +0200)
committerMart Lubbers <mart@martlubbers.net>
Wed, 31 Jul 2019 08:31:39 +0000 (10:31 +0200)
15 files changed:
.gitignore
.gitlab-ci.yml [new file with mode: 0644]
check.dcl
check.icl
int.dcl
int.icl
parse.dcl
parse.icl
rts/.gitignore [new file with mode: 0644]
rts/rts.c [moved from rts.c with 100% similarity]
rts/rts.h [moved from rts.h with 100% similarity]
scc.dcl
scc.icl
test.bash [new file with mode: 0644]
tests/bracket.expected [new file with mode: 0644]

index f89feb6..b9aa5aa 100644 (file)
@@ -4,3 +4,4 @@ minfp
 * Time Profile.pcl
 *.o
 *.prj
+.tags
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644 (file)
index 0000000..5294a2c
--- /dev/null
@@ -0,0 +1,8 @@
+image: camilstaps/clean:nightly
+test:
+    before_script:
+        - apt-get update -qq
+        - apt-get install -yy build-essential wget
+    script:
+        - install_clean_nightly.sh base lib-platform
+        - bash test.bash
index 3c2c8b2..8abb9db 100644 (file)
--- a/check.dcl
+++ b/check.dcl
@@ -8,4 +8,4 @@ from ast import :: Function, :: Expression, :: Type, :: TypeDef
 
 instance toString Scheme
 
-check :: [Either TypeDef Function] -> Either [String] (Expression, [([Char], Scheme)])
+check :: ![Either TypeDef Function] -> Either [String] (Expression, [([Char], Scheme)])
index cbd58f6..e56d555 100644 (file)
--- a/check.icl
+++ b/check.icl
@@ -18,7 +18,7 @@ import ast, scc
 
 import StdDebug
 
-check :: [Either TypeDef Function] -> Either [String] (Expression, [([Char], Scheme)])
+check :: ![Either TypeDef Function] -> Either [String] (Expression, [([Char], Scheme)])
 check tdfs
        # dups = filter (\x->length x > 1) (groupBy (\(Function i _ _) (Function j _ _)->i == j) functions)
        | length dups > 0 = Left ["Duplicate functions: ":[toString n\\[(Function n _ _):_]<-dups]]
diff --git a/int.dcl b/int.dcl
index 2e33982..fc51620 100644 (file)
--- a/int.dcl
+++ b/int.dcl
@@ -5,4 +5,4 @@ from ast import :: Expression, :: Value
 
 :: Eval a
 
-int :: Expression -> Either [String] Value
+int :: !Expression -> Either [String] Value
diff --git a/int.icl b/int.icl
index 5467559..f096200 100644 (file)
--- a/int.icl
+++ b/int.icl
@@ -15,7 +15,7 @@ import ast
 
 :: Eval a :== StateT [([Char], Value)] (Either [String]) a
 
-int :: Expression -> Either [String] Value
+int :: !Expression -> Either [String] Value
 int e = evalStateT (eval e)
        [(['_if'], Builtin \i->pure (Lit (Builtin \t->pure (Lit (Builtin \e->
                eval i >>= \(Bool b)->pure (if b t e))))))
index 2349c5d..21da778 100644 (file)
--- a/parse.dcl
+++ b/parse.dcl
@@ -6,5 +6,5 @@ from ast import :: Function, :: TypeDef
 
 :: Token
 instance toString Token
-lex :: [Char] -> Either [String] [Token]
-parse :: [Token] -> Either [String] [Either TypeDef Function]
+lex :: ![Char] -> Either [String] [Token]
+parse :: ![Token] -> Either [String] [Either TypeDef Function]
index b80bebb..847f1b3 100644 (file)
--- a/parse.icl
+++ b/parse.icl
@@ -25,7 +25,7 @@ derive gPrint Token
 
 instance toString Token where toString t = printToString t
 
-lex :: [Char] -> Either [String] [Token]
+lex :: ![Char] -> Either [String] [Token]
 lex [] = pure []
 lex ['//\n':ts] = lex ts
 lex ['//',t:ts] = lex ['/','/':ts]
@@ -95,7 +95,7 @@ pChainl op p = foldl (flip ($)) <$> p <*> many (flip <$> op <*> p)
 pChainr :: (Parser (a a -> a)) (Parser a) -> Parser a
 pChainr op p = flip ($) <$> p <*> (flip <$> op <*> pChainr op p) <|> p
 
-parse :: [Token] -> Either [String] [Either TypeDef Function]
+parse :: ![Token] -> Either [String] [Either TypeDef Function]
 parse ts = case runParser (many (Right <$> pFunction <|> Left <$> pTypeDef) <* pEof) ts [] of
        (Left e, _, _) = Left e
        (Right a, _, r) = sequence [reparse r a\\a<-a]
diff --git a/rts/.gitignore b/rts/.gitignore
new file mode 100644 (file)
index 0000000..5761abc
--- /dev/null
@@ -0,0 +1 @@
+*.o
diff --git a/rts.c b/rts/rts.c
similarity index 100%
rename from rts.c
rename to rts/rts.c
diff --git a/rts.h b/rts/rts.h
similarity index 100%
rename from rts.h
rename to rts/rts.h
diff --git a/scc.dcl b/scc.dcl
index 0bbe3c8..d9edde0 100644 (file)
--- a/scc.dcl
+++ b/scc.dcl
@@ -10,4 +10,4 @@ from StdClass import class Ord, class Eq
  * @param list of nodes together with their their successors
  * @return the strongly connected components
  */
-scc :: [(a, [a])] -> [[a]] | Eq, Ord a
+scc :: ![(a, [a])] -> [[a]] | Eq, Ord a
diff --git a/scc.icl b/scc.icl
index 0014f50..408e647 100644 (file)
--- a/scc.icl
+++ b/scc.icl
@@ -3,13 +3,13 @@ implementation module scc
 import StdEnv, StdMaybe
 import Data.Map => qualified updateAt
 
-:: St a  = {nextindex :: Int, stack :: [a], map :: Map a Annot, sccs :: [[a]]}
-:: Annot = {index :: Int, lowlink :: Int, onstack :: Bool}
+:: St a  = {nextindex :: !Int, stack :: ![a], map :: !Map a Annot, sccs :: ![[a]]}
+:: Annot = {index :: !Int, lowlink :: !Int, onstack :: !Bool}
 
-scc :: [(a, [a])] -> [[a]] | Eq, Ord a
+scc :: ![(a, [a])] -> [[a]] | Eq, Ord a
 scc nodes = reverse (foldr (strongconnect nodes) {nextindex=zero,stack=[],map=newMap,sccs=[]} nodes).sccs
 where
-       strongconnect :: [(a, [a])] (a, [a]) (St a) -> St a | Eq, Ord a
+       strongconnect :: ![(a, [a])] !(a, [a]) !(St a) -> St a | Eq, Ord a
        strongconnect nodes (v, suc) s
                | isJust (get v s.map) = s
                # s = foldr (processSucc nodes v)
@@ -26,7 +26,7 @@ where
                  , map      = foldr (alter \(Just s)->Just {s & onstack=False}) s.map scc
                  }
        where
-               processSucc :: [(a, [a])] a a (St a) -> St a | Eq, Ord a
+               processSucc :: ![(a, [a])] !a !a !(St a) -> St a | Eq, Ord a
                processSucc nodes v w s = case get w s.map of
                        Nothing
                                # n = filter ((==)w o fst) nodes
diff --git a/test.bash b/test.bash
new file mode 100644 (file)
index 0000000..8577bdb
--- /dev/null
+++ b/test.bash
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -e
+shopt -s nullglob
+
+make minfp
+
+[ $# -eq 0 ] && testfiles=(tests/*.mfp) || testfiles=("${@}")
+
+pass=0
+skip=0
+fail=0
+for t in "${testfiles[@]}"; do
+       if [ ! -f "$t" ]; then
+               echo "$t doesn't exist" >&2
+               exit 1
+       fi
+
+       exp="${t/%.mfp/.expected}"
+       if [ ! -f "$exp" ]; then
+               echo "$exp doesn't exist, skipping" >&2
+               skip=$((skip+1))
+       else
+               diff <(./minfp < "$t") "$exp"
+               [ $? -ne 0 ] && fail=$((fail+1)) || pass=$((pass+1))
+       fi
+done
+echo "passed : $pass" >&2
+echo "skipped: $skip" >&2
+echo "failed : $fail" >&2
diff --git a/tests/bracket.expected b/tests/bracket.expected
new file mode 100644 (file)
index 0000000..d81cc07
--- /dev/null
@@ -0,0 +1 @@
+42