mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 14:00:35 +00:00
splitted echo into echo/debugEcho
This commit is contained in:
@@ -19,4 +19,5 @@
|
||||
# * checks for invalid usages of PNimNode
|
||||
# * later: will do an escape analysis for closures at least
|
||||
|
||||
|
||||
proc sem2(c: PContext, n: PNode): PNode =
|
||||
nil
|
||||
|
||||
@@ -44,19 +44,6 @@ Fortunately Nimrod supports side effect analysis:
|
||||
echo "side effect!"
|
||||
result = 55
|
||||
|
||||
echo f() * 2 # and still optimized ;-)
|
||||
|
||||
The reason is that the compiler does not consider 'echo' to have side effects
|
||||
for debugging convenience (this is comparable to Haskell's ``UnsafeIO`` monad).
|
||||
So lets try it with a "real" side effect:
|
||||
|
||||
.. code-block:: nimrod
|
||||
template optMul{`*`(a, 2)}(a: int{noSideEffect}): int = a+a
|
||||
|
||||
proc f(): int =
|
||||
writeln stdout, "side effect!"
|
||||
result = 55
|
||||
|
||||
echo f() * 2 # not optimized ;-)
|
||||
|
||||
So what about ``2 * a``? We should tell the compiler ``*`` is commutative. We
|
||||
|
||||
@@ -1648,7 +1648,7 @@ else:
|
||||
|
||||
proc add*(x: var cstring, y: cstring) {.magic: "AppendStrStr".}
|
||||
|
||||
proc echo*[T](x: varargs[T, `$`]) {.magic: "Echo", noSideEffect.}
|
||||
proc echo*[T](x: varargs[T, `$`]) {.magic: "Echo".}
|
||||
## special built-in that takes a variable number of arguments. Each argument
|
||||
## is converted to a string via ``$``, so it works for user-defined
|
||||
## types that have an overloaded ``$`` operator.
|
||||
@@ -1656,10 +1656,11 @@ proc echo*[T](x: varargs[T, `$`]) {.magic: "Echo", noSideEffect.}
|
||||
## available for the ECMAScript target too.
|
||||
## Unlike other IO operations this is guaranteed to be thread-safe as
|
||||
## ``echo`` is very often used for debugging convenience.
|
||||
##
|
||||
## As a special semantic rule, ``echo`` pretends to be free of
|
||||
## side effects, so that it can be used for debugging routines marked as
|
||||
## ``noSideEffect``.
|
||||
|
||||
proc debugEcho*[T](x: varargs[T, `$`]) {.magic: "Echo", noSideEffect.}
|
||||
## Same as ``echo``, but as a special semantic rule, ``debugEcho`` pretends
|
||||
## to be free of side effects, so that it can be used for debugging routines
|
||||
## marked as ``noSideEffect``.
|
||||
|
||||
template newException*(exceptn: typeDesc, message: string): expr =
|
||||
## creates an exception object of type ``exceptn`` and sets its ``msg`` field
|
||||
|
||||
Reference in New Issue
Block a user