Comments (3)
A clearer demo:
template valueOr*(def: untyped): int =
when false:
# Comment line below to make it work
template error(): int {.gensym.} = discard
discard
else:
template error(): int {.inject.} = 1
def
let rErrV = valueOr error
It seems the symbol capture doesn't cover edge cases, when it comes to gensym
from nim.
In addition,
maybe there is another factor:
template valueOr*(def: untyped): int =
template error(): int {.gensym.} = 1
def
let rErrV = valueOr error
gensym
is not considered when lookup
from nim.
Culprit is maybe this?
Line 264 in 94c5996
The gensym template is added to scope here and the injected template declaration finds it and reuses the symbol? Presumably to allow overloading the gensym'd symbol since adding gensym
again defines a different symbol, even though omitting gensym
implies inject
for routines. Then again why does gensym
again define a different symbol when we only get to use one at a time in the template?
We could move the gensym reuse logic inside the logic for when gensym
is given, if this breaks code we could allow opting out of the symbol reuse on an explicit inject
.
This is all letting alone the logic of actually using error
inside the template after the when block, also I'm speculating about all this from my phone so I might be wrong.
from nim.
Related Issues (20)
- Enum overloading regression HOT 4
- Nimsuggest - Methods marked with {.base.} trigger error on chk HOT 3
- Ref array causing Segfault HOT 4
- osproc.startProcess should support "not following symlinks" HOT 2
- When `move` meets` sink`, `= sink` hook function is not called HOT 4
- [ignore] bisect HOT 7
- Error: type mismatch: got <typedesc[A]>, but expected one of: A = proc (){.closure.}
- Default object values silently override generic types
- Enum Overloading Regression? HOT 4
- async `and` swallows errors
- Async `finally` swallows errors when it contains an `await` wrapped by `try/except`
- The `when nimvm` statement fails to compile when in a file called nimvm.nim HOT 4
- Regression from 2.0 to `devel` with `dirty` template HOT 2
- Async memory leak when raising exception on ORC HOT 1
- unicode.splitWhitespace() and strutils.splitWhitespace() have different results for ASCII string
- Wrong stack trace when exception is raised in template HOT 1
- Error: cannot evaluate at compile time: foo HOT 4
- nim check crashes
- Any differnece between value types and reference types for `=sink` ? HOT 1
- Simple destructor code gives invalid C HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nim.