examples from the talk part of test suite

This commit is contained in:
Araq
2013-09-27 08:45:14 +02:00
parent a0b82db402
commit 2f0671eb79
9 changed files with 153 additions and 3 deletions

33
examples/talk/dsl.nim Normal file
View File

@@ -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()

View File

@@ -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)

View File

@@ -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]

View File

@@ -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)

View File

@@ -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

8
examples/talk/tags.nim Normal file
View File

@@ -0,0 +1,8 @@
template htmlTag(tag: expr) {.immediate.} =
proc tag(): string = "<" & astToStr(tag) & ">"
htmlTag(br)
htmlTag(html)
echo br()

View File

@@ -402,6 +402,7 @@ proc main() =
compileExample(r, "lib/pure/*.nim", p.cmdLineRest.string)
compileExample(r, "examples/*.nim", p.cmdLineRest.string)
compileExample(r, "examples/gtk/*.nim", p.cmdLineRest.string)
compileExample(r, "examples/talk/*.nim", p.cmdLineRest.string)
compileSpecialTests(r, p.cmdLineRest.string)
writeResults(compileJson, r)
of "run":

View File

@@ -1,13 +1,16 @@
version 0.9.4
=============
- add the code from the talk to examples or run tests
- fails in release mode:
nimrod compile -f --symbolFiles:off --compileOnly --gen_mapping --cc:gcc
--skipUserCfg --os:haiku --cpu:amd64 -d:relase compiler/nimrod.nim
- new VM:
- implement the glue to replace evals.nim
- implement missing magics
- implement overflow checking
- implement the FFI
- implement on the fly CSE
- make 'bind' default for templates and introduce 'mixin'
- special rule for ``[]=``
@@ -160,3 +163,4 @@ Optimizations
even further write barrier specialization
- inlining of first class functions
- proc specialization in the code gen for write barrier specialization
- VM/optimizer: implement on the fly CSE

View File

@@ -244,6 +244,7 @@ proc parseIniFile(c: var TConfigData) =
var
p: TCfgParser
section = ""
hasCpuOs = false
var input = newFileStream(c.infile, fmRead)
if input != nil:
open(p, input, c.infile)
@@ -265,16 +266,18 @@ proc parseIniFile(c: var TConfigData) =
of "version": c.version = v
of "os":
c.oses = split(v, {';'})
hasCpuOs = true
if c.explicitPlatforms:
quit(errorStr(p, "you cannot have both 'platforms' and 'os'"))
of "cpu":
c.cpus = split(v, {';'})
hasCpuOs = true
if c.explicitPlatforms:
quit(errorStr(p, "you cannot have both 'platforms' and 'cpu'"))
of "platforms":
platforms(c, v)
c.explicitPlatforms = true
if c.cpus.len > 0 or c.oses.len > 0:
if hasCpuOs:
quit(errorStr(p, "you cannot have both 'platforms' and 'os'"))
of "authors": c.authors = split(v, {';'})
of "description": c.description = v