git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Add very basic support for let bindings. Does not support local function definitions.
b073973Phil Freeman
examples/passing/Let.pursnew file+18
@@ -0,0 +1,18 @@
1+module Main where
2+
3+import Prelude
4+import Eff
5+
6+test1 x = let y = x + 1 in y
7+
8+test2 x y =
9+ let x' = x + 1 in
10+ let y' = y + 1 in
11+ x' + y'
12+
13+test3 x = let 1 = x in 2
14+
15+main = do
16+ Trace.print (test1 1)
17+ Trace.print (test2 1 2)
18+ Trace.print (test3 1)
purescript.cabal+1
@@ -35,6 +35,7 @@ library
35 Language.PureScript.Sugar.BindingGroups
35 Language.PureScript.Sugar.BindingGroups
36 Language.PureScript.Sugar.Operators
36 Language.PureScript.Sugar.Operators
37 Language.PureScript.Sugar.TypeClasses
37 Language.PureScript.Sugar.TypeClasses
38+ Language.PureScript.Sugar.Let
38 Language.PureScript.CodeGen
39 Language.PureScript.CodeGen
39 Language.PureScript.CodeGen.Common
40 Language.PureScript.CodeGen.Common
40 Language.PureScript.CodeGen.Externs
41 Language.PureScript.CodeGen.Externs
src/Language/PureScript/Parser/Common.hs+2−1
@@ -49,7 +49,8 @@ reservedPsNames = [ "data"
49 , "true"
49 , "true"
50 , "false"
50 , "false"
51 , "until"
51 , "until"
52−
52+ , "let"
53+ , "in"
53 ]
54 ]
54
55
55-- |
56-- |
src/Language/PureScript/Parser/Values.hs+15
@@ -82,6 +82,20 @@ parseIfThenElse = IfThenElse <$> (P.try (C.reserved "if") *> C.indented *> parse
82 <*> (C.indented *> C.reserved "then" *> C.indented *> parseValue)
82 <*> (C.indented *> C.reserved "then" *> C.indented *> parseValue)
83 <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
83 <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
84
84
85+parseLet :: P.Parsec String ParseState Value
86+parseLet = do
87+ C.reserved "let"
88+ C.indented
89+ binder <- parseBinder
90+ C.indented
91+ C.reservedOp "="
92+ C.indented
93+ value <- parseValue
94+ C.indented
95+ C.reserved "in"
96+ result <- parseValue
97+ return $ Let binder value result
98+
85parseValueAtom :: P.Parsec String ParseState Value
99parseValueAtom :: P.Parsec String ParseState Value
86parseValueAtom = P.choice
100parseValueAtom = P.choice
87 [ P.try parseNumericLiteral
101 [ P.try parseNumericLiteral
@@ -95,6 +109,7 @@ parseValueAtom = P.choice
95 , parseCase
109 , parseCase
96 , parseIfThenElse
110 , parseIfThenElse
97 , parseDo
111 , parseDo
112+ , parseLet
98 , Parens <$> C.parens parseValue ]
113 , Parens <$> C.parens parseValue ]
99
114
100parsePropertyUpdate :: P.Parsec String ParseState (String, Value)
115parsePropertyUpdate :: P.Parsec String ParseState (String, Value)
src/Language/PureScript/Sugar.hs+6−1
@@ -16,6 +16,7 @@
16module Language.PureScript.Sugar (desugar, module S) where
16module Language.PureScript.Sugar (desugar, module S) where
17
17
18import Control.Monad
18import Control.Monad
19+import Control.Arrow ((>>>))
19
20
20import Language.PureScript.Declarations
21import Language.PureScript.Declarations
21
22
@@ -25,10 +26,13 @@ import Language.PureScript.Sugar.CaseDeclarations as S
25import Language.PureScript.Sugar.TypeDeclarations as S
26import Language.PureScript.Sugar.TypeDeclarations as S
26import Language.PureScript.Sugar.BindingGroups as S
27import Language.PureScript.Sugar.BindingGroups as S
27import Language.PureScript.Sugar.TypeClasses as S
28import Language.PureScript.Sugar.TypeClasses as S
29+import Language.PureScript.Sugar.Let as S
28
30
29-- |
31-- |
30-- The desugaring pipeline proceeds as follows:
32-- The desugaring pipeline proceeds as follows:
31--
33--
34+-- * Desugar let bindings
35+--
32-- * Introduce type synonyms for type class dictionaries
36-- * Introduce type synonyms for type class dictionaries
33--
37--
34-- * Rebracket user-defined binary operators
38-- * Rebracket user-defined binary operators
@@ -45,6 +49,7 @@ desugar :: [Module] -> Either String [Module]
45desugar = desugarTypeClasses
49desugar = desugarTypeClasses
46 >=> rebracket
50 >=> rebracket
47 >=> desugarDo
51 >=> desugarDo
52+ >=> desugarLetBindings
48− >=> desugarCasesModule
53+ >>> desugarCasesModule
49 >=> desugarTypeDeclarationsModule
54 >=> desugarTypeDeclarationsModule
50 >=> createBindingGroupsModule
55 >=> createBindingGroupsModule
src/Language/PureScript/Sugar/Let.hsnew file+32
@@ -0,0 +1,32 @@
1+-----------------------------------------------------------------------------
2+--
3+-- Module : Language.PureScript.Sugar.Let
4+-- Copyright : (c) Phil Freeman 2014
5+-- License : MIT
6+--
7+-- Maintainer : Phil Freeman <paf31@cantab.net>
8+-- Stability : experimental
9+-- Portability :
10+--
11+-- |
12+-- This module implements the desugaring pass which turns let bindings into function applications.
13+--
14+-----------------------------------------------------------------------------
15+
16+module Language.PureScript.Sugar.Let (
17+ desugarLetBindings
18+) where
19+
20+import Data.Generics (mkT, everywhere)
21+
22+import Language.PureScript.Values
23+import Language.PureScript.Declarations
24+
25+-- |
26+-- Turn let bindings into function applications
27+--
28+desugarLetBindings :: [Module] -> [Module]
29+desugarLetBindings = everywhere (mkT go)
30+ where
31+ go (Let binder value result) = Case [value] [([binder], Nothing, result)]
32+ go other = other
src/Language/PureScript/Values.hs+4
@@ -99,6 +99,10 @@ data Value
99 --
99 --
100 | TypedValue Bool Value Type
100 | TypedValue Bool Value Type
101 -- |
101 -- |
102+ -- A let binding
103+ --
104+ | Let Binder Value Value
105+ -- |
102 -- A do-notation block
106 -- A do-notation block
103 --
107 --
104 | Do [DoNotationElement]
108 | Do [DoNotationElement]