| FunExpr Pos String [Expr] [FieldSelector]
| EmptyListExpr Pos
| TupleExpr Pos (Expr, Expr)
+ | LambdaExpr Pos [String] Expr
:: VarDef = VarDef String [FieldSelector]
:: FieldSelector = FieldHd | FieldTl | FieldFst | FieldSnd
:: Op1 = UnNegation | UnMinus
print (FunExpr _ id as fs) = printFunCall id as fs
print (EmptyListExpr _) = ["[]"]
print (TupleExpr _ (e1, e2)) = ["(":print e1] ++ [",":print e2] ++ [")"]
+ print (LambdaExpr _ args e) = ["\\":args] ++ ["->": print e]
instance toString Expr where
toString e = concat $ print e
-//Let Int a = 4;//
-
-//mapP1(xs) {
-// if(isEmpty(xs)) {
-// return [];
-// } else {
-// return (xs.hd + 1) : mapP1(xs.tl);
-// }
-//}
-//main() {
-// [Int] x = [];
-// [Int] y = [];
-// Int z = a();
-// x = mapP1(x);
-// y = mapP1(x);
-// return a() + 5;
-//}
-
plus(x,y){
return x+y;
}
var x = foldr(plus, 0, 1:2:[]);
print(x);
return;
+>>>>>>> master
}
\ No newline at end of file
,Instr "ldc" [Lit 0] ""
,Instr "sth" [] ""
,Instr "ajs" [Lit -1] ""]
+ g (LambdaExpr _ _ _) = liftT $ Left $ Error "PANIC: Lambdas should be unfolded"
g (FunExpr _ k es fs) = funnyStuff k es fs
funnyStuff :: String [Expr] [FieldSelector] -> Gen ()
| 'return' [<Expr>] ';'
<VarDecl> ::= <Type> <id> '=' <Expr> ';'
<Expr> ::= <BinOrExpr> [':' <Expr>]
+ | <LambdaExpr>
<BinOrExpr> ::= <BinAndExpr> ['||' <BinOrExpr>]
<BinAndExpr> ::= <CompareExpr> ['&&' <BinAndExpr>]
<CompareExpr> ::= <PlusMinExpr> [('==' | '<' | '>' | '<=' | '>=' | '!=') <CompareExpr>]
| '[]' <Expr>
| '(' <Expr> ',' <Expr> ')'
| '"' <char> '"'
+<LamdaExpr> ::= '\'<id>+ '->' <Expr>
<FieldSels> ::= ('.' ('hd'|'tl'|'fst'|'snd))*
<FunCall> ::= <id> ['(' <ActArgs>+ ')']
<ActArgs> ::= <Expr> [',' ActArgs]
| LesserToken // <
| BiggerToken // >
| ExclamationToken // !
+ | BackslashToken // \
:: LexerOutput :== Either Error [Token]
lexWord "/" SlashToken <|> lexWord "%" PercentToken <|>
lexWord "=" AssignmentToken <|> lexWord "<" LesserToken <|>
lexWord ">" BiggerToken <|> lexWord "!" ExclamationToken <|>
- lexWord "-" DashToken <|>
+ lexWord "-" DashToken <|> lexWord "\\" BackslashToken <|>
//Number and identifier tokens
lexString <|> lexNumber <|> lexIdentifier <|>
(item '\n' >>| pure LexNL) <|>
(IdType <$> parseIdent)
parseExpr :: Parser Token Expr
-parseExpr = //Operators in order of binding strength
+parseExpr = parseValueExpr <|> parseLambda
+parseValueExpr :: Parser Token Expr
+parseValueExpr = //Operators in order of binding strength
parseOpR (trans1 ColonToken BiCons) $
parseOpR (trans1 PipesToken BiOr) $
parseOpR (trans1 AmpersandsToken BiAnd) $
pure $ FunExpr pos ident args fs) <|>
(VarExpr pos <$> parseVarDef)
+parseLambda :: Parser Token Expr
+parseLambda = LambdaExpr <$> peekPos
+ <*> (satTok BackslashToken *> some parseIdent)
+ <*> (satTok ArrowToken *> parseExpr)
+
makeStrExpr :: Pos [Char] -> Expr
makeStrExpr p [] = EmptyListExpr p
makeStrExpr p [x:xs] = Op2Expr p (CharExpr zero x) BiCons (makeStrExpr p xs)
from Data.Func import $
from StdFunc import o, flip, const, id
+import Control.Applicative
import Control.Monad
import Control.Monad.Trans
import Control.Monad.State
_ = Left $ SanityError p "main has to return Void")
isNiceMain _ = pure ()
+unfoldLambda :: [FunDecl] -> Typing [FunDecl]
+unfoldLambda [fd:fds] = unf_ fd >>= \fds1->
+ unfoldLambda fds >>= \fds2->
+ pure $ fds1 ++ fds2
+where
+ unf_ :: FunDecl -> Typing [FunDecl]
+ unf_ fd=:(FunDecl _ _ _ _ vds stmts) =
+ flatten <$> mapM unfv_ vds >>= \fds1->
+ flatten <$> mapM unfs_ stmts >>= \fds2->
+ pure $ [fd:fds1] ++ fds2
+ unfv_ :: VarDecl -> Typing [FunDecl]
+ unfv_ (VarDecl _ _ _ e) = pure []
+ unfs_ :: Stmt -> Typing [FunDecl]
+ unfs_ _ = pure []
+
class Typeable a where
ftv :: a -> [TVar]
subst :: Substitution a -> a
infer e2 >>= \(s2, t2, e2_) ->
pure (compose s2 s1, TupleType (t1,t2), TupleExpr p (e1_,e2_))
+ LambdaExpr _ _ _ = liftT $ Left $ Error "PANIC: lambdas should be Unfolded"
+
FunExpr p f args fs =
lookup f >>= \expected ->
let accST = (\(s,ts,es) e->infer e >>= \(s_,et,e_)-> pure (compose s_ s,ts++[et],es++[e_])) in