Skip to content

Commit 96a867c

Browse files
authoredNov 13, 2020
Redirect to new home for this content.
1 parent 60a2cfc commit 96a867c

File tree

1 file changed

+1
-540
lines changed
  • docs/current/user-guide/intro

1 file changed

+1
-540
lines changed
 

‎docs/current/user-guide/intro/2.html

+1-540
Original file line numberDiff line numberDiff line change
@@ -1,540 +1 @@
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">&#9776;</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&#39;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&#39;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&#39;re project was built with <code>lfetool</code>, then you&#39;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&#39;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-
&gt;
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-
&gt;
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&gt;
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">&gt;</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">&gt;</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">&gt;</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">&gt;</span>
200-
</code></pre></div>
201-
<h4>1.5.1.2 Running Commands</h4>
202-
203-
<p>Once you&#39;re in the REPL, it&#39;s just a matter of entering code:</p>
204-
<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">&gt;</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">&gt;</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">&gt;</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">&gt;</span>
213-
</code></pre></div>
214-
<p>Let&#39;s put that <code>exp</code> to use:</p>
215-
<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">&gt;</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">&gt;</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">&gt;</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&lt;lfe_eval.15.132627770&gt;</span>
224-
<span class="nb">&gt;</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">&gt;</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">&gt;</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">&gt;</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">--&gt;</span> <span class="nv">q</span>
242-
<span class="nv">$</span>
243-
</code></pre></div>
244-
<p>or you can call the Erlang shell&#39;s quit function:</p>
245-
<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">&gt;</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">&gt;</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">&gt;</span> <span class="p">(</span><span class="nv">exit</span><span class="p">)</span>
252-
<span class="nv">ok</span>
253-
<span class="nb">&gt;</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&#39;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&#39;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">&gt;</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">&gt;</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">&gt;</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">&quot;Hello, Zaphod!~n&quot;</span><span class="p">)))</span>
316-
<span class="err">#</span><span class="nv">Fun&lt;lfe_eval.23.86468545&gt;</span>
317-
<span class="nb">&gt;</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">&gt;</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">&gt;</span> <span class="nv">+++</span>
324-
<span class="p">(</span><span class="nv">c:memory</span><span class="p">)</span>
325-
<span class="nb">&gt;</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">&quot;Hello, Zaphod!~n&quot;</span><span class="p">)))</span>
327-
<span class="nb">&gt;</span> <span class="nv">++</span>
328-
<span class="nv">+++</span>
329-
<span class="nb">&gt;</span> <span class="nb">+</span>
330-
<span class="nv">++</span>
331-
<span class="nb">&gt;</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&#39;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">&gt;</span> <span class="vg">***</span>
342-
<span class="mi">3</span>
343-
<span class="nb">&gt;</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">&gt;</span> <span class="vg">***</span>
354-
<span class="err">#</span><span class="nv">Fun&lt;lfe_eval.23.86468545&gt;</span>
355-
<span class="nb">&gt;</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">&gt;</span>
359-
</code></pre></div>
360-
<p>There&#39;s another, called the &quot;dash&quot; varibale. It is bound to the actual
361-
expression that is currently being evaluated. Here&#39;s an example of this being
362-
used:</p>
363-
<div class="highlight"><pre><code class="language-cl" data-lang="cl"><span class="nb">&gt;</span> <span class="p">(</span><span class="nv">io:format</span> <span class="s">&quot;Evaluating the expression &#39;~p&#39; ...~n&quot;</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">&#39;[</span><span class="o">&#39;</span><span class="err">:</span><span class="ss">&#39;,io,format,</span>
365-
<span class="nv">[quote,</span><span class="s">&quot;Evaluating the expression &#39;~p&#39; ...~n&quot;</span><span class="nv">],</span>
366-
<span class="nv">[list,</span><span class="ss">&#39;-&#39;]]</span><span class="o">&#39;</span> <span class="o">...</span>
367-
<span class="nv">ok</span>
368-
<span class="nb">&gt;</span>
369-
</code></pre></div>
370-
<p>We&#39;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">&gt;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</span> <span class="p">(</span><span class="nv">slurp</span> <span class="s">&quot;../lfe/examples/joes-fav.lfe&quot;</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">&gt;</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">&#39;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&#39;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">&gt;</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">&quot;~s: ~p~n&quot;</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&#39;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">&gt;</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&lt;lfe_eval.23.86468545&gt;</span>
439-
<span class="nv">script-args:</span> <span class="p">()</span>
440-
<span class="nv">script-name:</span> <span class="s">&quot;lfe&quot;</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">&#39;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">&gt;</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"> &gt;
455-
=ERROR REPORT==== 17-Feb-2013::15:39:33 ===
456-
...
457-
</code></pre></div>
458-
<p>You don&#39;t have to quit and restart the REPL, if you don&#39;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-
--&gt; ?
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&#39;s see what&#39;s running:</p>
478-
<div class="highlight"><pre><code class="language-text" data-lang="text"> --&gt; j
479-
1* {lfe_shell,start,[]}
480-
</code></pre></div>
481-
<p>Our shell process is still alive, though not responding. Let&#39;s interrupt it and
482-
then connect to it again:</p>
483-
<div class="highlight"><pre><code class="language-text" data-lang="text"> --&gt; i 1
484-
--&gt; 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-
&gt;
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&#39;s how to start up
498-
a new shell process if the one that you&#39;re using dies:</p>
499-
<div class="highlight"><pre><code class="language-text" data-lang="text"> --&gt; s lfe_shell
500-
--&gt; j
501-
2* {lfe_shell,start,[]}
502-
--&gt; c 2
503-
LFE Shell V5.9.3.1 (abort with ^G)
504-
&gt;
505-
</code></pre></div>
506-
<p>And you&#39;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">&larr; 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 &rarr;</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

Comments
 (0)
Please sign in to comment.