add shell/index.md (#32378)
Description of the Erlang shell and how to use it as a simple interpreter.
This commit is contained in:
committed by
Quincy Larson
parent
77210c965a
commit
d6a33dc525
207
guide/english/erlang/shell/index.md
Normal file
207
guide/english/erlang/shell/index.md
Normal file
@ -0,0 +1,207 @@
|
||||
---
|
||||
title: Shell
|
||||
---
|
||||
|
||||
## Shell
|
||||
|
||||
Erlang has a shell that can be use as an interpreter.
|
||||
It can be used as an informal environment in which to try out and test Erlang expressions and simple scripts.
|
||||
|
||||
Note that the Erlang shell is the console for the Erlang virtual machine (known as BEAM).
|
||||
It is console first, interpreter second and is in some respects awkward and in others limited.
|
||||
|
||||
#### More Information:
|
||||
<!-- Please add any articles you think might be helpful to read before writing the article -->
|
||||
|
||||
* [Learn You Some Erlang: Starting Out](https://learnyousomeerlang.com/starting-out)
|
||||
|
||||
|
||||
### Entering and Leaving the Shell
|
||||
|
||||
Once Erlang has been installed on your PC, the shell may be invoked from the command line terminal
|
||||
by entering `erl`:
|
||||
|
||||
```bash
|
||||
$ erl
|
||||
Erlang/OTP 19 [erts-8.1] [source-e7be63d] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]
|
||||
|
||||
Eshell V8.1 (abort with ^G)
|
||||
1>
|
||||
```
|
||||
|
||||
To leave the shell again enter `q().`
|
||||
|
||||
```
|
||||
1> q().
|
||||
ok
|
||||
2> $
|
||||
```
|
||||
|
||||
There may be a short pause before the command line prompt appears.
|
||||
If you are in a hurry you may use ^G followed by q (lower case).
|
||||
Entering ^C twice will also exit the Erlang shell abruptly.
|
||||
|
||||
Note `q().` with a full-stop at the end.
|
||||
The full-stop is a hangover from the early days of Erlang when it ran on top of a Prolog interpreter.
|
||||
|
||||
The full-stop is required. This may take some getting used to.
|
||||
If you type in a command and get no response after a second or two,
|
||||
check that you entered the full-stop.
|
||||
If not, enter the full-stop and press the carriage return or enter key again.
|
||||
|
||||
### Use of the Shell
|
||||
|
||||
The shell will evaluate Erlang expression and print the result (don't forget the full-stop):
|
||||
|
||||
```erlang
|
||||
2> (1 + 1) * 16 .
|
||||
32
|
||||
3>
|
||||
```
|
||||
|
||||
You can bind a value to a variable:
|
||||
|
||||
```erlang
|
||||
3> Joe = 6 .
|
||||
6
|
||||
4>
|
||||
```
|
||||
|
||||
You cannot simply bind a new value to a variable
|
||||
(variables are immutable in the shell too):
|
||||
|
||||
```erlang
|
||||
4> Joe = 8 .
|
||||
** exception error: no match of right hand side value 8
|
||||
5>
|
||||
```
|
||||
|
||||
However, the shell has a special function that allows you to unbind a variable.
|
||||
Then it can be bound once more.
|
||||
|
||||
```erlang
|
||||
5> f(Joe) .
|
||||
ok
|
||||
6> Joe = 8 .
|
||||
8
|
||||
7>
|
||||
```
|
||||
|
||||
There are a number of functions specific to the shell (not available to Erlang scripts and programs).
|
||||
For a list, enter `help().`
|
||||
For a history of what you have entered so far, use `h().`.
|
||||
|
||||
You may call BIFs (built in functions):
|
||||
|
||||
```erlang
|
||||
8> Pi = 3.14 .
|
||||
3.14
|
||||
9> is_integer(Pi) .
|
||||
false
|
||||
10>
|
||||
```
|
||||
|
||||
Most of the Erlang runtime support is already loaded but you will need to use the _module:function_ syntax to invoke them:
|
||||
|
||||
```erlang
|
||||
11> List = ["one", "two", "three"] .
|
||||
["one","two","three"]
|
||||
12> lists:reverse(List) .
|
||||
["three","two","one"]
|
||||
```
|
||||
|
||||
To find out which modules are loaded, enter `m().`
|
||||
|
||||
All functions in Erlang belong to a module.
|
||||
This is part of the reason why you cannot define functions in the shell.
|
||||
|
||||
You can, however, define lambda functions and bind them to variable names:
|
||||
|
||||
```erlang
|
||||
12> AddTen = fun(X) -> X + 10 end .
|
||||
#Fun<erl_eval.6.52032458>
|
||||
13> AddTen(1) .
|
||||
11
|
||||
14>
|
||||
```
|
||||
|
||||
This is not really suitable for anything but the most trivial functions.
|
||||
See next for anything larger.
|
||||
|
||||
### How Run and Test Simple Functions using the Shell
|
||||
|
||||
The notes in this section show how to use the shell to run and test single functions
|
||||
without going to the lengths of setting up a proper test harness.
|
||||
|
||||
Suppose you have been asked to write a function that takes a year number as its parameter and
|
||||
returns true if the number represents a leap year, false otherwise.
|
||||
|
||||
Suppose your solution is in the file _leap.erl_ and looks a lot like:
|
||||
|
||||
```erlang
|
||||
-module(leap).
|
||||
|
||||
-export([leap_year/1]).
|
||||
|
||||
year(Year) ->
|
||||
case Year of
|
||||
_ when Year rem 400 == 0 ->
|
||||
true;
|
||||
_ when Year rem 100 == 0 ->
|
||||
false;
|
||||
_ when Year rem 4 == 0 ->
|
||||
true;
|
||||
_ ->
|
||||
false
|
||||
end.
|
||||
```
|
||||
|
||||
The problem now is how to test the solution.
|
||||
|
||||
First you need to be 'in the right directory' (or folder if you prefer):
|
||||
|
||||
```erlang
|
||||
% what directory am I in ?
|
||||
14> pwd().
|
||||
/home/fcc/guides/erlang/shell
|
||||
|
||||
% is the source file in here ?
|
||||
15> ls().
|
||||
index.md
|
||||
|
||||
% guess not - is in an adjacent directory ?
|
||||
16> ls("../examples").
|
||||
leap.erl
|
||||
|
||||
% good - change directory:
|
||||
17> cd("../examples").
|
||||
```
|
||||
|
||||
Now compile and load the module leap (one command):
|
||||
|
||||
```erlang
|
||||
18> c(leap).
|
||||
{ok,leap}
|
||||
```
|
||||
|
||||
Now test the function by simply calling it with suitable values:
|
||||
|
||||
```erlang
|
||||
19> leap:year(2018).
|
||||
false
|
||||
20> leap:year(2020).
|
||||
true
|
||||
21> leap:year(1066).
|
||||
false
|
||||
22> leap:year(2000).
|
||||
true
|
||||
23> leap:year(1100).
|
||||
false
|
||||
24>
|
||||
```
|
||||
|
||||
If you decide the function does not work, edit and save the source file,
|
||||
compile and load the module again and test.
|
||||
Repeat until satisfied.
|
||||
|
||||
<!-- EOF -->
|
Reference in New Issue
Block a user