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.
commitb073973db71ee82d734b804a520ccb8827f625ab authorPhil Freeman <paf31@cantab.net> dateTue 11 Feb 2014, 15:54 (13 years ago) parent89d1b86
7 files changed+78−2
examples/passing/Let.purs+18 purescript.cabal+1 src/Language/PureScript/Parser/Common.hs+2−1 src/Language/PureScript/Parser/Values.hs+15 src/Language/PureScript/Sugar.hs+6−1 src/Language/PureScript/Sugar/Let.hs+32 src/Language/PureScript/Values.hs+4
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
3535 Language.PureScript.Sugar.BindingGroups
3636 Language.PureScript.Sugar.Operators
3737 Language.PureScript.Sugar.TypeClasses
38+ Language.PureScript.Sugar.Let
3839 Language.PureScript.CodeGen
3940 Language.PureScript.CodeGen.Common
4041 Language.PureScript.CodeGen.Externs
src/Language/PureScript/Parser/Common.hs+2−1
@@ -49,7 +49,8 @@ reservedPsNames = [ "data"
4949 , "true"
5050 , "false"
5151 , "until"
52−
52+ , "let"
53+ , "in"
5354 ]
5455
5556-- |
src/Language/PureScript/Parser/Values.hs+15
@@ -82,6 +82,20 @@ parseIfThenElse = IfThenElse <$> (P.try (C.reserved "if") *> C.indented *> parse
8282 <*> (C.indented *> C.reserved "then" *> C.indented *> parseValue)
8383 <*> (C.indented *> C.reserved "else" *> C.indented *> parseValue)
8484
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+
8599parseValueAtom :: P.Parsec String ParseState Value
86100parseValueAtom = P.choice
87101 [ P.try parseNumericLiteral
@@ -95,6 +109,7 @@ parseValueAtom = P.choice
95109 , parseCase
96110 , parseIfThenElse
97111 , parseDo
112+ , parseLet
98113 , Parens <$> C.parens parseValue ]
99114
100115parsePropertyUpdate :: P.Parsec String ParseState (String, Value)
src/Language/PureScript/Sugar.hs+6−1
@@ -16,6 +16,7 @@
1616module Language.PureScript.Sugar (desugar, module S) where
1717
1818import Control.Monad
19+import Control.Arrow ((>>>))
1920
2021import Language.PureScript.Declarations
2122
@@ -25,10 +26,13 @@ import Language.PureScript.Sugar.CaseDeclarations as S
2526import Language.PureScript.Sugar.TypeDeclarations as S
2627import Language.PureScript.Sugar.BindingGroups as S
2728import Language.PureScript.Sugar.TypeClasses as S
29+import Language.PureScript.Sugar.Let as S
2830
2931-- |
3032-- The desugaring pipeline proceeds as follows:
3133--
34+-- * Desugar let bindings
35+--
3236-- * Introduce type synonyms for type class dictionaries
3337--
3438-- * Rebracket user-defined binary operators
@@ -45,6 +49,7 @@ desugar :: [Module] -> Either String [Module]
4549desugar = desugarTypeClasses
4650 >=> rebracket
4751 >=> desugarDo
48− >=> desugarCasesModule
52+ >=> desugarLetBindings
53+ >>> desugarCasesModule
4954 >=> desugarTypeDeclarationsModule
5055 >=> 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
9999 --
100100 | TypedValue Bool Value Type
101101 -- |
102+ -- A let binding
103+ --
104+ | Let Binder Value Value
105+ -- |
102106 -- A do-notation block
103107 --
104108 | Do [DoNotationElement]