diff options
author | Araq <rumpf_a@web.de> | 2013-09-27 08:45:14 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2013-09-27 08:45:14 +0200 |
commit | 2f0671eb795192b079402e452a229e51a7ca990f (patch) | |
tree | c3021a0d31c99549c4241f6e439948aa29b2f349 /examples | |
parent | a0b82db40229620a29726fa33a4358db2f5fcd44 (diff) | |
download | Nim-2f0671eb795192b079402e452a229e51a7ca990f.tar.gz |
examples from the talk part of test suite
Diffstat (limited to 'examples')
-rw-r--r-- | examples/talk/dsl.nim | 33 | ||||
-rw-r--r-- | examples/talk/formatoptimizer.nim | 55 | ||||
-rw-r--r-- | examples/talk/hoisting.nim | 23 | ||||
-rw-r--r-- | examples/talk/lazyeval.nim | 12 | ||||
-rw-r--r-- | examples/talk/quasiquote.nim | 11 | ||||
-rw-r--r-- | examples/talk/tags.nim | 8 |
6 files changed, 142 insertions, 0 deletions
diff --git a/examples/talk/dsl.nim b/examples/talk/dsl.nim new file mode 100644 index 000000000..4dfab5cd7 --- /dev/null +++ b/examples/talk/dsl.nim @@ -0,0 +1,33 @@ + +import strutils + +template html(name: expr, matter: stmt) {.immediate.} = + proc name(): string = + result = "<html>" + matter + result.add("</html>") + +template nestedTag(tag: expr) {.immediate.} = + template tag(matter: stmt) {.immediate.} = + result.add("<" & astToStr(tag) & ">") + matter + result.add("</" & astToStr(tag) & ">") + +template simpleTag(tag: expr) {.immediate.} = + template tag(matter: expr) {.immediate.} = + result.add("<$1>$2</$1>" % [astToStr(tag), matter]) + +nestedTag body +nestedTag head +nestedTag ul +simpleTag title +simpleTag li + +html mainPage: + head: + title "now look at this" + body: + ul: + li "Nimrod is quite capable" + +echo mainPage() diff --git a/examples/talk/formatoptimizer.nim b/examples/talk/formatoptimizer.nim new file mode 100644 index 000000000..db11d112d --- /dev/null +++ b/examples/talk/formatoptimizer.nim @@ -0,0 +1,55 @@ +## This is the example that optimizes a modified "hello world" + +import macros + +proc invalidFormatString() = + echo "invalidFormatString" + +template formatImpl(handleChar: expr) = + var i = 0 + while i < f.len: + if f[i] == '$': + case f[i+1] + of '1'..'9': + var j = 0 + i += 1 + while f[i] in {'0'..'9'}: + j = j * 10 + ord(f[i]) - ord('0') + i += 1 + result.add(a[j-1]) + else: + invalidFormatString() + else: + result.add(handleChar(f[i])) + i += 1 + +proc `%`*(f: string, a: openArray[string]): string = + template identity(x: expr): expr = x + result = "" + formatImpl(identity) + +macro optFormat{`%`(f, a)}(f: string{lit}, a: openArray[string]): expr = + result = newNimNode(nnkBracket) + #newCall("&") + let f = f.strVal + formatImpl(newLit) + result = nestList(!"&", result) + +template optAdd1{x = y; add(x, z)}(x, y, z: string) = + x = y & z + +#template optAdd2{x.add(y); x.add(z)}(x, y, z: string) = +# x.add(y & z) + +proc `/&` [T: object](x: T): string = + result = "(" + for name, value in fieldPairs(x): + result.add("$1: $2\n" % [name, $value]) + result.add(")") + +type + MyObject = object + a, b: int + s: string +let obj = MyObject(a: 3, b: 4, s: "abc") +echo(/&obj) diff --git a/examples/talk/hoisting.nim b/examples/talk/hoisting.nim new file mode 100644 index 000000000..df13ba2cb --- /dev/null +++ b/examples/talk/hoisting.nim @@ -0,0 +1,23 @@ +type + Regex = distinct string + +const maxSubpatterns = 10 + +proc re(x: string): Regex = + result = Regex(x) + +proc match(s: string, pattern: Regex, captures: var openArray[string]): bool = + true + +template optRe{re(x)}(x: string{lit}): Regex = + var g {.global.} = re(x) + g + +template `=~`(s: string, pattern: Regex): bool = + when not definedInScope(matches): + var matches {.inject.}: array[maxSubPatterns, string] + match(s, pattern, matches) + +for line in lines("input.txt"): + if line =~ re"(\w+)=(\w+)": + echo "key-value pair; key: ", matches[0], " value: ", matches[1] diff --git a/examples/talk/lazyeval.nim b/examples/talk/lazyeval.nim new file mode 100644 index 000000000..77d963834 --- /dev/null +++ b/examples/talk/lazyeval.nim @@ -0,0 +1,12 @@ + +const + debug = true + +template log(msg: string) = + if debug: + echo msg +var + x = 1 + y = 2 + +log("x: " & $x & ", y: " & $y) diff --git a/examples/talk/quasiquote.nim b/examples/talk/quasiquote.nim new file mode 100644 index 000000000..df4003e6e --- /dev/null +++ b/examples/talk/quasiquote.nim @@ -0,0 +1,11 @@ + +import macros + +macro check(ex: expr): stmt = + var info = ex.lineinfo + var expString = ex.toStrLit + result = quote do: + if not `ex`: + echo `info`, ": Check failed: ", `expString` + +check 1 < 2 diff --git a/examples/talk/tags.nim b/examples/talk/tags.nim new file mode 100644 index 000000000..d47b09e07 --- /dev/null +++ b/examples/talk/tags.nim @@ -0,0 +1,8 @@ + +template htmlTag(tag: expr) {.immediate.} = + proc tag(): string = "<" & astToStr(tag) & ">" + +htmlTag(br) +htmlTag(html) + +echo br() |