mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
follow up https://github.com/nim-lang/Nim/pull/22851 follow up https://github.com/nim-lang/Nim/pull/22873
39 lines
935 B
Nim
39 lines
935 B
Nim
#
|
|
#
|
|
# Nim's Runtime Library
|
|
# (c) Copyright 2022 Nim contributors
|
|
#
|
|
# See the file "copying.txt", included in this
|
|
# distribution, for details about the copyright.
|
|
#
|
|
|
|
## `outParamsAt` macro for easy writing code that works with both 2.0 and 1.x.
|
|
|
|
import std/macros
|
|
|
|
macro outParamsAt*(positions: static openArray[int]; n: untyped): untyped =
|
|
## Use this macro to annotate `out` parameters in a portable way.
|
|
runnableExamples:
|
|
proc p(x: var int) {.outParamsAt: [1].} =
|
|
discard "x is really an 'out int' if the Nim compiler supports 'out' parameters"
|
|
|
|
result = n
|
|
when defined(nimHasOutParams):
|
|
var p = n.params
|
|
for po in positions:
|
|
p[po][^2].expectKind nnkVarTy
|
|
p[po][^2] = newTree(nnkOutTy, p[po][^2][0])
|
|
|
|
when isMainModule:
|
|
{.experimental: "strictDefs".}
|
|
|
|
proc main(x: var int) {.outParamsAt: [1].} =
|
|
x = 3
|
|
|
|
proc us =
|
|
var x: int
|
|
main x
|
|
echo x
|
|
|
|
us()
|