|
1 |
| -<!doctype html> |
2 |
| -<html> |
3 |
| - |
4 |
| - <head> |
5 |
| - <meta charset="utf-8"> |
6 |
| - <meta http-equiv="X-UA-Compatible" content="chrome=1"> |
7 |
| - <title>Lisp Flavored Erlang</title> |
8 |
| - <link rel="stylesheet" href="/current/css/styles.css" /> |
9 |
| - <link rel="stylesheet" href="/current/css/pygment_trac.css" /> |
10 |
| - <link rel="shortcut icon" href="/current/images/favicon.ico" /> |
11 |
| - <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> |
12 |
| - <script src="/current/js/respond.js"></script> |
13 |
| - <!--[if lt IE 9]> |
14 |
| - <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> |
15 |
| - <![endif]--> |
16 |
| - <!--[if lt IE 8]> |
17 |
| - <link rel="stylesheet" href="/current/css/ie.css"> |
18 |
| - <![endif]--> |
19 |
| - <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> |
20 |
| - <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> |
21 |
| - </head> |
22 |
| - |
23 |
| - |
24 |
| - <body> |
25 |
| - <div id="header"> |
26 |
| - <input type="checkbox" id="navbar-checkbox" class="navbar-checkbox"> |
27 |
| - <label for="navbar-checkbox" class="navbar-handle">☰</label> |
28 |
| - <nav> |
29 |
| - <ul> |
30 |
| - <li class="fork"><img src="https://raw.githubusercontent.com/lfe/docs/master/docs/current/images/logos/LispFlavoredErlang-xtiny.png" align="top" /></li> |
31 |
| - <li class="title"><a href="http://lfe.io/#resources">Download</a></li> |
32 |
| - <li class="title"><a href="/current/community.html">Community</a></li> |
33 |
| - <li class="title"><a href="/current/contributing.html">Contributing</a></li> |
34 |
| - <li class="title"><a href="http://lfe.gitbooks.io/quick-start/content/index.html">Quick Start</a></li> |
35 |
| - <li class="title"><a href="/current/">Home</a></li> |
36 |
| - </ul> |
37 |
| - </nav> |
38 |
| - </div><!-- end header --> |
39 |
| - |
40 |
| - <div class="wrapper"> |
41 |
| - |
42 |
| - |
43 |
| -<div id="sidebar-primary" class="sidebar"> |
44 |
| - <div class="widget"> |
45 |
| - <h3 class="widget-title">User Guide Sections</h3> |
46 |
| - <ol> |
47 |
| - <li>Introduction</li> |
48 |
| - <ul> |
49 |
| - <li><a class="spec" href="/current/user-guide/intro/1.html">Introduction</a></li> |
50 |
| - <li><a class="spec" href="/current/user-guide/intro/2.html">The LFE REPL</a></li> |
51 |
| - <li><a class="spec" href="/current/user-guide/intro/3.html">Loading Files</a></li> |
52 |
| - <li><a class="spec" href="/current/user-guide/intro/4.html">Setting up a Development Environment</a></li> |
53 |
| - </ul> |
54 |
| - |
55 |
| - <li>Diving In</li> |
56 |
| - <ul> |
57 |
| - <li><a class="spec" href="/current/user-guide/diving/1.html">Numbers & Operators</a></li> |
58 |
| - <li><a class="spec" href="/current/user-guide/diving/2.html">Strings & Atoms</a></li> |
59 |
| - <li><a class="spec" href="/current/user-guide/diving/3.html">Binary & Bitstrings</a></li> |
60 |
| - <li><a class="spec" href="/current/user-guide/diving/4.html">Variables</a></li> |
61 |
| - <li><a class="spec" href="/current/user-guide/diving/5.html">Pattern Matching</a></li> |
62 |
| - </ul> |
63 |
| - |
64 |
| - <li>Lists & Simple Data (in progress)</li> |
65 |
| - <ul> |
66 |
| - <li><a class="spec" href="/current/user-guide/data/1.html">Lists & Tuples</a></li> |
67 |
| - <li><a class="spec" href="/current/user-guide/data/2.html">Comprehensions</a></li> |
68 |
| - <li><a class="spec" href="/current/user-guide/data/3.html">Property Lists & Hashes</a></li> |
69 |
| - <li><a class="spec" href="/current/user-guide/data/4.html">Records</a></li> |
70 |
| - <li><a class="spec" href="/current/user-guide/data/5.html">.hrl Header Files</a></li> |
71 |
| - </ul> |
72 |
| - |
73 |
| - <li>Functions & Modules (stubbed)</li> |
74 |
| - <ul> |
75 |
| - <li><a class="spec" href="/current/user-guide/funcode/1.html">Functions</a></li> |
76 |
| - <li><a class="spec" href="/current/user-guide/funcode/2.html">LFE-Specific Functions </a></li> |
77 |
| - <li><a class="spec" href="/current/user-guide/funcode/3.html">Modules</a></li> |
78 |
| - </ul> |
79 |
| - |
80 |
| - <li>Recursion</li> |
81 |
| - <ul> |
82 |
| - <li><a class="spec" href="/current/user-guide/recursion/1.html">History</a></li> |
83 |
| - <li><a class="spec" href="/current/user-guide/recursion/2.html">Peano Axioms</a></li> |
84 |
| - <li><a class="spec" href="/current/user-guide/recursion/3.html">Primitive Recursive</a></li> |
85 |
| - <li><a class="spec" href="/current/user-guide/recursion/4.html">Total Recursive</a></li> |
86 |
| - <li><a class="spec" href="/current/user-guide/recursion/5.html">The λ-Calculus</a></li> |
87 |
| - <li><a class="spec" href="/current/user-guide/recursion/6.html">Practical Examples</a></li> |
88 |
| - <li><a class="spec" href="/current/user-guide/recursion/7.html">Tail-Calls</a></li> |
89 |
| - </ul> |
90 |
| - |
91 |
| - <li>Checks, Errors, & Tests (stubbed)</li> |
92 |
| - <ul> |
93 |
| - <li><a class="spec" href="/current/user-guide/check/1.html">Guards</a></li> |
94 |
| - <li><a class="spec" href="/current/user-guide/check/2.html">Exception Handling</a></li> |
95 |
| - <li><a class="spec" href="/current/user-guide/check/3.html">EUnit with LFE</a></li> |
96 |
| - </ul> |
97 |
| - |
98 |
| - <li>Processes & Servers (stubbed)</li> |
99 |
| - <ul> |
100 |
| - <li><a class="spec" href="/current/user-guide/procs/1.html">TBD</a></li> |
101 |
| - </ul> |
102 |
| - |
103 |
| - <li>External Data (stubbed)</li> |
104 |
| - <ul> |
105 |
| - <li><a class="spec" href="/current/tutorials/mnesia/1.html">Mnesia Tutorial</a></li> |
106 |
| - <li><a class="spec" href="/current/user-guide/extdata/1.html">TBD</a></li> |
107 |
| - </ul> |
108 |
| - |
109 |
| - <li>Development & Deployment (stubbed)</li> |
110 |
| - <ul> |
111 |
| - <li><a class="spec" href="/current/user-guide/devops/1.html">Projects with Rebar</a></li> |
112 |
| - <li><a class="spec" href="/current/user-guide/devops/2.html">Working with Kerl</a></li> |
113 |
| - <li><a class="spec" href="/current/user-guide/devops/3.html">Creating a Library</a></li> |
114 |
| - <li><a class="spec" href="/current/user-guide/devops/4.html">Apps & Services</a></li> |
115 |
| - <li><a class="spec" href="/current/user-guide/devops/5.html">Releasing</a></li> |
116 |
| - <li><a class="spec" href="/current/user-guide/devops/6.html">Running in Production</a></li> |
117 |
| - </ul> |
118 |
| - |
119 |
| - <li>Java Interop</li> |
120 |
| - <ul> |
121 |
| - <li><a class="spec" href="/current/user-guide/java/jinterface/1.html">JInterface</a></li> |
122 |
| - <li><a class="spec" href="/current/user-guide/java/erjang/1.html">Erjang</a></li> |
123 |
| - </ul> |
124 |
| - |
125 |
| - <li>Additional Topics (stubbed)</li> |
126 |
| - <ul> |
127 |
| - <li><a class="spec" href="/current/user-guide/extra/1.html">Scripting</a></li> |
128 |
| - <li><a class="spec" href="/current/user-guide/extra/2.html">Macros</a></li> |
129 |
| - <li><a class="spec" href="/current/user-guide/extra/3.html">Writing for Multi-Core</a></li> |
130 |
| - </ul> |
131 |
| - |
132 |
| - </ol> |
133 |
| - </div> |
134 |
| -</div> |
135 |
| - |
136 |
| - |
137 |
| -<div id="content"> |
138 |
| - <article> |
139 |
| - <h1>1 Introduction</h1> |
140 |
| - |
141 |
| -<h2>1.5 The LFE REPL</h2> |
142 |
| - |
143 |
| -<h3>1.5.1 Using the REPL</h3> |
144 |
| - |
145 |
| -<p>We covered basic REPL usage in the |
146 |
| -<a href="http://lfe.gitbooks.io/quick-start/content/index.html">quick start</a>. |
147 |
| -We'll provide some information about the REPL in the document you are currently |
148 |
| -reading :-)</p> |
149 |
| - |
150 |
| -<h4>1.5.1.1 Starting the REPL</h4> |
151 |
| - |
152 |
| -<p>If you <em>don't</em> have LFE installed system-wide, you need to tell it (Erlang, |
153 |
| -really) where the LFE <code>.beam</code> files are. Here are the three ways to start |
154 |
| -up LFE in this case. The easiest is <code>lfetool</code>:</p> |
155 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ lfetool repl lfe |
156 |
| -</code></pre></div> |
157 |
| -<p>If you're project was built with <code>lfetool</code>, then you'll have a make target |
158 |
| -called <code>shell</code>; calling this will first compile your source files and then |
159 |
| -call out to <code>lfetool</code>. Due to the compiling, this is a little slower way to |
160 |
| -start the REPL (though better for debugging!):</p> |
161 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ make repl |
162 |
| -</code></pre></div> |
163 |
| -<p>The nice thing about both of these is that they automatically add your |
164 |
| -dependencies to <code>ERL_LIBS</code> so you have access to everything you need in the |
165 |
| -REPL itself.</p> |
166 |
| - |
167 |
| -<p>Here are some more ways to start the REPL that don't take care of these niceties |
168 |
| -for you:</p> |
169 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ ./bin/lfe -pa ./ebin |
170 |
| - LFE Shell V5.10.4 <span class="o">(</span>abort with ^G<span class="o">)</span> |
171 |
| - > |
172 |
| -</code></pre></div><div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ erl -user lfe_boot -pa /path/to/lfe/ebin |
173 |
| - LFE Shell V5.10.4 <span class="o">(</span>abort with ^G<span class="o">)</span> |
174 |
| - > |
175 |
| -</code></pre></div> |
176 |
| -<p>You can also start an LFE REPL from the Erlang shell. First hop into <code>erl</code>:</p> |
177 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ erl -pa /path/to/lfe/ebin |
178 |
| - Eshell V5.10.4 <span class="o">(</span>abort with ^G<span class="o">)</span> |
179 |
| - 1> |
180 |
| -</code></pre></div> |
181 |
| -<p>then fire up LFE:</p> |
182 |
| -<div class="highlight"><pre><code class="language-erlang" data-lang="erlang"> <span class="mi">1</span><span class="o">></span> <span class="nn">lfe_shell</span><span class="p">:</span><span class="nf">server</span><span class="p">().</span> |
183 |
| - <span class="nv">LFE</span> <span class="nv">Shell</span> <span class="nv">V5</span><span class="p">.</span><span class="mi">10</span><span class="p">.</span><span class="mi">4</span> <span class="p">(</span><span class="n">abort</span> <span class="n">with</span> <span class="err">^</span><span class="nv">G</span><span class="p">)</span> |
184 |
| - <span class="o">></span> |
185 |
| -</code></pre></div> |
186 |
| -<p>If you do have LFE installed system-wide, then starting the shell can be done in |
187 |
| -the ways listed below.</p> |
188 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ lfe |
189 |
| -</code></pre></div> |
190 |
| -<p>You can also start the LFE REPL by passing options directly to <code>erl</code>. |
191 |
| -Again, assuming that you have LFE installed system-wide, from any directory you |
192 |
| -may do this:</p> |
193 |
| -<div class="highlight"><pre><code class="language-bash" data-lang="bash"> $ erl -user lfe_boot |
194 |
| -</code></pre></div> |
195 |
| -<p>Also, if you happen to be running an Erlang shell already, you can start the |
196 |
| -LFE REPL with the following:</p> |
197 |
| -<div class="highlight"><pre><code class="language-erlang" data-lang="erlang"><span class="mi">14</span><span class="o">></span> <span class="nn">lfe_shell</span><span class="p">:</span><span class="nf">server</span><span class="p">().</span> |
198 |
| -<span class="nv">LFE</span> <span class="nv">Shell</span> <span class="nv">V5</span><span class="p">.</span><span class="mi">9</span><span class="p">.</span><span class="mi">3</span><span class="p">.</span><span class="mi">1</span> <span class="p">(</span><span class="n">abort</span> <span class="n">with</span> <span class="err">^</span><span class="nv">G</span><span class="p">)</span> |
199 |
| -<span class="o">></span> |
200 |
| -</code></pre></div> |
201 |
| -<h4>1.5.1.2 Running Commands</h4> |
202 |
| - |
203 |
| -<p>Once you're in the REPL, it's just a matter of entering code:</p> |
204 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">+</span> <span class="mf">1.5</span> <span class="mi">3</span> <span class="mi">4</span> <span class="mi">5</span> <span class="mi">6</span> <span class="mi">7</span><span class="p">)</span> |
205 |
| -<span class="mi">28</span> |
206 |
| -<span class="nb">></span> |
207 |
| -</code></pre></div> |
208 |
| -<p>Unlike the Erlang shell, the LFE REPL supports defining functions:</p> |
209 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">defun</span> <span class="nb">exp</span> <span class="p">(</span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> |
210 |
| - <span class="p">(</span><span class="nv">trunc</span> <span class="p">(</span><span class="nv">math:pow</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">)))</span> |
211 |
| -<span class="nb">exp</span> |
212 |
| -<span class="nb">></span> |
213 |
| -</code></pre></div> |
214 |
| -<p>Let's put that <code>exp</code> to use:</p> |
215 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">exp</span> <span class="mi">2</span> <span class="mi">6</span><span class="p">)</span> |
216 |
| -<span class="mi">64</span> |
217 |
| -<span class="nb">></span> |
218 |
| -</code></pre></div> |
219 |
| -<p>You could take the <code>lambda</code> route too:</p> |
220 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">set</span> <span class="nb">exp</span> |
221 |
| - <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">x</span> <span class="nv">y</span><span class="p">)</span> |
222 |
| - <span class="p">(</span><span class="nv">trunc</span> <span class="p">(</span><span class="nv">math:pow</span> <span class="nv">x</span> <span class="nv">y</span><span class="p">))))</span> |
223 |
| -<span class="err">#</span><span class="nv">Fun<lfe_eval.15.132627770></span> |
224 |
| -<span class="nb">></span> |
225 |
| -</code></pre></div> |
226 |
| -<p>And, if you want to get nuts:</p> |
227 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">lists:map</span> |
228 |
| - <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">z</span><span class="p">)</span> |
229 |
| - <span class="p">(</span><span class="nb">funcall</span> <span class="nb">exp</span> <span class="p">(</span><span class="nb">car</span> <span class="nv">z</span><span class="p">)</span> <span class="p">(</span><span class="nb">cadr</span> <span class="nv">z</span><span class="p">)))</span> |
230 |
| - <span class="p">(</span><span class="nb">list</span> <span class="p">(</span><span class="nb">list</span> <span class="mf">1.5</span> <span class="mi">0</span><span class="p">)</span> <span class="p">(</span><span class="nb">list</span> <span class="mi">3</span> <span class="mi">4</span><span class="p">)</span> <span class="p">(</span><span class="nb">list</span> <span class="mi">5</span> <span class="mi">6</span><span class="p">)))</span> |
231 |
| -<span class="p">(</span><span class="mi">1</span> <span class="mi">81</span> <span class="mi">15625</span><span class="p">)</span> |
232 |
| -<span class="nb">></span> |
233 |
| -</code></pre></div> |
234 |
| -<h4>1.5.1.3 Quitting the REPL</h4> |
235 |
| - |
236 |
| -<p>Just as there are multiple ways in which you can start the REPL, there are a |
237 |
| -couple ways you can leave it. You can jump into the JCL from the LFE prompt by |
238 |
| -hitting ^g and then entering <code>q</code>:</p> |
239 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="nv">^g</span> |
240 |
| -<span class="nv">User</span> <span class="nv">switch</span> <span class="nv">command</span> |
241 |
| - <span class="nv">--></span> <span class="nv">q</span> |
242 |
| -<span class="nv">$</span> |
243 |
| -</code></pre></div> |
244 |
| -<p>or you can call the Erlang shell's quit function:</p> |
245 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">c:q</span><span class="p">)</span> |
246 |
| -<span class="nv">ok</span> |
247 |
| -<span class="nb">></span> |
248 |
| -<span class="nv">$</span> |
249 |
| -</code></pre></div> |
250 |
| -<p>Or simplest of all, the LFE <code>exit</code> command:</p> |
251 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">exit</span><span class="p">)</span> |
252 |
| -<span class="nv">ok</span> |
253 |
| -<span class="nb">></span> |
254 |
| -<span class="nv">$</span> |
255 |
| -</code></pre></div> |
256 |
| -<h3>1.5.2 Special Functions</h3> |
257 |
| - |
258 |
| -<p>There are some functions specially defined in LFE for use from the REPL. |
259 |
| -These are listed below with information about their use.</p> |
260 |
| - |
261 |
| -<ul> |
262 |
| -<li><p><code>(c File [Options])</code> - Compile and load an LFE file. Assumes default |
263 |
| -extension <code>.lfe</code>.</p></li> |
264 |
| -<li><p><code>(l Module ...)</code> - Load modules.</p></li> |
265 |
| -<li><p><code>(m Module ...)</code> - Print out module information, if no modules are given |
266 |
| -then print information about all modules.</p></li> |
267 |
| -<li><p><code>(ec File [Options])</code> - Compile and load an Erlang file.</p></li> |
268 |
| -<li><p><code>(slurp File)</code> - Slurp in a source LFE file and makes all functions and |
269 |
| -macros defined in the file available in the shell. Only one file can be |
270 |
| -slurped at a time and slurping a new file removes all data about the previous |
271 |
| -one.</p></li> |
272 |
| -<li><p><code>(unslurp)</code> - Remove all function and macro definitions except the |
273 |
| -default ones.</p></li> |
274 |
| -<li><p><code>(set Pattern Expr)</code> - Evaluate Expr and match the result with Pattern |
275 |
| -binding variables in it. These variables can then be used in the shell and |
276 |
| -also rebound in another set.</p></li> |
277 |
| -<li><p><code>(c:command-arg ...)</code> - All the commands in the Erlang shell's |
278 |
| -<a href="http://www.erlang.org/doc/man/c.html">Command Interface Module</a> |
279 |
| -can be reached in this way.</p></li> |
280 |
| -</ul> |
281 |
| - |
282 |
| -<h3>1.5.3 Special Variables</h3> |
283 |
| - |
284 |
| -<p>LFE also provides some convenience variables similar to what Lisp |
285 |
| -has defined for |
286 |
| -<a href="http://www.lispworks.com/documentation/HyperSpec/Body/v_pl_plp.htm"> +, ++, +++</a>, |
287 |
| -<a href="http://www.lispworks.com/documentation/HyperSpec/Body/v__stst_.htm"><em>, *</em>, ***</a>, |
288 |
| -and |
289 |
| -<a href="http://www.lispworks.com/documentation/HyperSpec/Body/v__.htm">-</a>. |
290 |
| -Additionally, LFE also provides the <code>$ENV</code> variable.</p> |
291 |
| - |
292 |
| -<ul> |
293 |
| -<li><code>+/++/+++</code> - The three previous expressions input.</li> |
294 |
| -<li><code>*/**/***</code> - The values of the previous 3 expressions.</li> |
295 |
| -<li><code>-</code> - The current expression input.</li> |
296 |
| -<li><code>$ENV</code> - The current environment (accessible in the REPL as well as in |
297 |
| -macros).</li> |
298 |
| -</ul> |
299 |
| - |
300 |
| -<p>These probably warrant some examples.</p> |
301 |
| - |
302 |
| -<p>Let's say you had just entered the following in the REPL:</p> |
303 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">+</span> <span class="mf">1.5</span> <span class="mf">1.5</span><span class="p">)</span> |
304 |
| -<span class="mi">3</span> |
305 |
| -<span class="nb">></span> <span class="p">(</span><span class="nv">c:memory</span><span class="p">)</span> |
306 |
| -<span class="p">(</span><span class="o">#(</span><span class="nv">total</span> <span class="mi">10026672</span><span class="p">)</span> |
307 |
| - <span class="o">#(</span><span class="nv">processes</span> <span class="mi">1656528</span><span class="p">)</span> |
308 |
| - <span class="o">#(</span><span class="nv">processes_used</span> <span class="mi">1656528</span><span class="p">)</span> |
309 |
| - <span class="o">#(</span><span class="nv">system</span> <span class="mi">8370144</span><span class="p">)</span> |
310 |
| - <span class="o">#(</span><span class="nb">atom</span> <span class="mi">153321</span><span class="p">)</span> |
311 |
| - <span class="o">#(</span><span class="nv">atom_used</span> <span class="mi">147399</span><span class="p">)</span> |
312 |
| - <span class="o">#(</span><span class="nv">binary</span> <span class="mi">1338560</span><span class="p">)</span> |
313 |
| - <span class="o">#(</span><span class="nv">code</span> <span class="mi">3255239</span><span class="p">)</span> |
314 |
| - <span class="o">#(</span><span class="nv">ets</span> <span class="mi">290544</span><span class="p">))</span> |
315 |
| -<span class="nb">></span> <span class="p">(</span><span class="nb">set</span> <span class="nv">my-func</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nv">io:format</span> <span class="s">"Hello, Zaphod!~n"</span><span class="p">)))</span> |
316 |
| -<span class="err">#</span><span class="nv">Fun<lfe_eval.23.86468545></span> |
317 |
| -<span class="nb">></span> |
318 |
| -</code></pre></div> |
319 |
| -<p>Then you can get the previous expressions you input with the following |
320 |
| -commands:</p> |
321 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="nv">+++</span> |
322 |
| -<span class="p">(</span><span class="nb">+</span> <span class="mf">1.5</span> <span class="mf">1.5</span><span class="p">)</span> |
323 |
| -<span class="nb">></span> <span class="nv">+++</span> |
324 |
| -<span class="p">(</span><span class="nv">c:memory</span><span class="p">)</span> |
325 |
| -<span class="nb">></span> <span class="nv">+++</span> |
326 |
| -<span class="p">(</span><span class="nb">set</span> <span class="nv">my-func</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nv">io:format</span> <span class="s">"Hello, Zaphod!~n"</span><span class="p">)))</span> |
327 |
| -<span class="nb">></span> <span class="nv">++</span> |
328 |
| -<span class="nv">+++</span> |
329 |
| -<span class="nb">></span> <span class="nb">+</span> |
330 |
| -<span class="nv">++</span> |
331 |
| -<span class="nb">></span> |
332 |
| -</code></pre></div> |
333 |
| -<p>Most of us will actually use the arrow keys, thanks to the <code>readline</code> |
334 |
| -library. However, the classic, pre-<code>readline</code> approach is still available, |
335 |
| -should you choose to use it.</p> |
336 |
| - |
337 |
| -<p>Similarly, you can get the results returned by using the variabels from the |
338 |
| -second bullet item. If you're following along in the REPL, go ahead and |
339 |
| -re-enter the commands we typed above to reset the last three items in your |
340 |
| -command history. Then do the following:</p> |
341 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="vg">***</span> |
342 |
| -<span class="mi">3</span> |
343 |
| -<span class="nb">></span> <span class="vg">***</span> |
344 |
| -<span class="p">(</span><span class="o">#(</span><span class="nv">total</span> <span class="mi">9976496</span><span class="p">)</span> |
345 |
| - <span class="o">#(</span><span class="nv">processes</span> <span class="mi">1606688</span><span class="p">)</span> |
346 |
| - <span class="o">#(</span><span class="nv">processes_used</span> <span class="mi">1606688</span><span class="p">)</span> |
347 |
| - <span class="o">#(</span><span class="nv">system</span> <span class="mi">8369808</span><span class="p">)</span> |
348 |
| - <span class="o">#(</span><span class="nb">atom</span> <span class="mi">153321</span><span class="p">)</span> |
349 |
| - <span class="o">#(</span><span class="nv">atom_used</span> <span class="mi">147399</span><span class="p">)</span> |
350 |
| - <span class="o">#(</span><span class="nv">binary</span> <span class="mi">1338096</span><span class="p">)</span> |
351 |
| - <span class="o">#(</span><span class="nv">code</span> <span class="mi">3255239</span><span class="p">)</span> |
352 |
| - <span class="o">#(</span><span class="nv">ets</span> <span class="mi">290544</span><span class="p">))</span> |
353 |
| -<span class="nb">></span> <span class="vg">***</span> |
354 |
| -<span class="err">#</span><span class="nv">Fun<lfe_eval.23.86468545></span> |
355 |
| -<span class="nb">></span> <span class="p">(</span><span class="nb">funcall</span> <span class="nb">*</span><span class="p">)</span> |
356 |
| -<span class="nv">Hello,</span> <span class="nv">Zaphod!</span> |
357 |
| -<span class="nv">ok</span> |
358 |
| -<span class="nb">></span> |
359 |
| -</code></pre></div> |
360 |
| -<p>There's another, called the "dash" varibale. It is bound to the actual |
361 |
| -expression that is currently being evaluated. Here's an example of this being |
362 |
| -used:</p> |
363 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">io:format</span> <span class="s">"Evaluating the expression '~p' ...~n"</span> <span class="p">(</span><span class="nb">list</span> <span class="nb">-</span><span class="p">))</span> |
364 |
| -<span class="nv">Evaluating</span> <span class="k">the</span> <span class="nv">expression</span> <span class="ss">'[</span><span class="o">'</span><span class="err">:</span><span class="ss">',io,format,</span> |
365 |
| - <span class="nv">[quote,</span><span class="s">"Evaluating the expression '~p' ...~n"</span><span class="nv">],</span> |
366 |
| - <span class="nv">[list,</span><span class="ss">'-']]</span><span class="o">'</span> <span class="o">...</span> |
367 |
| -<span class="nv">ok</span> |
368 |
| -<span class="nb">></span> |
369 |
| -</code></pre></div> |
370 |
| -<p>We've saved one of the more archane special variables to last: <code>$ENV</code>. |
371 |
| -When you first start up a shell, the <code>$ENV</code> variable holds pristine state |
372 |
| -data:</p> |
373 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="nv">$ENV</span> |
374 |
| -<span class="o">#(</span><span class="nv">env</span> |
375 |
| -<span class="o">...</span> |
376 |
| -<span class="nb">></span> |
377 |
| -</code></pre></div> |
378 |
| -<p>We can define a few variables and then check them out with another display of |
379 |
| -the environment:</p> |
380 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">set</span> <span class="nv">my-var</span> <span class="mi">42</span><span class="p">)</span> |
381 |
| -<span class="mi">42</span> |
382 |
| -<span class="nb">></span> <span class="nv">$ENV</span> |
383 |
| -<span class="o">#(</span><span class="nv">env</span> |
384 |
| -<span class="o">...</span> |
385 |
| - <span class="o">#(</span><span class="nv">my-var</span> <span class="mi">42</span><span class="p">)</span> |
386 |
| -<span class="o">...</span> |
387 |
| -</code></pre></div> |
388 |
| -<p>If you <code>slurp</code> a file in the REPL, your environment will be updated with all |
389 |
| -the definitions in that file:</p> |
390 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">slurp</span> <span class="s">"../lfe/examples/joes-fav.lfe"</span><span class="p">)</span> |
391 |
| -<span class="o">#(</span><span class="nv">ok</span> <span class="nv">joes-fav</span><span class="p">)</span> |
392 |
| -<span class="nb">></span> <span class="nv">$ENV</span> |
393 |
| -<span class="o">...</span> |
394 |
| - <span class="p">(</span><span class="o">#(</span><span class="nv">MODULE</span> <span class="o">#(</span><span class="nv">macro</span> <span class="p">(</span><span class="nv">match-lambda</span> <span class="p">(((</span><span class="nb">list</span><span class="p">)</span> <span class="nv">$ENV</span><span class="p">)</span> <span class="o">`</span><span class="ss">'joes-fav</span><span class="p">))))</span> |
395 |
| -<span class="o">...</span> |
396 |
| - <span class="o">#(</span><span class="nv">run-it</span> |
397 |
| -<span class="o">...</span> |
398 |
| - <span class="o">#(</span><span class="nv">universal-server</span> |
399 |
| -<span class="o">...</span> |
400 |
| -</code></pre></div> |
401 |
| -<p>There is, as you might have guessed, much more to that ellided output (for that |
402 |
| -particular example, nearly all the rest of it is macro definitions).</p> |
403 |
| - |
404 |
| -<p>Making use of <code>$ENV</code> can be very helpful when debugging include files, |
405 |
| -loading Erlang header files, or when creating macros. Furthermore, when spending |
406 |
| -a great deal of time in the REPL prototyping code for a project, it can be |
407 |
| -quite useful to refresh one's memory as to what functions and variables are |
408 |
| -currently available in <code>$ENV</code>.</p> |
409 |
| - |
410 |
| -<p>Looking at the output for <code>$ENV</code> can be a bit overwhelming, however. As you |
411 |
| -might imagine, there is an easy answer to this: filter it! The following makes |
412 |
| -use of the Erlang <code>lists</code> module as well as patterns in an anonymous |
413 |
| -function, both of which will be covered in more detail later. This will |
414 |
| -prevent most nested variables from being displayed:</p> |
415 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nb">defun</span> <span class="nv">filter-env</span> <span class="p">(</span><span class="nv">env</span><span class="p">)</span> |
416 |
| - <span class="p">(</span><span class="nv">lists:foreach</span> |
417 |
| - <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">section</span><span class="p">)</span> |
418 |
| - <span class="p">(</span><span class="nv">lists:foreach</span> |
419 |
| - <span class="p">(</span><span class="nv">match-lambda</span> |
420 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nb">*</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
421 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nv">**</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
422 |
| - <span class="p">((</span><span class="o">`#(</span><span class="vg">***</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
423 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nb">+</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
424 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nv">++</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
425 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nv">+++</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
426 |
| - <span class="p">((</span><span class="o">`#(</span><span class="nb">-</span> <span class="o">,</span><span class="nv">_</span><span class="p">)))</span> |
427 |
| - <span class="p">((</span><span class="o">`#(,</span><span class="nv">name</span> <span class="o">,</span><span class="nv">value</span><span class="p">))</span> |
428 |
| - <span class="p">(</span><span class="nv">lfe_io:format</span> <span class="s">"~s: ~p~n"</span> <span class="o">`</span><span class="p">(</span><span class="o">,</span><span class="nv">name</span> <span class="o">,</span><span class="nv">value</span><span class="p">)))</span> |
429 |
| - <span class="p">((</span><span class="nv">x</span><span class="p">)</span> <span class="p">(</span><span class="nv">filter-env</span> <span class="o">`#(</span><span class="nv">env</span> <span class="o">,</span><span class="nv">x</span><span class="p">))))</span> |
430 |
| - <span class="nv">section</span><span class="p">))</span> |
431 |
| - <span class="p">(</span><span class="nv">lists:nthtail</span> <span class="mi">1</span> <span class="p">(</span><span class="nv">tuple_to_list</span> <span class="nv">env</span><span class="p">))))</span> |
432 |
| -<span class="nv">filter-env</span> |
433 |
| -</code></pre></div> |
434 |
| -<p>Now, as one hacks away in the REPL, <code>slurp</code>ing away at various modules, |
435 |
| -getting a list of what's defined in the current environment is a piece of cake:</p> |
436 |
| -<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">></span> <span class="p">(</span><span class="nv">filter-env</span> <span class="nv">$ENV</span><span class="p">)</span> |
437 |
| -<span class="nv">my-var:</span> <span class="mi">42</span> |
438 |
| -<span class="nv">my-func:</span> <span class="err">#</span><span class="nv">Fun<lfe_eval.23.86468545></span> |
439 |
| -<span class="nv">script-args:</span> <span class="p">()</span> |
440 |
| -<span class="nv">script-name:</span> <span class="s">"lfe"</span> |
441 |
| -<span class="nv">MODULE:</span> <span class="o">#(</span><span class="nv">macro</span> <span class="p">(</span><span class="nv">match-lambda</span> <span class="p">(((</span><span class="nb">list</span><span class="p">)</span> <span class="nv">$ENV</span><span class="p">)</span> <span class="o">`</span><span class="ss">'joes-fav</span><span class="p">)))</span> |
442 |
| -<span class="nv">c:</span> <span class="o">#(</span><span class="nv">macro</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">args</span> <span class="nv">$ENV</span><span class="p">)</span> <span class="o">`</span><span class="p">(</span><span class="err">:</span> <span class="nv">lfe_shell</span> <span class="nv">c</span> <span class="o">,@</span><span class="nv">args</span><span class="p">)))</span> |
443 |
| -<span class="nv">ec:</span> <span class="o">#(</span><span class="nv">macro</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="nv">args</span> <span class="nv">$ENV</span><span class="p">)</span> <span class="o">`</span><span class="p">(</span><span class="err">:</span> <span class="nv">lfe_shell</span> <span class="nv">ec</span> <span class="o">,@</span><span class="nv">args</span><span class="p">)))</span> |
444 |
| -<span class="nv">exit:</span> <span class="o">#(</span><span class="k">function</span> <span class="p">(</span><span class="o">#(</span><span class="mi">0</span> <span class="o">#(</span><span class="nv">dynamic_expr</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="err">:</span> <span class="nv">lfe_shell</span> <span class="nv">exit</span><span class="p">))))))</span> |
445 |
| -<span class="nv">factorial:</span> <span class="o">#(</span><span class="k">function</span> |
446 |
| -<span class="o">...</span> |
447 |
| -<span class="nv">ok</span> |
448 |
| -<span class="nb">></span> |
449 |
| -</code></pre></div> |
450 |
| -<h3>1.5.4 Getting Out of Trouble</h3> |
451 |
| - |
452 |
| -<p>Every once in a while you may find that you do something which causes the REPL |
453 |
| -to crash, presenting you with something that looks like this:</p> |
454 |
| -<div class="highlight"><pre><code class="language-text" data-lang="text"> > |
455 |
| - =ERROR REPORT==== 17-Feb-2013::15:39:33 === |
456 |
| - ... |
457 |
| -</code></pre></div> |
458 |
| -<p>You don't have to quit and restart the REPL, if you don't want to! There are a |
459 |
| -couple of steps that you can take instead.</p> |
460 |
| - |
461 |
| -<h4>1.5.4.1 Interrupting a Shell Process</h4> |
462 |
| - |
463 |
| -<p>When you get an error as seen above, type <code>^g</code>. This will put you into JCL |
464 |
| -(Job Control Language) mode. At the JCL prompt, type <code>?</code> to see a list of |
465 |
| -options:</p> |
466 |
| -<div class="highlight"><pre><code class="language-text" data-lang="text"> User switch command |
467 |
| - --> ? |
468 |
| - c [nn] - connect to job |
469 |
| - i [nn] - interrupt job |
470 |
| - k [nn] - kill job |
471 |
| - j - list all jobs |
472 |
| - s [shell] - start local shell |
473 |
| - r [node [shell]] - start remote shell |
474 |
| - q - quit erlang |
475 |
| - ? | h - this message |
476 |
| -</code></pre></div> |
477 |
| -<p>Let's see what's running:</p> |
478 |
| -<div class="highlight"><pre><code class="language-text" data-lang="text"> --> j |
479 |
| - 1* {lfe_shell,start,[]} |
480 |
| -</code></pre></div> |
481 |
| -<p>Our shell process is still alive, though not responding. Let's interrupt it and |
482 |
| -then connect to it again:</p> |
483 |
| -<div class="highlight"><pre><code class="language-text" data-lang="text"> --> i 1 |
484 |
| - --> c 1 |
485 |
| - exception error: function_clause |
486 |
| - in (: lists sublist #(error interrupted) 1) |
487 |
| - in (lfe_scan string 4) |
488 |
| - in (lfe_io scan_and_parse 3) |
489 |
| - |
490 |
| - > |
491 |
| -</code></pre></div> |
492 |
| -<p>Once we interrupted the job, our error messages were printed to the REPL and we |
493 |
| -were placed back at the LFE prompt.</p> |
494 |
| - |
495 |
| -<h4>1.5.4.2 Starting a New Shell</h4> |
496 |
| - |
497 |
| -<p>Sometimes, though, there is no shell process any more. Here's how to start up |
498 |
| -a new shell process if the one that you're using dies:</p> |
499 |
| -<div class="highlight"><pre><code class="language-text" data-lang="text"> --> s lfe_shell |
500 |
| - --> j |
501 |
| - 2* {lfe_shell,start,[]} |
502 |
| - --> c 2 |
503 |
| - LFE Shell V5.9.3.1 (abort with ^G) |
504 |
| - > |
505 |
| -</code></pre></div> |
506 |
| -<p>And you're back up!</p> |
507 |
| - |
508 |
| - </article> |
509 |
| - |
510 |
| - |
511 |
| - <div class="pagination loop-pagination"> |
512 |
| - |
513 |
| - <a href="1.html" class="previous page-numbers spec">← Previous</a> | |
514 |
| - |
515 |
| - <a class="page-numbers spec" href="">Top</a> | |
516 |
| - <a class="page-numbers spec" href="/current/">Home</a> |
517 |
| - |
518 |
| - | <a href="3.html" class="next page-numbers spec">Next →</a> |
519 |
| - |
520 |
| - </div> |
521 |
| - |
522 |
| - |
523 |
| - |
524 |
| -</div><!-- #content --> |
525 |
| - |
526 |
| - </div> |
527 |
| - <!--[if !IE]><script>fixScale(document);</script><![endif]--> |
528 |
| - <script type="text/javascript"> |
529 |
| - var _gaq = _gaq || []; |
530 |
| - _gaq.push(['_setAccount', 'UA-38274766-1']); |
531 |
| - _gaq.push(['_trackPageview']); |
532 |
| - (function() { |
533 |
| - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; |
534 |
| - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; |
535 |
| - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); |
536 |
| - })(); |
537 |
| - </script> |
538 |
| - </body> |
539 |
| -</html> |
540 |
| - |
| 1 | +<meta http-equiv="refresh" content="0; url=https://cnbbooks.github.io/lfe-manual/current/part1/repl/features.html" /> |
0 commit comments