manual: more precise rules about evaluation order
This commit is contained in:
parent
ddc155af64
commit
1ccff0324c
1 changed files with 38 additions and 0 deletions
|
|
@ -721,6 +721,44 @@ Rationale: Consistency with overloaded assignment or assignment-like operations,
|
||||||
``a = b`` can be read as ``performSomeCopy(a, b)``.
|
``a = b`` can be read as ``performSomeCopy(a, b)``.
|
||||||
|
|
||||||
|
|
||||||
|
However, the concept of "order of evaluation" is only applicable after the code
|
||||||
|
was normalized: The normalization involves template expansions and argument
|
||||||
|
reorderings that have been passed to named parameters:
|
||||||
|
|
||||||
|
.. code-block:: nim
|
||||||
|
:test: "nim c $1"
|
||||||
|
|
||||||
|
var s = ""
|
||||||
|
|
||||||
|
proc p(): int =
|
||||||
|
s.add "p"
|
||||||
|
result = 5
|
||||||
|
|
||||||
|
proc q(): int =
|
||||||
|
s.add "q"
|
||||||
|
result = 3
|
||||||
|
|
||||||
|
# Evaluation order is 'b' before 'a' due to template
|
||||||
|
# expansion's semantics.
|
||||||
|
template swapArgs(a, b): untyped =
|
||||||
|
b + a
|
||||||
|
|
||||||
|
doAssert swapArgs(p() + q(), q() - p()) == 6
|
||||||
|
doAssert s == "qppq"
|
||||||
|
|
||||||
|
# Evaluation order is not influenced by named parameters:
|
||||||
|
proc construct(first, second: int) =
|
||||||
|
discard
|
||||||
|
|
||||||
|
# 'p' is evaluated before 'q'!
|
||||||
|
construct(second = q(), first = p())
|
||||||
|
|
||||||
|
doAssert s == "qppqpq"
|
||||||
|
|
||||||
|
|
||||||
|
Rationale: This is far easier to implement than hypothetical alternatives.
|
||||||
|
|
||||||
|
|
||||||
Constants and Constant Expressions
|
Constants and Constant Expressions
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue