diff options
author | Alp Mestanogullari <alpmestan@gmail.com> | 2020-03-13 17:41:37 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-07-14 21:30:52 -0400 |
commit | 118e1c3da622f17c67b4e0fbc12ed7c7084055dc (patch) | |
tree | 2468e0ab92966c06663c95b2de7f2e0702432312 /docs | |
parent | 7f0b671ee8a65913891c07f157b21d77d6c63036 (diff) | |
download | haskell-118e1c3da622f17c67b4e0fbc12ed7c7084055dc.tar.gz |
compiler: re-engineer the treatment of rebindable if
Executing on the plan described in #17582, this patch changes the way if expressions
are handled in the compiler in the presence of rebindable syntax. We get rid of the
SyntaxExpr field of HsIf and instead, when rebindable syntax is on, we rewrite the HsIf
node to the appropriate sequence of applications of the local `ifThenElse` function.
In order to be able to report good error messages, with expressions as they were
written by the user (and not as desugared by the renamer), we make use of TTG
extensions to extend GhcRn expression ASTs with an `HsExpansion` construct, which
keeps track of a source (GhcPs) expression and the desugared (GhcRn) expression that
it gives rise to. This way, we can typecheck the latter while reporting the former in
error messages.
In order to discard the error context lines that arise from typechecking the desugared
expressions (because they talk about expressions that the user has not written), we
carefully give a special treatment to the nodes fabricated by this new renaming-time
transformation when typechecking them. See Note [Rebindable syntax and HsExpansion]
for more details. The note also includes a recipe to apply the same treatment to
other rebindable constructs.
Tests 'rebindable11' and 'rebindable12' have been added to make sure we report
identical error messages as before this patch under various circumstances.
We also now disable rebindable syntax when processing untyped TH quotes, as per
the discussion in #18102 and document the interaction of rebindable syntax and
Template Haskell, both in Note [Template Haskell quotes and Rebindable Syntax]
and in the user guide, adding a test to make sure that we do not regress in
that regard.
Diffstat (limited to 'docs')
-rw-r--r-- | docs/users_guide/exts/template_haskell.rst | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/docs/users_guide/exts/template_haskell.rst b/docs/users_guide/exts/template_haskell.rst index a97f9a8f6b..f1319b904e 100644 --- a/docs/users_guide/exts/template_haskell.rst +++ b/docs/users_guide/exts/template_haskell.rst @@ -542,6 +542,30 @@ Run :file:`main` and here is your output: $ ./main Hello +.. _th-rs: + +Template Haskell quotes and Rebindable Syntax +--------------------------------------------- + +Rebindable syntax does not play well with untyped TH quotes: +applying the rebindable syntax rules would go against the lax +nature of untyped quotes that are accepted even in the presence of +unbound identifiers (see :ghc-ticket:`18102`). Applying the rebindable syntax +rules to them would force the code that defines the said quotes to have all +the necessary functions (e.g ``ifThenElse`` or ``fromInteger``) in scope, +instead of delaying the resolution of those symbols to the code that splices +the quoted Haskell syntax, as is usually done with untyped TH. For this reason, +even if a module has untyped TH quotes with ``RebindableSyntax`` enabled, GHC +turns off rebindable syntax while processing the quotes. The code that splices +the quotes is however free to turn on ``RebindableSyntax`` to have the usual +rules applied to the resulting code. + +Typed TH quotes on the other hand are perfectly compatible with the eager +application of rebindable syntax rules, and GHC will therefore process any +such quotes according to the rebindable syntax rules whenever the +``RebindableSyntax`` extension is turned on in the modules where such quotes +appear. + .. _th-profiling: Using Template Haskell with Profiling |