Merge branch 'master' into vm2

Conflicts:
	compiler/sem.nim
This commit is contained in:
Araq 2013-12-05 00:03:27 +01:00
commit 5eba93d584
135 changed files with 2221 additions and 90065 deletions

View file

@ -8,4 +8,12 @@ proc foo(models: seq[TTable[string, float]]): seq[float] =
for model in models.items:
result.add model["foobar"]
# bug #686
type TType[T; A] = array[A, T]
proc foo[T](p: TType[T, range[0..1]]) =
echo "foo"
proc foo[T](p: TType[T, range[0..2]]) =
echo "bar"

View file

@ -0,0 +1,13 @@
discard """
line: 14
errormsg: "type mismatch"
"""
proc first(it: iterator(): int): seq[int] =
return @[]
iterator primes(): int =
yield 1
for i in first(primes):
break

View file

@ -0,0 +1,134 @@
discard """
output: '''108
11 -1 1936
4.000000000000002-e001
true
truefalse'''
"""
proc `++`(x: var int; y: int = 1; z: int = 0) =
x = x + y + z
var g = 70
++g
g ++ 7
g.`++`(10, 20)
echo g
#let lv = stdin.readline
#var vv = stdin.readline
#vv = "abc" # valid, reassignment allowed
#lv = "abc" # fails at compile time
#proc square(x: int): int = x*x
template square(x: int): int =
# ensure 'x' is only evaluated once:
let y = x
y * y
proc mostSignificantBit(n: int): int =
# naive algorithm:
var n = n
while n != 0:
n = n shr 1
result += 1
result -= 1
const msb3999 = mostSignificantBit(3999)
echo msb3999, " ", mostSignificantBit(0), " ", square(44)
proc filter[T](a: openarray[T], predicate: proc (x: T): bool): seq[T] =
result = @[] # @[] constructs the empty seq
for x in a:
if predicate(x): result.add(x)
proc map[T, S](a: openarray[T], fn: proc (x: T): S): seq[S] =
newSeq(result, a.len)
for i in 0 .. <a.len: result[i] = fn(a[i])
type
FormulaKind = enum
fkVar, ## element is a variable like 'X'
fkLit, ## element is a literal like 0.1
fkAdd, ## element is an addition operation
fkMul, ## element is a multiplication operation
fkExp ## element is an exponentiation operation
type
Formula = ref object
case kind: FormulaKind
of fkVar: name: string
of fkLit: value: float
of fkAdd, fkMul, fkExp: left, right: Formula
from math import pow
proc evaluate(n: Formula, varToVal: proc (name: string): float): float =
case n.kind
of fkVar: varToVal(n.name)
of fkLit: n.value
of fkAdd: evaluate(n.left, varToVal) + evaluate(n.right, varToVal)
of fkMul: evaluate(n.left, varToVal) * evaluate(n.right, varToVal)
of fkExp: pow(evaluate(n.left, varToVal), evaluate(n.right, varToVal))
echo evaluate(Formula(kind: fkLit, value: 0.4), nil)
proc isPolyTerm(n: Formula): bool =
n.kind == fkMul and n.left.kind == fkLit and (let e = n.right;
e.kind == fkExp and e.left.kind == fkVar and e.right.kind == fkLit)
proc isPolynomial(n: Formula): bool =
isPolyTerm(n) or
(n.kind == fkAdd and isPolynomial(n.left) and isPolynomial(n.right))
let myFormula = Formula(kind: fkMul,
left: Formula(kind: fkLit, value: 2.0),
right: Formula(kind: fkExp,
left: Formula(kind: fkVar, name: "x"),
right: Formula(kind: fkLit, value: 5.0)))
echo isPolyTerm(myFormula)
proc pat2kind(pattern: string): FormulaKind =
case pattern
of "^": fkExp
of "*": fkMul
of "+": fkAdd
of "x": fkVar
of "c": fkLit
else: fkVar # no error reporting for reasons of simplicity
import macros
proc matchAgainst(n, pattern: PNimrodNode): PNimrodNode {.compileTime.} =
template `@`(current, field: expr): expr =
newDotExpr(current, newIdentNode(astToStr(field)))
template `==@`(n, pattern: expr): expr =
newCall("==", n@kind, newIdentNode($pat2kind($pattern.ident)))
case pattern.kind
of CallNodes:
result = newCall("and",
n ==@ pattern[0],
matchAgainst(n@left, pattern[1]))
if pattern.len == 3:
result = newCall("and", result.copy,
matchAgainst(n@right, pattern[2]))
of nnkIdent:
result = n ==@ pattern
of nnkPar:
result = matchAgainst(n, pattern[0])
else:
error "invalid pattern"
macro `=~` (n: Formula, pattern: expr): bool =
result = matchAgainst(n, pattern)
proc isPolyTerm2(n: Formula): bool = n =~ c * x^c
echo isPolyTerm2(myFormula), isPolyTerm2(Formula(kind: fkLit, value: 0.7))

View file

@ -9,9 +9,9 @@ static int cvariable = 420;
""".}
proc embedsC() {.noStackFrame.} =
proc embedsC() =
var nimrodVar = 89
{.emit: """fprintf(stdout, "%d\n", cvariable + (int)`nimrodVar`);""".}
{.emit: """printf("%d\n", cvariable + (int)`nimrodVar`);""".}
embedsC()

View file

@ -10,6 +10,10 @@ type
TBar[T; I: expr[int]] = object
data: array[I, T]
TA1[T; I: expr[int]] = array[I, T]
TA2[T; I: expr[int]] = array[0..I, T]
TA3[T; I: expr[int]] = array[I-1, T]
proc takeFoo(x: TFoo) =
echo "abracadabra"
echo TFoo.Val
@ -20,3 +24,8 @@ takeFoo(x)
var y: TBar[float, 4]
echo high(y.data)
var
t1: TA1
t2: TA2
t3: TA3

View file

@ -0,0 +1,28 @@
discard """
output: "Sortable\nSortable\nContainer"
"""
import typetraits
type
TObj = object
x: int
Sortable = generic x, y
(x < y) is bool
ObjectContainer = generic C
C.len is ordinal
for v in items(C):
v.type is tuple|object
proc foo(c: ObjectContainer) =
echo "Container"
proc foo(x: Sortable) =
echo "Sortable"
foo 10
foo "test"
foo(@[TObj(x: 10), TObj(x: 20)])

View file

@ -2,7 +2,8 @@ discard """
file: "tlenopenarray.nim"
output: '''1
0
Whopie'''
Whopie
12'''
"""
echo len([1_000_000]) #OUT 1
@ -27,3 +28,14 @@ var w = TWidget(names: initQueue[string]())
add(w.names, "Whopie")
for n in w.names: echo(n)
# bug #681
type TSomeRange = object
hour: range[0..23]
var value: string
var val12 = TSomeRange(hour: 12)
value = $(if val12.hour > 12: val12.hour - 12 else: val12.hour)
echo value