mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +00:00
63 lines
1.2 KiB
Nim
63 lines
1.2 KiB
Nim
discard """
|
|
output: "20\n10"
|
|
nimout: '''
|
|
INFERRED int
|
|
VALUE TYPE int
|
|
VALUE TYPE NAME INT
|
|
IMPLICIT INFERRED int int
|
|
IMPLICIT VALUE TYPE int int
|
|
IMPLICIT VALUE TYPE NAME INT INT
|
|
'''
|
|
"""
|
|
|
|
import typetraits, strutils
|
|
|
|
template reject(e) =
|
|
static: assert(not compiles(e))
|
|
|
|
type
|
|
ArrayStack = object
|
|
data: seq[int]
|
|
|
|
proc push(s: var ArrayStack, item: int) =
|
|
s.data.add item
|
|
|
|
proc pop(s: var ArrayStack): int =
|
|
return s.data.pop()
|
|
|
|
type
|
|
Stack[T] = concept var s
|
|
s.push(T)
|
|
s.pop() is T
|
|
|
|
type ValueType = T
|
|
const ValueTypeName = T.name.toUpperAscii
|
|
|
|
proc genericAlgorithm[T](s: var Stack[T], y: T) =
|
|
static:
|
|
echo "INFERRED ", T.name
|
|
echo "VALUE TYPE ", s.ValueType.name
|
|
echo "VALUE TYPE NAME ", s.ValueTypeName
|
|
|
|
s.push(y)
|
|
echo s.pop
|
|
|
|
proc implicitGeneric(s: var Stack): auto =
|
|
static:
|
|
echo "IMPLICIT INFERRED ", s.T.name, " ", Stack.T.name
|
|
echo "IMPLICIT VALUE TYPE ", s.ValueType.name, " ", Stack.ValueType.name
|
|
echo "IMPLICIT VALUE TYPE NAME ", s.ValueTypeName, " ", Stack.ValueTypeName
|
|
|
|
return s.pop()
|
|
|
|
var s = ArrayStack(data: @[])
|
|
|
|
s.push 10
|
|
s.genericAlgorithm 20
|
|
echo s.implicitGeneric
|
|
|
|
reject s.genericAlgorithm "x"
|
|
reject s.genericAlgorithm 1.0
|
|
reject "str".implicitGeneric
|
|
reject implicitGeneric(10)
|