Creating a New Project
2 The LFE REPL
Did you just say "REPL"? What's a "REPL"?
"REPL" is short for "read-eval-print loop", what other languages sometimes call the "interactive interpreter." Lisp had a REPL (and interpreter) back in the 60s, when the designers of many of today's languages were still in diapers (or hadn't yet arrived on-planet).
The REPL lets you type LFE code and execute it on the spot -- no files, instant feedback.
Wanna give it a try?
2.1 Starting the LFE REPL
If you chose the Docker adventure, then you will already be sitting in the REPL. If you built from source, you can catch up with the following:
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async... ..-~.~_~---.. ( \\ ) | A Lisp-2+ on the Erlang VM |`-.._/_\\_.-'; | Type (help) for usage info. | g (_ \ | | n | | | Docs: http://docs.lfe.io/ ( a / / | Source: http://github.com/rvirding/lfe \ l (_/ | \ r / | LFE v1.0 (abort with ^G) `-E___.-' >
2.2 Interactive LFE Code
Now we're all on the same page: setting in our LFE REPLs. Let's have some fun. How about some math? Let's make LFE display The Answer:
> (* 2 21) 42
Here's LFE's "Hello, World!":
> (io:format "Hello, World!~n") Hello, World! ok
Here's how you set a variable in the REPL ... and call the
seq function in
the Erlang standard library's
> (set my-list (lists:seq 1 6)) (1 2 3 4 5 6)
We just created a sequence of numbers and assigned it to the
variable. Let's sum that list using another function in the
> (* 2 (lists:sum my-list)) 42
Wanna get functional? Here's an anonymous function, an accumulator, and a left fold (known as a "reduce" in some languages):
> (* 2 (lists:foldl (lambda (n acc) (+ n acc)) 0 my-list)) 42
We can even define functions and macros in the REPL (which you can't actually do in the Erlang shell!). Let's turn the code above into an easy-to-use function:
> (defun my-sum (start stop) (let ((my-list (lists:seq start stop))) (* 2 (lists:foldl (lambda (n acc) (+ n acc)) 0 my-list)))) my-sum
And try it out!
> (my-sum 1 6) 42
We're going to skip macros for now ... ;-)
2.3 Exploring the REPL
There are many other things you can do in the LFE REPL. You may have noticed the
(help) command in the LFE banner when you started it up -- this is a great place to start:
> (help) LFE shell built-in functions (c file) -- compile and load code in <file> (cd dir) -- change working directory to <dir> (ec file) -- compile and load code in erlang <file> (exit) -- quit - an alias for (q) (help) -- help info (i) -- information about the system (l module) -- load or reload <module> (ls) -- list files in the current directory (clear) -- clear the the REPL output (ls dir) -- list files in directory <dir> (m) -- which modules are loaded (m mod) -- information about module <mod> (pid x y z) -- convert <x>, <y> and <z> to a pid (pwd) -- print working directory (q) -- quit - shorthand for init:stop/0 (flush) -- flushes all messages sent to the shell (regs) -- information about registered processes LFE shell built-in commands (reset-environment) -- resets the environment to its initial state (set pattern expr) (set pattern (when guard) expr) -- evaluate <expr> and match the result with pattern binding (slurp file) -- slurp in a LFE source <file> and makes everything available in the shell (unslurp) -- revert back to the state before the last slurp (run file) -- execute all the shell commands in a <file> LFE shell built-in variables +/++/+++ -- the tree previous expressions */**/*** -- the values of the previous expressions - -- the current expression output $ENV -- the current LFE environment ok
Try a couple of these out:
> (pwd) /home/oubiwann/lab/lfe/lfe ok
> (ls) .dockerignore .git .gitignore .rebar .travis.yml Dockerfile Emakefile LICENSE Makefile README.md VERSION _build bin c_src doc ebin emacs examples get_maps_opts.escript include maps.mk maps_opts.mk priv rebar.config rebar.config.script rebar.lock src test ok
You can taste it, can't you? That LFE flavor coming your way? Yup, you're right. You're going to be looking at LFE modules next ...