summary refs log tree commit diff stats
path: root/readme.md
blob: e8c081d4ede057b194958035e6f9c0dad6e69fbf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Nimrod Compiler
This repo contains the Nimrod compiler, Nimrod's stdlib, tools and 
documentation.

## Compiling
Compiling the Nimrod compiler is quite straightforward. Because
the Nimrod compiler itself is written in the Nimrod programming language
the C source of an older version of the compiler are needed to bootstrap the
latest version. The C sources are available in a separate repo [here](http://github.com/nimrod-code/csources).

Pre-compiled snapshots of the compiler are also available on
[Nimbuild](http://build.nimrod-lang.org/). Your platform however may not 
currently be built for.

The compiler currently supports the following platform and architecture 
combinations:
  
  * Windows (Windows XP or greater) - x86 and x86_64
  * Linux (most, if not all, distributions) - x86, x86_64, ppc64 and armv6l
  * Mac OS X 10.04 or higher - x86, x86_64 and ppc64
  
In reality a lot more are supported, however they are not tested regularly.

To build from source you will need:

  * gcc 3.x or later recommended. Other alternatives which may work
    are: clang, Visual C++, Intel's C++ compiler
  * git or wget

If you are on a fairly modern *nix system, the following steps should work:

```
$ git clone git://github.com/Araq/Nimrod.git
$ cd Nimrod
$ git clone --depth 1 git://github.com/nimrod-code/csources
$ cd csources && sh build.sh
$ cd ..
$ bin/nimrod c koch
$ ./koch boot -d:release
```

``koch install [dir]`` may then be used to install Nimrod, or you can simply
add it to your PATH. More ``koch`` related options are documented in
[doc/koch.txt](doc/koch.txt).

The above steps can be performed on Windows in a similar fashion, the
``build.bat`` and ``build64.bat`` (for x86_64 systems) are provided to be used
instead of ``build.sh``.

## Getting help
A [forum](http://forum.nimrod-lang.org/) is available if you have any
questions, and you can also get help in the IRC channel on
[Freenode](irc://irc.freenode.net/nimrod) in #nimrod. If you ask questions on
[StackOverflow use the nimrod
tag](http://stackoverflow.com/questions/tagged/nimrod).

## License
The compiler and the standard library are licensed under the MIT license, 
except for some modules where the documentation suggests otherwise. This means 
that you can use any license for your own programs developed with Nimrod, 
allowing you to create commercial applications.

Read copying.txt for more details.

Copyright (c) 2004-2014 Andreas Rumpf.
All rights reserved.
title> <meta name="Generator" content="Vim/8.0"> <meta name="plugin-version" content="vim7.4_v2"> <meta name="syntax" content="cpp"> <meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy="> <meta name="colorscheme" content="minimal-light"> <style type="text/css"> <!-- pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; } body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; } a { color:inherit; } * { font-size:12pt; font-size: 1em; } .LineNr { } .Constant { color: #008787; } .muRecipe { color: #ff8700; } .Delimiter { color: #c000c0; } .Special { color: #d70000; } .Identifier { color: #af5f00; } .Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; } .Comment { color: #005faf; } .traceContains { color: #005f00; } --> </style> <script type='text/javascript'> <!-- /* function to open any folds containing a jumped-to line before jumping to it */ function JumpToLine() { var lineNum; lineNum = window.location.hash; lineNum = lineNum.substr(1); /* strip off '#' */ if (lineNum.indexOf('L') == -1) { lineNum = 'L'+lineNum; } lineElem = document.getElementById(lineNum); /* Always jump to new location even if the line was hidden inside a fold, or * we corrected the raw number to a line ID. */ if (lineElem) { lineElem.scrollIntoView(true); } return true; } if ('onhashchange' in window) { window.onhashchange = JumpToLine; } --> </script> </head> <body onload='JumpToLine();'> <a href='https://github.com/akkartik/mu/blob/master/060rewrite_literal_string.cc'>https://github.com/akkartik/mu/blob/master/060rewrite_literal_string.cc</a> <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment">//: allow using literal strings anywhere that will accept immutable strings</span> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario passing_literals_to_recipes)</span> <span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo [abc] <span id="L6" class="LineNr"> 6 </span>] <span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> foo x:text<span class="muRecipe"> -&gt; </span>n:num [ <span id="L8" class="LineNr"> 8 </span> local-scope <span id="L9" class="LineNr"> 9 </span> load-ingredients <span id="L10" class="LineNr">10 </span> n<span class="Special"> &lt;- </span>length *x <span id="L11" class="LineNr">11 </span>] <span id="L12" class="LineNr">12 </span><span class="traceContains">+mem: storing 3 in location 1</span> <span id="L13" class="LineNr">13 </span> <span id="L14" class="LineNr">14 </span><span class="Delimiter">:(before &quot;End Instruction Inserting/Deleting Transforms&quot;)</span> <span id="L15" class="LineNr">15 </span><a href='060rewrite_literal_string.cc.html#L21'>initialize_transform_rewrite_literal_string_to_text</a><span class="Delimiter">();</span> <span id="L16" class="LineNr">16 </span><span class="Special">Transform</span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='060rewrite_literal_string.cc.html#L39'>rewrite_literal_string_to_text</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L17" class="LineNr">17 </span> <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span> <span id="L19" class="LineNr">19 </span>set&lt;string&gt; recipes_taking_literal_strings<span class="Delimiter">;</span> <span id="L20" class="LineNr">20 </span><span class="Delimiter">:(code)</span> <span id="L21" class="LineNr">21 </span><span class="Normal">void</span> <a href='060rewrite_literal_string.cc.html#L21'>initialize_transform_rewrite_literal_string_to_text</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L22" class="LineNr">22 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;assert&quot;</span><span class="Delimiter">);</span> <span id="L23" class="LineNr">23 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$print&quot;</span><span class="Delimiter">);</span> <span id="L24" class="LineNr">24 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$dump-trace&quot;</span><span class="Delimiter">);</span> <span id="L25" class="LineNr">25 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;$system&quot;</span><span class="Delimiter">);</span> <span id="L26" class="LineNr">26 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">);</span> <span id="L27" class="LineNr">27 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;stash&quot;</span><span class="Delimiter">);</span> <span id="L28" class="LineNr">28 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;new&quot;</span><span class="Delimiter">);</span> <span id="L29" class="LineNr">29 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;run&quot;</span><span class="Delimiter">);</span> <span id="L30" class="LineNr">30 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;memory-should-contain&quot;</span><span class="Delimiter">);</span> <span id="L31" class="LineNr">31 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-contain&quot;</span><span class="Delimiter">);</span> <span id="L32" class="LineNr">32 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;trace-should-not-contain&quot;</span><span class="Delimiter">);</span> <span id="L33" class="LineNr">33 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;check-trace-count-for-label&quot;</span><span class="Delimiter">);</span> <span id="L34" class="LineNr">34 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;check-trace-count-for-label-greater-than&quot;</span><span class="Delimiter">);</span> <span id="L35" class="LineNr">35 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">&quot;check-trace-count-for-label-lesser-than&quot;</span><span class="Delimiter">);</span> <span id="L36" class="LineNr">36 </span> <span class="Comment">// End initialize_transform_rewrite_literal_string_to_text()</span> <span id="L37" class="LineNr">37 </span><span class="Delimiter">}</span> <span id="L38" class="LineNr">38 </span> <span id="L39" class="LineNr">39 </span><span class="Normal">void</span> <a href='060rewrite_literal_string.cc.html#L39'>rewrite_literal_string_to_text</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L40" class="LineNr">40 </span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L41" class="LineNr">41 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- rewrite literal strings in <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L42" class="LineNr">42 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='060rewrite_literal_string.cc.html#L65'>contains_numeric_locations</a><span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L43" class="LineNr">43 </span> vector&lt;instruction&gt; new_instructions<span class="Delimiter">;</span> <span id="L44" class="LineNr">44 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L45" class="LineNr">45 </span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L46" class="LineNr">46 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>recipes_taking_literal_strings<span class="Delimiter">.</span>find<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">)</span> == recipes_taking_literal_strings<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L47" class="LineNr">47 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L48" class="LineNr">48 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L49" class="LineNr">49 </span> <a href='010vm.cc.html#L33'>instruction</a> def<span class="Delimiter">;</span> <span id="L50" class="LineNr">50 </span> ostringstream ingredient_name<span class="Delimiter">;</span> <span id="L51" class="LineNr">51 </span> ingredient_name &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; i &lt;&lt; <span class="Constant">'_'</span> &lt;&lt; j &lt;&lt; <span class="Constant">&quot;:text&quot;</span><span class="Delimiter">;</span> <span id="L52" class="LineNr">52 </span> def<span class="Delimiter">.</span>name = <span class="Constant">&quot;new&quot;</span><span class="Delimiter">;</span> <span id="L53" class="LineNr">53 </span> def<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">));</span> <span id="L54" class="LineNr">54 </span> def<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">()));</span> <span id="L55" class="LineNr">55 </span> new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span> <span id="L56" class="LineNr">56 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">).</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span class="Comment">// reclaim old memory</span> <span id="L57" class="LineNr">57 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)</span> = reagent<span class="Delimiter">(</span>ingredient_name<span class="Delimiter">.</span>str<span class="Delimiter">());</span> <span id="L58" class="LineNr">58 </span> <span class="Delimiter">}</span> <span id="L59" class="LineNr">59 </span> <span class="Delimiter">}</span> <span id="L60" class="LineNr">60 </span> new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> <span id="L61" class="LineNr">61 </span> <span class="Delimiter">}</span> <span id="L62" class="LineNr">62 </span> caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>swap<span class="Delimiter">(</span>new_instructions<span class="Delimiter">);</span> <span id="L63" class="LineNr">63 </span><span class="Delimiter">}</span> <span id="L64" class="LineNr">64 </span> <span id="L65" class="LineNr">65 </span><span class="Normal">bool</span> <a href='060rewrite_literal_string.cc.html#L65'>contains_numeric_locations</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L66" class="LineNr">66 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L67" class="LineNr">67 </span> <span class="Normal">const</span> instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L68" class="LineNr">68 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span> in &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span id="L69" class="LineNr">69 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L157'>is_numeric_location</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">)))</span> <span id="L70" class="LineNr">70 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L71" class="LineNr">71 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span> out &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span id="L72" class="LineNr">72 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L157'>is_numeric_location</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">)))</span> <span id="L73" class="LineNr">73 </span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L74" class="LineNr">74 </span> <span class="Delimiter">}</span> <span id="L75" class="LineNr">75 </span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L76" class="LineNr">76 </span><span class="Delimiter">}</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->