first commit
This commit is contained in:
commit
d2f10f3bbc
84 changed files with 13382 additions and 0 deletions
7
livedemo/codegendecl.nim
Normal file
7
livedemo/codegendecl.nim
Normal 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
76
livedemo/coverage.nim
Normal 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
64
livedemo/coverage2.nim
Normal 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
291
livedemo/demo.html
Normal file
|
|
@ -0,0 +1,291 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Module demo</title>
|
||||
<meta name="copyright"
|
||||
content="Copyright © 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
22
livedemo/demo.nim
Normal 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
5
livedemo/file.c2nim
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
|
||||
#cpp
|
||||
#header
|
||||
|
||||
#nep1
|
||||
27
livedemo/file.h
Normal file
27
livedemo/file.h
Normal 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
17
livedemo/file.nim
Normal 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
8
livedemo/options.c2nim
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
#cpp
|
||||
#header
|
||||
#nep1
|
||||
|
||||
#discardableprefix Set
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue