mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-01 19:02:18 +00:00
* Error -> Defect for defects The distinction between Error and Defect is subjective, context-dependent and somewhat arbitrary, so when looking at an exception, it's hard to guess what it is - this happens often when looking at a `raises` list _without_ opening the corresponding definition and digging through layers of inheritance. With the help of a little consistency in naming, it's at least possible to start disentangling the two error types and the standard lib can set a good example here.
49 lines
684 B
Nim
49 lines
684 B
Nim
discard """
|
|
output: '''
|
|
foo
|
|
C
|
|
3.14
|
|
foo
|
|
3.14
|
|
3.14
|
|
'''
|
|
"""
|
|
|
|
type
|
|
V = enum
|
|
A, B, C
|
|
X = object
|
|
f0: string
|
|
case f1: V
|
|
of A: f2: string
|
|
of B: discard
|
|
of C: f3: float
|
|
|
|
var obj = X(f0: "foo", f1: C, f3: 3.14)
|
|
|
|
block:
|
|
echo obj.f0
|
|
echo obj.f1
|
|
doAssertRaises(FieldDefect): echo obj.f2
|
|
echo obj.f3
|
|
|
|
block:
|
|
let a0 = addr(obj.f0)
|
|
echo a0[]
|
|
# let a1 = unsafeAddr(obj.f1)
|
|
# echo a1[]
|
|
doAssertRaises(FieldDefect):
|
|
let a2 = addr(obj.f2)
|
|
echo a2[]
|
|
let a3 = addr(obj.f3)
|
|
echo a3[]
|
|
|
|
# Prevent double evaluation of LHS
|
|
block:
|
|
var flag = false
|
|
proc wrap(x: X): X =
|
|
doAssert flag == false
|
|
flag = true
|
|
result = x
|
|
echo wrap(obj).f3
|