examples from the talk part of test suite
This commit is contained in:
parent
a0b82db402
commit
2f0671eb79
9 changed files with 153 additions and 3 deletions
33
examples/talk/dsl.nim
Normal file
33
examples/talk/dsl.nim
Normal 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()
|
||||||
55
examples/talk/formatoptimizer.nim
Normal file
55
examples/talk/formatoptimizer.nim
Normal 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)
|
||||||
23
examples/talk/hoisting.nim
Normal file
23
examples/talk/hoisting.nim
Normal 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]
|
||||||
12
examples/talk/lazyeval.nim
Normal file
12
examples/talk/lazyeval.nim
Normal 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)
|
||||||
11
examples/talk/quasiquote.nim
Normal file
11
examples/talk/quasiquote.nim
Normal 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
8
examples/talk/tags.nim
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
template htmlTag(tag: expr) {.immediate.} =
|
||||||
|
proc tag(): string = "<" & astToStr(tag) & ">"
|
||||||
|
|
||||||
|
htmlTag(br)
|
||||||
|
htmlTag(html)
|
||||||
|
|
||||||
|
echo br()
|
||||||
|
|
@ -402,6 +402,7 @@ proc main() =
|
||||||
compileExample(r, "lib/pure/*.nim", p.cmdLineRest.string)
|
compileExample(r, "lib/pure/*.nim", p.cmdLineRest.string)
|
||||||
compileExample(r, "examples/*.nim", p.cmdLineRest.string)
|
compileExample(r, "examples/*.nim", p.cmdLineRest.string)
|
||||||
compileExample(r, "examples/gtk/*.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)
|
compileSpecialTests(r, p.cmdLineRest.string)
|
||||||
writeResults(compileJson, r)
|
writeResults(compileJson, r)
|
||||||
of "run":
|
of "run":
|
||||||
|
|
|
||||||
8
todo.txt
8
todo.txt
|
|
@ -1,13 +1,16 @@
|
||||||
version 0.9.4
|
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:
|
- new VM:
|
||||||
- implement the glue to replace evals.nim
|
- implement the glue to replace evals.nim
|
||||||
- implement missing magics
|
- implement missing magics
|
||||||
- implement overflow checking
|
- implement overflow checking
|
||||||
- implement the FFI
|
- implement the FFI
|
||||||
- implement on the fly CSE
|
|
||||||
|
|
||||||
- make 'bind' default for templates and introduce 'mixin'
|
- make 'bind' default for templates and introduce 'mixin'
|
||||||
- special rule for ``[]=``
|
- special rule for ``[]=``
|
||||||
|
|
@ -160,3 +163,4 @@ Optimizations
|
||||||
even further write barrier specialization
|
even further write barrier specialization
|
||||||
- inlining of first class functions
|
- inlining of first class functions
|
||||||
- proc specialization in the code gen for write barrier specialization
|
- proc specialization in the code gen for write barrier specialization
|
||||||
|
- VM/optimizer: implement on the fly CSE
|
||||||
|
|
|
||||||
|
|
@ -244,6 +244,7 @@ proc parseIniFile(c: var TConfigData) =
|
||||||
var
|
var
|
||||||
p: TCfgParser
|
p: TCfgParser
|
||||||
section = ""
|
section = ""
|
||||||
|
hasCpuOs = false
|
||||||
var input = newFileStream(c.infile, fmRead)
|
var input = newFileStream(c.infile, fmRead)
|
||||||
if input != nil:
|
if input != nil:
|
||||||
open(p, input, c.infile)
|
open(p, input, c.infile)
|
||||||
|
|
@ -265,16 +266,18 @@ proc parseIniFile(c: var TConfigData) =
|
||||||
of "version": c.version = v
|
of "version": c.version = v
|
||||||
of "os":
|
of "os":
|
||||||
c.oses = split(v, {';'})
|
c.oses = split(v, {';'})
|
||||||
|
hasCpuOs = true
|
||||||
if c.explicitPlatforms:
|
if c.explicitPlatforms:
|
||||||
quit(errorStr(p, "you cannot have both 'platforms' and 'os'"))
|
quit(errorStr(p, "you cannot have both 'platforms' and 'os'"))
|
||||||
of "cpu":
|
of "cpu":
|
||||||
c.cpus = split(v, {';'})
|
c.cpus = split(v, {';'})
|
||||||
|
hasCpuOs = true
|
||||||
if c.explicitPlatforms:
|
if c.explicitPlatforms:
|
||||||
quit(errorStr(p, "you cannot have both 'platforms' and 'cpu'"))
|
quit(errorStr(p, "you cannot have both 'platforms' and 'cpu'"))
|
||||||
of "platforms":
|
of "platforms":
|
||||||
platforms(c, v)
|
platforms(c, v)
|
||||||
c.explicitPlatforms = true
|
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'"))
|
quit(errorStr(p, "you cannot have both 'platforms' and 'os'"))
|
||||||
of "authors": c.authors = split(v, {';'})
|
of "authors": c.authors = split(v, {';'})
|
||||||
of "description": c.description = v
|
of "description": c.description = v
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue