first commit

This commit is contained in:
Araq 2015-07-17 10:22:09 +02:00
commit d2f10f3bbc
84 changed files with 13382 additions and 0 deletions

7
livedemo/codegendecl.nim Normal file
View file

@ -0,0 +1,7 @@
var
a {.codegenDecl: "$# progmem $#".}: int
proc myinterrupt() {.codegenDecl: "$# __interrupt $#$# __attribute__(weirdo)",
exportc: "nim_interrupt".} =
echo "realistic interrupt handler"

76
livedemo/coverage.nim Normal file
View file

@ -0,0 +1,76 @@
## Code coverage macro
import macros
proc transform(n, guard, list: NimNode): NimNode {.compileTime.} =
# recurse:
result = copyNimNode(n)
for c in n.children:
result.add c.transform(guard, list)
if n.kind in {nnkElifBranch, nnkOfBranch, nnkExceptBranch, nnkElifExpr,
nnkElseExpr, nnkElse, nnkForStmt, nnkWhileStmt}:
let lineinfo = result[^1].lineinfo
template track(guard, i) =
guard[i][1] = true
result[^1] = newStmtList(getAst track(guard, list.len), result[^1])
template tup(lineinfo) =
(lineinfo, false)
list.add(getAst tup(lineinfo))
proc listCoverage(s: openArray[(string, bool)]) =
for x in s:
if not x[1]: echo "NOT EXECUTED ", x[0]
macro cov(p: untyped): untyped =
var list = newNimNode(nnkBracket)
let guard = genSym(nskVar, "guard")
result = transform(p, guard, list)
result = newStmtList(newVarStmt(guard, list), result,
newCall(bindSym"listCoverage", guard))
cov:
proc toTest(x, y: int) =
try:
case x
of 8:
if y > 9: echo "8.1"
else: echo "8.2"
of 9: echo "9"
else: echo "else"
echo "no IoError"
except IoError:
echo "IoError"
toTest(8, 10)
toTest(10, 10)
when false:
cov:
proc toTest(x: int): int =
if x > 0: result = 88
else: result = 99
proc toTestE(x: int): int =
(if x > 0: 88 else: 99)
proc toTestTry(x: int) =
try:
case x
of 8: echo "8"
of 9: echo "9"
else: echo "foo"
echo "Try it"
except IoError:
echo "IoError"
echo toTest 89
echo toTest(-89)
echo toTestE 89
toTestTry(8)
# echo toTestE(-89)

64
livedemo/coverage2.nim Normal file
View file

@ -0,0 +1,64 @@
import macros
type HideEffects = proc (x: int) {.raises: [], noSideEffect, tags: [].}
proc wrap(n: NimNode; setter, i: NimNode): NimNode {.compileTime.} =
# XXX better insert as last statement, but move before 'break', 'return' etc.
template callSetterProc(setter, i) =
cast[HideEffects](setter)(i)
result = newTree(nnkStmtList, getAst callSetterProc(setter, i), n)
proc transform(n, setter, data: NimNode): NimNode {.compileTime.} =
# recurse:
result = copyNimNode(n)
for c in n.children:
result.add c.transform(setter, data)
if n.kind in {nnkElifBranch, nnkOfBranch, nnkExceptBranch, nnkElifExpr,
nnkElseExpr, nnkElse, nnkForStmt, nnkWhileStmt}:
let index = newLit(data.len)
data.add(newTree(nnkPar, newLit(result[^1].lineinfo), bindSym"false"))
result[^1] = result[^1].wrap(setter, index)
proc listCoverage(s: openArray[(string, bool)]) =
for x in s:
if not x[1]: echo "NOT EXECUTED ", x[0]
macro cov(p: untyped): untyped =
var data = newNimNode(nnkBracket)
let guard = genSym(nskVar, "guard")
let setter = genSym(nskProc, "guardSetter")
template setterProc(name, guard) =
proc name(x: int) =
guard[x][1] = true
result = transform(p, setter, data)
result = newTree(nnkStmtList, newVarStmt(guard, data),
getAst setterProc(setter, guard),
result,
newCall(bindSym"listCoverage", guard))
cov:
proc toTest(x: int): int {.noSideEffect.} =
if x > 0: result = 88
else: result = 99
proc toTestE(x: int): int =
(if x > 0: 88 else: 99)
proc toTestTry(x: int) =
try:
case x
of 8: echo "8"
of 9: echo "9"
else: echo "foo"
echo "Try it"
except IoError:
echo "IoError"
echo toTest 89
echo toTest(-89)
echo toTestE 89
toTestTry(8)
# echo toTestE(-89)

291
livedemo/demo.html Normal file
View file

@ -0,0 +1,291 @@
<!DOCTYPE html>
<html>
<head>
<title>Module demo</title>
<meta name="copyright"
content="Copyright &#169; 2015 Andreas Rumpf" />
<link rel="stylesheet" type="text/css" media="screen, projection, print"
href="Slidy2/styles/slidy.css" />
<script src="Slidy2/scripts/slidy.js"
charset="utf-8" type="text/javascript"></script>
<style type="text/css">
span.DecNumber {color: blue}
span.BinNumber {color: blue}
span.HexNumber {color: blue}
span.OctNumber {color: blue}
span.FloatNumber {color: blue}
span.Identifier {color: black}
span.Keyword {font-weight: bold}
span.StringLit {color: blue}
span.LongStringLit {color: blue}
span.CharLit {color: blue}
span.EscapeSequence {color: black}
span.Operator {color: black}
span.Punctation {color: black}
span.Comment, span.LongComment {font-style:italic; color: green}
span.RegularExpression {color: DarkViolet}
span.TagStart {color: DarkViolet}
span.TagEnd {color: DarkViolet}
span.Key {color: blue}
span.Value {color: black}
span.RawData {color: blue}
span.Assembler {color: blue}
span.Preprocessor {color: DarkViolet}
span.Directive {color: DarkViolet}
span.Command, span.Rule, span.Hyperlink, span.Label, span.Reference,
span.Other {color: black}
div.navigation {
-moz-border-radius: 5px 5px 5px 5px;
float: left;
width: 30%;
margin: 0; padding: 0;
border: 3px outset #7F7F7F;
background-color: #7F7F7F;
}
div.navigation ul {
list-style-type: none;
padding-left: 1em;
}
div.navigation ul li a, div.navigation ul li a:visited {
font-weight: bold;
color: #FFFFFF;
text-decoration: none;
}
div.navigation ul li a:hover {
font-weight: bold;
text-decoration: none;
color: gold;
}
div.content {
margin-left: 30%;
padding: 0 1em;
border-left: 4em;
}
dl.item dd, dl.item dd p {
margin-top:3px;
}
dl.item dd pre {
margin-left: 15pt;
border: 0px;
}
dl.item dt, dl.item dt pre {
margin: 20pt 0 0 5pt;
}
pre, span.tok {
background-color: #F9F9F9;
border-color: #C4C4C4;
border-style: solid;
border-width: 1px 1px 1px 2px;
color: black;
line-spacing: 110%;
font-weight: normal;
padding: 2px;
}
span.red {
color: #A80000;
}
hr {background-color:#9D9D9D; border:0 none; color:#9D9D9D; height:1px; width:100%;}
/*
:Author: David Goodger
:Contact: goodger@python.org
:Date: Date: 2006-05-21 22:44:42 +0200 (Sun, 21 May 2006)
:Revision: Revision: 4564
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th { border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first { margin-top: 0 ! important }
.last, .with-subtitle { margin-bottom: 0 ! important }
.hidden { display: none }
a.toc-backref { text-decoration: none ; color: black }
blockquote.epigraph { margin: 2em 5em ; }
dl.docutils dd { margin-bottom: 0.5em }
div.abstract { margin: 2em 5em }
div.abstract p.topic-title { font-weight: bold ; text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ; border: medium outset ; padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title { font-weight: bold ; font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title { color: red ; font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication { margin: 2em 5em ; text-align: center ; font-style: italic }
div.dedication p.topic-title { font-weight: bold ; font-style: normal }
div.figure { margin-left: 2em ; margin-right: 2em }
div.footer, div.header { clear: both; font-size: smaller }
div.line-block { display: block ; margin-top: 1em ; margin-bottom: 1em }
div.line-block div.line-block { margin-top: 0 ; margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar { margin-left: 1em ; border: medium outset ;
padding: 1em ; background-color: #ffffee ; /*width: 40% ;*/ float: right ;
clear: right }
div.sidebar p.rubric { font-family: sans-serif ; font-size: medium }
div.system-messages { margin: 5em }
div.system-messages h1 { color: red }
div.system-message { border: medium outset ; padding: 1em }
div.system-message p.system-message-title { color: red ; font-weight: bold }
div.topic { margin: 2em;}
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title { text-align: center }
h2.subtitle { text-align: center }
/* hr.docutils { width: 75% } */
img.align-left { clear: left }
img.align-right { clear: right }
ol.simple, ul.simple { margin-bottom: 1em }
ol.arabic { list-style: decimal }
ol.loweralpha { list-style: lower-alpha }
ol.upperalpha { list-style: upper-alpha }
ol.lowerroman { list-style: lower-roman }
ol.upperroman { list-style: upper-roman }
p.attribution { text-align: right ; margin-left: 50% }
p.caption { font-style: italic }
p.credits { font-style: italic ; font-size: smaller }
p.label { white-space: nowrap }
p.rubric { font-weight:bold;font-size:larger;color:maroon;text-align:center}
p.sidebar-title {font-family: sans-serif ;font-weight: bold ;font-size: larger }
p.sidebar-subtitle {font-family: sans-serif ; font-weight: bold }
p.topic-title {
font-weight: bold;
background-color: #6D6D6D;
border-bottom: 1px solid #000000;
border-top: 1px solid black;
color: white;
text-align: center;
margin: 0;
}
pre.address { margin-bottom: 0;margin-top:0;font-family:serif;font-size:100% }
pre.literal-block, pre.doctest-block {margin-left: 2em ;margin-right: 2em }
span.classifier {font-family: sans-serif;font-style: oblique }
span.classifier-delimiter {font-family: sans-serif;font-weight: bold }
span.interpreted {font-family: sans-serif }
span.option {white-space: nowrap }
span.pre {white-space: pre }
span.problematic {color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation { border-left: solid 1px gray; margin-left: 1px }
table.docinfo {margin: 2em 4em }
table.docutils {margin-top: 0.5em;margin-bottom: 0.5em; border: 0 solid #9d9d9d; border-collapse: collapse; }
table.footnote {border-left: solid 1px black;margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {padding-left: 0.5em;padding-right: 0.5em;
vertical-align: top;}
table.docutils td, table.docutils th { border-bottom:1px solid #9D9D9D; }
/* color: #4d4d4d} */
/* table.docutils td:hover, table.docinfo td:hover {color: #000000} */
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold;text-align: left;white-space: nowrap;padding-left: 0 }
table.docutils th
{
color: black;
font-weight:normal;
background-color: #E3E3E3;
border-top: 1px solid #1d1d1d;
border-bottom: 1px solid #1d1d1d;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {font-size: 100% }
ul.auto-toc { list-style-type: none }
/*a.reference { color: #E00000; font-weight:bold;}
a.reference:hover {color: #E00000;background-color: #ffff00;display: margin;
font-weight:bold;}*/
p.pic {
width: 1040px;
margin: 0 auto;
}
</style>
<link rel="stylesheet" type="text/css" media="screen, projection, print"
href="Slidy2/styles/w3c-blue.css" />
</head>
<body>
<div class="background">
<img id="head-icon" alt="Nimrod logo"
src="logo2.png" />
</div>
<h1 class="title">Module demo</h1>
<div class='toc'>
<div class="navigation" id="navigation">
<ul class="simple">
<li>
<a class="reference" href="#12" id="62">Procs</a>
<ul class="simple">
<li><a class="reference" href="#101"><wbr />compose</a></li>
<li><a class="reference" href="#102"><wbr />compose2</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="content" id="content">
<div class="section" id="12">
<h1><a class="toc-backref" href="#62">Procs</a></h1>
<dl class="item">
<dt id="101"><pre><span class="Keyword">proc</span> <span class="Identifier">compose</span><span class="Other">(</span><span class="Other">)</span> <span class="Other">{.</span><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ExecIOEffect</span><span class="Other">,</span> <span class="Identifier">WriteIOEffect</span><span class="Other">]</span><span class="Other">.}</span></pre></dt>
<dd>
</dd>
<dt id="102"><pre><span class="Keyword">proc</span> <span class="Identifier">compose2</span><span class="Other">(</span><span class="Other">)</span> <span class="Other">{.</span><span class="Identifier">raises</span><span class="Other">:</span> <span class="Other">[</span><span class="Other">]</span><span class="Other">,</span> <span class="Identifier">tags</span><span class="Other">:</span> <span class="Other">[</span><span class="Identifier">ExecIOEffect</span><span class="Other">]</span><span class="Other">.}</span></pre></dt>
<dd>
</dd>
</dl></div>
</div>
</body>
</html>

22
livedemo/demo.nim Normal file
View file

@ -0,0 +1,22 @@
import macros
macro cov(n: untyped): untyped =
result = n
echo treeRepr n
cov:
proc toTest(x, y: int) =
try:
case x
of 8:
if y > 9: echo "8.1"
else: echo "8.2"
of 9: echo "9"
else: echo "foo"
echo "no exception"
except IoError:
echo "IoError"
toTest(8, 10)
toTest(10, 10)

5
livedemo/file.c2nim Normal file
View file

@ -0,0 +1,5 @@
#cpp
#header
#nep1

27
livedemo/file.h Normal file
View file

@ -0,0 +1,27 @@
#def WXDLLIMPEXP_CORE
#define constantA 1
#define constantB 2
namespace Name {
template <typename T>
class WXDLLIMPEXP_CORE Foo {
public:
T value = {. NimConstant + 78 shr 9 .};
T GetValue() { return value; }
T& SetValue(int x) { field = x; return &field; }
Foo(T x): field(x) {}
~Foo() {}
bool operator==(Foo<T>& const other) const;
bool operator!=(Foo other);
};
}

17
livedemo/file.nim Normal file
View file

@ -0,0 +1,17 @@
const
constantA* = 1
constantB* = 2
type
Foo* {.importcpp: "Name::Foo", header: "file.h".}[T] = object
value* {.importc: "value".}: T = NimConstant + 78 shr 9
proc getValue*[T](this: var Foo[T]): T {.importcpp: "GetValue", header: "file.h".}
proc setValue*[T](this: var Foo[T]; x: cint): var T {.importcpp: "SetValue",
header: "file.h".}
proc constructFoo*[T](x: T): Foo[T] {.constructor, importcpp: "Name::Foo(@)",
header: "file.h".}
proc destroyFoo*[T](this: var Foo[T]) {.importcpp: "#.~Foo()", header: "file.h".}
proc `==`*[T](this: Foo[T]; other: Foo[T]): bool {.noSideEffect, importcpp: "(# == #)",
header: "file.h".}

8
livedemo/options.c2nim Normal file
View file

@ -0,0 +1,8 @@
#cpp
#header
#nep1
#discardableprefix Set