Request for input on #7253: Top-level bindings in GHCI

I'm thinking of working on this ticket ( https://ghc.haskell.org/trac/ghc/ticket/7253), so, as per mpickering's suggestion (https://phabricator.haskell.org/chatlog/channel/3/?at=1353572), I'm emailing the list to solicit input. My first instinct was to treat declarations like "a = 1" in GHCI as equivalent to "let a = 1"; this would be a straightforward matter of parsing. On the other hand, as thoughtpolice comments, let-bound variables are treated subtly differently than top-level bindings, so the proper solution may be more involved. Comments?

I would suggest treating "a = 1" as a declaration. This is what IHaskell
does, and it seems more intuitive than hacky parsing it into a "let a = 1".
The implementation should be easy using runDecls from InteractiveEval and
parseDeclaration from Parser.y to do the actual parsing.
-- Andrew
On Sat, Aug 22, 2015 at 8:50 AM, Alex Rozenshteyn
I'm thinking of working on this ticket ( https://ghc.haskell.org/trac/ghc/ticket/7253), so, as per mpickering's suggestion (https://phabricator.haskell.org/chatlog/channel/3/?at=1353572), I'm emailing the list to solicit input.
My first instinct was to treat declarations like "a = 1" in GHCI as equivalent to "let a = 1"; this would be a straightforward matter of parsing. On the other hand, as thoughtpolice comments, let-bound variables are treated subtly differently than top-level bindings, so the proper solution may be more involved.
Comments?
_______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

I don't think there is a user-visible difference between treating "a = 1" as a declaration vs as a let. One might be easier to implement.
My guess is that Austin's thought in that chat log is around MonoLocalBinds. MonoLocalBinds (implied by GADTs and TypeFamilies) means that some let declarations are not generalized. In particular, let declarations that are manifestly *not* top-level. Like this:
foo x = let y = x in y
That `y` is manifestly not top-level because its RHS mentions a local variable. So, `y` is not generalized if MonoLocalBinds is in effect.
But, in GHCi, this matters not. Anything the user writes in a top-level variable assignment can only possibly refer to top-level things, never to local things (because there are no local things). So MonoLocalBinds will not trigger, and treating an assignment as either a declaration or a "let" should have the same meaning.
Richard
On Aug 22, 2015, at 11:50 AM, Alex Rozenshteyn
I'm thinking of working on this ticket (https://ghc.haskell.org/trac/ghc/ticket/7253), so, as per mpickering's suggestion (https://phabricator.haskell.org/chatlog/channel/3/?at=1353572), I'm emailing the list to solicit input.
My first instinct was to treat declarations like "a = 1" in GHCI as equivalent to "let a = 1"; this would be a straightforward matter of parsing. On the other hand, as thoughtpolice comments, let-bound variables are treated subtly differently than top-level bindings, so the proper solution may be more involved.
Comments? _______________________________________________ ghc-devs mailing list ghc-devs@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
participants (3)
-
Alex Rozenshteyn
-
Andrew Gibiansky
-
Richard Eisenberg