mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-30 01:44:37 +00:00
101 lines
1.8 KiB
Nim
101 lines
1.8 KiB
Nim
discard """
|
|
output: '''true
|
|
true
|
|
true
|
|
true
|
|
p has been called.
|
|
p has been called.
|
|
implicit generic
|
|
generic
|
|
false
|
|
true
|
|
-1'''
|
|
"""
|
|
|
|
# https://github.com/nim-lang/Nim/issues/1147
|
|
type TTest = object
|
|
vals: seq[int]
|
|
|
|
proc add*(self: var TTest, val: int) =
|
|
self.vals.add(val)
|
|
|
|
type CAddable = concept x
|
|
x[].add(int)
|
|
|
|
echo((ref TTest) is CAddable) # true
|
|
|
|
# https://github.com/nim-lang/Nim/issues/1570
|
|
type ConcretePointOfFloat = object
|
|
x, y: float
|
|
|
|
type ConcretePoint[Value] = object
|
|
x, y: Value
|
|
|
|
type AbstractPointOfFloat = generic p
|
|
p.x is float and p.y is float
|
|
|
|
let p1 = ConcretePointOfFloat(x: 0, y: 0)
|
|
let p2 = ConcretePoint[float](x: 0, y: 0)
|
|
|
|
echo p1 is AbstractPointOfFloat # true
|
|
echo p2 is AbstractPointOfFloat # true
|
|
echo p2.x is float and p2.y is float # true
|
|
|
|
# https://github.com/nim-lang/Nim/issues/2018
|
|
type ProtocolFollower = concept
|
|
true # not a particularly involved protocol
|
|
|
|
type ImplementorA = object
|
|
type ImplementorB = object
|
|
|
|
proc p[A: ProtocolFollower, B: ProtocolFollower](a: A, b: B) =
|
|
echo "p has been called."
|
|
|
|
p(ImplementorA(), ImplementorA())
|
|
p(ImplementorA(), ImplementorB())
|
|
|
|
# https://github.com/nim-lang/Nim/issues/2423
|
|
proc put*[T](c: seq[T], x: T) = echo "generic"
|
|
proc put*(c: seq) = echo "implicit generic"
|
|
|
|
type
|
|
Container[T] = concept c
|
|
put(c)
|
|
put(c, T)
|
|
|
|
proc c1(x: Container) = echo "implicit generic"
|
|
c1(@[1])
|
|
|
|
proc c2[T](x: Container[T]) = echo "generic"
|
|
c2(@[1])
|
|
|
|
# https://github.com/nim-lang/Nim/issues/2882
|
|
type
|
|
Paper = object
|
|
name: string
|
|
|
|
Bendable = concept x
|
|
bend(x is Bendable)
|
|
|
|
proc bend(p: Paper): Paper = Paper(name: "bent-" & p.name)
|
|
|
|
var paper = Paper(name: "red")
|
|
echo paper is Bendable
|
|
|
|
type
|
|
A = concept self
|
|
size(self) is int
|
|
|
|
B = object
|
|
|
|
proc size(self: B): int =
|
|
return -1
|
|
|
|
proc size(self: A): int =
|
|
return 0
|
|
|
|
let b = B()
|
|
echo b is A
|
|
echo b.size()
|
|
|