REPL aka irb#

What is REPL?#

REPL - an abbreviation of read-eval-print loop - is the interactive tool, specific to interpreted programming languages, which reads the input from the stdin, evaluates it and prints the value to the stdout. You may think the REPL is a kind of shell for Ruby, but there is a difference - Unix Shell gets the command, evaluate it but it is not printing the returned value to the stdout. Instead of this, it is keeping it in $? environment variable.

irb#

In Ruby, REPL is called irb - for Interactive RuBy. Inside irb you can launch any ruby command you want, assign variables, define functions, classes, redefine standard Ruby classes - but all the changes will last only with the current irb session. You can treat irb like the Ruby shell: trying out your code, quick testing the functions, learning Ruby. You will spend a lot of time with irb, so get familiar with it!

irb is not the only REPL available for Ruby. Very interesting option is pry, which has many advanced features, like code browsing, great syntax highlighting, editing. For more information, go to the Github: pry/pry.

To run it, launch irb from the shell. To exit, use Ctrl + D or type exit. Below is the example of the REPL session in Ruby:

$ irb
irb(main):001:0> puts 'Hello, world.'
Hello, world.
=> nil
irb(main):002:0> 6 * 7
=> 42
irb(main):003:0> x = 6 * 7
=> 42
irb(main):004:0> x
=> 42
irb(main):005:0> exit
$

Irb prompt#

Like in the Shell, there is a prompt irb(main):001:0> displayed before every keyboard input. Prompt can be changed or even removed. Default prompt contains valuable information: command name, the main object, line number in the current session and indent level.

In all examples in this book IRB prompt is disabled (changed to an empty string), and return value will start with #=> . This is a standard in Ruby documentation and makes copy/paste easier.

6 * 7
#=> 42
x = 6 * 7
#=> 42
x
#=> 42

Evaluating Expressions and Returning Values#

When you type the command, REPL evaluates it and prints its return value followed by arrow =>. This means that the result of puts ‘Hello, world’ is nil (nil is a special Ruby object, which means nothing). Similar the result of multiplication 6 * 7 is 42, the return value of assignment a value to the variable x is this value, and the result of evaluation previously assigned variable x is its value. In Ruby, everything returns value.

If puts returns nil, how can we see the “Hello, world” string in irb session? Note the string is coming before the return value - it appears while evalutating the command. When processing puts method, Ruby prints the string to the stdout, but do not return it. Treating puts as a function, it always returns nil, and the displayed string is a side effect.

The function has a side effects, when in addition to returning value it is also modifing a state of something or it is doing an interaction with outside world. Input and output, manipulating the files - this are the side effects.

Customizing Irb#

To view the current configuration, type in conf command:

irb(main):012:0> conf
=> conf.ap_name="irb"
conf.auto_indent_mode=false
conf.back_trace_limit=16
conf.debug_level=0
conf.echo=true
conf.ignore_eof=false
conf.ignore_sigint=true
conf.inspect_mode=true
conf.irb_name="irb"
conf.irb_path="(irb)"
conf.last_value=...
conf.line_no=12
conf.load_modules=[]
conf.prompt_c="%N(%m):%03n:%i* "
conf.prompt_i="%N(%m):%03n:%i> "
conf.prompt_mode=:DEFAULT
conf.prompt_n="%N(%m):%03n:%i> "
conf.prompt_s="%N(%m):%03n:%i%l "
conf.rc=true
conf.return_format="=> %s\n"
conf.use_readline=nil
conf.verbose=nil

On start irb is looking for following files in the given order: HOME/.irbrc, .irbrc, irb.rc, _irbrc, $irbrc and, when found, loads initialization from it. There are few customizations which makes life with irb easier, two of them are shown in the below example .irbrc file:

require 'pp'
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 1000
IRB.conf[:HISTORY_FILE] = "~/.irb_history"

We will take a look on require command later, for now you should know that it is used for loading the additional Ruby files or libraries. The first library is ‘pp’ - from ‘pretty print’. It gives you an alternative to puts command, formatting Ruby object like Arrays or Hashes prettier and more human-readable than default. The second one, ‘irb/ext/save-history’ is an extention to irb which gives you a possibility to save the history to the file, so in the next session you can recall the previous commands with up arrow - in the same way like in bash or zsh. Next lines configure the number of entries in a history file: IRB.conf[:SAVE_HISTORY] and the location of file itself: IRB.conf[:HISTORY_FILE] = “~/.irb_history”.