rename case statement macro from match to case (#16923)

* rename case statement macro from match to `case`

* fix test
This commit is contained in:
hlaaftana 2021-02-08 21:35:06 +03:00 • committed by GitHub
commit 6a7baff97d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 16 deletions

View file

@ -947,11 +947,10 @@ the documentation of `spawn <#parallel-amp-spawn-spawn-statement>`_ for details.
Case statement macros
=====================
A macro that needs to be called `match`:idx: can be used to rewrite
``case`` statements in order to implement `pattern matching`:idx: for
certain types. The following example implements a simplistic form of
pattern matching for tuples, leveraging the existing equality operator
for tuples (as provided in ``system.==``):
Macros named `case` can rewrite `case` statements for certain types in order to
implement `pattern matching`:idx:. The following example implements a
simplistic form of pattern matching for tuples, leveraging the existing
equality operator for tuples (as provided in ``system.==``):
.. code-block:: nim
:test: "nim c $1"
@ -960,7 +959,7 @@ for tuples (as provided in ``system.==``):
import macros
macro match(n: tuple): untyped =
macro `case`(n: tuple): untyped =
result = newTree(nnkIfStmt)
let selector = n[0]
for i in 1 ..< n.len:
@ -973,8 +972,7 @@ for tuples (as provided in ``system.==``):
let cond = newCall("==", selector, it[j])
result.add newTree(nnkElifBranch, cond, it[^1])
else:
error "'match' cannot handle this node", it
echo repr result
error "custom 'case' for tuple cannot handle this node", it
case ("foo", 78)
of ("foo", 78): echo "yes"
@ -985,12 +983,12 @@ for tuples (as provided in ``system.==``):
Currently case statement macros must be enabled explicitly
via ``{.experimental: "caseStmtMacros".}``.
``match`` macros are subject to overload resolution. First the
``case``'s selector expression is used to determine which ``match``
macro to call. To this macro is then passed the complete ``case``
statement body and the macro is evaluated.
`case` macros are subject to overload resolution. The type of the
`case` statement's selector expression is matched against the type
of the first argument of the `case` macro. Then the complete `case`
statement is passed in place of the argument and the macro is evaluated.
In other words, the macro needs to transform the full ``case`` statement
In other words, the macro needs to transform the full `case` statement
but only the statement's selector expression is used to determine which
macro to call.