
#11706: Increase precedence of lexps (if-then-else, case-of, do, lambda and let-in) -------------------------------------+------------------------------------- Reporter: YoYoYonnY | Owner: Type: feature request | Status: infoneeded Priority: lowest | Milestone: ⊥ Component: Compiler | Version: (Parser) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Description changed by YoYoYonnY: @@ -1,2 +1,1 @@ - Warning: Skip to the {{{TL; DR}}}, and maybe the {{{How it works}}} - section; You don't want to read this. (I've warned you.) + == Intro == @@ -4,41 +3,2 @@ - == The problem == - - We do it all the time: Writing that one dollar sign just before our - expressions, just because Haskell can't parse it: - - {{{#!hs - f x = g $ if x then {- ... -} else {- ... -} - f x = g $ case x of {- ... -} - f x = g $ do {- ... -} - }}} - - However, we programmers are lazy and want to type as few characters as - possible. Think about the precious characters we would save if we could - write code this way: - - {{{#!hs - f x = g if x then {- ... -} else {- ... -} - f x = g case x of {- ... -} - f x = g do {- ... -} - }}} - - Wow, our productivity just shot up by a whopping 6%! - - However, this code looks ugly, noone would ever write this... Right? - There has to be some way to catagorize this feature with others people - would never use... - - == Pragmas to the rescue! == - - The {{{LANGUAGE}}} pragma! Of course! We can add a syntactic extension to - enable above syntax! But how should we name it... - - {{{InlineStatements}}}? {{{InfixStatements}}}? - {{{ParenthesizedStatements}}}? {{{IncreasedStatementPrecedence}}}? - {{{StatementsWithoutParenthesis}}}? - - I don't know. I am [1] not the parents who might one day give birth to - this feature. I am merely the one who conceptualized it. - - [1] (probably, unless this request remains unnoticed for another 20 years - or so) + For readability, the intro is now available [http://pastebin.com/8Fsh7pAE + here]. @@ -48,1 +8,1 @@ - * Implicit parenthesis will be put around ''all'' statements, according + * Implicit parenthesis will be put around ''all'' {{{lexps}}}, according @@ -50,5 +10,5 @@ - 1. Parenthesis will be opened at the start of the statement. - 2. Parenthesis will be closed at the end of the statement. The end of - the statement is determined by - 1. The curly brackets around the statement, or; - 2. The indentation of the statement + 1. Parenthesis will be opened at the start of the {{{lexp}}}. + 2. Parenthesis will be closed at the end of the {{{lexp}}}. The end of + the {{{lexp}}} is determined by + 1. The curly brackets around the {{{lexp}}} (If possible), or; + 2. The indentation of the {{{lexp}}} @@ -58,2 +18,5 @@ - Sorry if this is obvious, but some people seemed to get confused, so - here's some examples: + As for the Context-Free Syntax found at + https://www.haskell.org/onlinereport/haskell2010/haskellch10.html#x17-17800010.3|layout, + {{{lexp}}} would have to be moved up, dropped out of {{{infixexp}}}, and + added into {{{exp}}} (As well as a few other places in {{{aexp}}} and + {{{guard}}}) @@ -61,1 +24,1 @@ - === (Correct) Examples === + == Motivation == @@ -63,1 +26,2 @@ - Examples are in the form: + As for my personal motivation, I think that, with all the other syntactic + extensions already implemented, this feature is definitly missing. @@ -65,2 +29,4 @@ - {{{#!hs - implicitParenthesis -- New syntax + As Richard Eisenberg already pointed out (See + [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12 in this + comment]); combining {{{lexp}}} with {{{aexp}}} would make the Haskell + syntax more consistent. @@ -68,2 +34,2 @@ - explicitParenthesis -- Old syntax - }}} + bgamari listed above argument and quite a few other pros and cons + [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12 here]. @@ -71,2 +37,1 @@ - Call {{{idM :: Monad m => m a -> m a}}} as {{{idM :: IO String -> IO - String}}}. + A few arguments not listed there: @@ -74,4 +39,8 @@ - {{{#!hs - idM do - putStrLn "What's my name?" - getLine + * If the Haskell community ever decides to implement this feature in the + main language, we will already be prepared. + * Similairly, if this feature ever gives problems or adds new interesting + possibilities to the language, we will be prepared. + * Yet another syntactical extension means yet another thing to look out + for; + * However, this also means people will become more aware of LANGUAGE + pragmas. @@ -79,2 +48,1 @@ - idM (do { putStrLn "What's my name?"; getLine; }) - }}} + == Naming == @@ -82,1 +50,1 @@ - Create function {{{whatsMyName :: Maybe String -> String}}}. + Here follow a few suggestions for the name of this extension: @@ -84,4 +52,5 @@ - {{{#!hs - whatsMyName x = id case x of - Just name = "My name is " ++ name - Nothing = "What's my name?" + * InlineStatements + * InfixStatements + * ParenthesizedStatements + * IncreasedStatementPrecedence + * StatementsWithoutParenthesis @@ -89,3 +58,2 @@ - whatsMyName x = id (case x of { Just name = "My name is " ++ name; Nothing - = "What's my name?"; }) - }}} + Here are some more, taken from [https://mail.haskell.org/pipermail + /haskell-cafe/2015-September/121217.html over here]. @@ -93,1 +61,2 @@ - Another example using {{{let}}} and {{{if-then-else}}}. + * ArgumentBlock + * ArgumentDo @@ -95,10 +64,1 @@ - {{{#!hs - main = putStrLn - (++) - "I've been tryna work it out... The square root of 69 is 8 - something, right? " - let - eight_something = 8.306623862918075 - in if sqrt 69 == eight_something - then "Yeah" - else "Oh na na" + == Examples == @@ -106,4 +66,1 @@ - main = putStrLn ((++) "I've been tryna work it out... The square root of - 69 is 8 something, right? " (let eight_something = 8.306623862918075 in - (if sqrt 69 == eight_something then "Yeah" else "Oh na na")) - }}} + Examples can now be found [http://pastebin.com/6kLQvKs9 here]. @@ -111,1 +68,1 @@ - === Incorrect examples === + == Resources == @@ -113,40 +70,6 @@ - {{{#!hs - f do - putStrLn "This won't work..." - True - - f (do { putStrLn "This won't work..."; True; }) - }}} - - {{{#!hs - f - do - putStrLn "This won't work..." - True -- Indented by extra space - - f (do { putStrLn "This won't work..."; True; }) - }}} - - == TL; DR == - - What there is: - - {{{#!hs - - main = when $ do putStrLn "Parenthesis..." - main = when True (do putStrLn "Parenthesis...") - - }}} - - What I want: - - {{{#!hs - - when (doBlocksNeedParenthesis) do putStrLn "This code is invalid." - when (doBlocksNeedParenthesis) $ do putStrLn "This code is valid." - when (doBlocksNeedParenthesis) (do putStrLn "This code is valid aswell.") - when (thisIsImplemented) do putStrLn "These are all equal" - when (thisIsImplemented) (do putStrLn "These are all equal") - when (thisIsImplemented) $ do putStrLn "These are all equal" - - }}} + [1] Cheesy intro: http://pastebin.com/8Fsh7pAE + [2] Original examples: [http://pastebin.com/6kLQvKs9] + [3] Pros and Cons: + [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12] + [4] ArgumentBlock proposal: [https://mail.haskell.org/pipermail/haskell- + cafe/2015-September/121217.html] New description: == Intro == For readability, the intro is now available [http://pastebin.com/8Fsh7pAE here]. == How it works == * Implicit parenthesis will be put around ''all'' {{{lexps}}}, according to the following rules: 1. Parenthesis will be opened at the start of the {{{lexp}}}. 2. Parenthesis will be closed at the end of the {{{lexp}}}. The end of the {{{lexp}}} is determined by 1. The curly brackets around the {{{lexp}}} (If possible), or; 2. The indentation of the {{{lexp}}} Basically, these are the rule Haskell already uses. As for the Context-Free Syntax found at https://www.haskell.org/onlinereport/haskell2010/haskellch10.html#x17-17800010.3|layout, {{{lexp}}} would have to be moved up, dropped out of {{{infixexp}}}, and added into {{{exp}}} (As well as a few other places in {{{aexp}}} and {{{guard}}}) == Motivation == As for my personal motivation, I think that, with all the other syntactic extensions already implemented, this feature is definitly missing. As Richard Eisenberg already pointed out (See [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12 in this comment]); combining {{{lexp}}} with {{{aexp}}} would make the Haskell syntax more consistent. bgamari listed above argument and quite a few other pros and cons [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12 here]. A few arguments not listed there: * If the Haskell community ever decides to implement this feature in the main language, we will already be prepared. * Similairly, if this feature ever gives problems or adds new interesting possibilities to the language, we will be prepared. * Yet another syntactical extension means yet another thing to look out for; * However, this also means people will become more aware of LANGUAGE pragmas. == Naming == Here follow a few suggestions for the name of this extension: * InlineStatements * InfixStatements * ParenthesizedStatements * IncreasedStatementPrecedence * StatementsWithoutParenthesis Here are some more, taken from [https://mail.haskell.org/pipermail /haskell-cafe/2015-September/121217.html over here]. * ArgumentBlock * ArgumentDo == Examples == Examples can now be found [http://pastebin.com/6kLQvKs9 here]. == Resources == [1] Cheesy intro: http://pastebin.com/8Fsh7pAE [2] Original examples: [http://pastebin.com/6kLQvKs9] [3] Pros and Cons: [https://ghc.haskell.org/trac/ghc/ticket/10843#comment:12] [4] ArgumentBlock proposal: [https://mail.haskell.org/pipermail/haskell- cafe/2015-September/121217.html] -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11706#comment:2 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler