7Idris comes with a ``REPL``.
12Being a fully dependently typed language, Idris has two phases where it
13evaluates things, compile-time and run-time. At compile-time it will only
14evaluate things which it knows to be total (i.e. terminating and covering all
15possible inputs) in order to keep type checking decidable. The compile-time
16evaluator is part of the Idris kernel, and is implemented in Haskell using a
17HOAS (higher order abstract syntax) style representation of values. Since
18everything is known to have a normal form here, the evaluation strategy doesn't
19actually matter because either way it will get the same answer, and in practice
20it will do whatever the Haskell run-time system chooses to do.
22The REPL, for convenience, uses the compile-time notion of evaluation. As well
23as being easier to implement (because we have the evaluator available) this can
24be very useful to show how terms evaluate in the type checker. So you can see
25the difference between:
29 Idris> \n, m => (S n) + m
30 \n => \m => S (plus n m) : Nat -> Nat -> Nat
32 Idris> \n, m => n + (S m)
33 \n => \m => plus n (S m) : Nat -> Nat -> Nat
38Idris supports initialisation scripts.
43When the Idris REPL starts up, it will attempt to open the file
44repl/init in Idris's application data directory. The application data
45directory is the result of the Haskell function call
46``getAppUserDataDirectory "idris"``, which on most Unix-like systems
47will return $HOME/.idris and on various versions of Windows will return
48paths such as ``C:/Documents And Settings/user/Application Data/appName``.
50The file repl/init is a newline-separate list of REPL commands. Not all
51commands are supported in initialisation scripts — only the subset that
52will not interfere with the normal operation of the REPL. In particular,
53setting colours, display options such as showing implicits, and log
56Example initialisation script
57~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
60 :colour prompt white italic bold
61 :colour implicit magenta italic
68The current set of supported commands are:
70+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
71|Command | Arguments | Purpose |
72+================+==============================+==========================================================================================================+
73|<expr> | | Evaluate an expression |
74+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
75|:t :type | <expr> | Check the type of an expression |
76+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
77|:core | <expr> | View the core language representation of a term |
78+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
79|:miss :missing | <name> | Show missing clauses |
80+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
81|:doc | <name> | Show internal documentation |
82+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
83|:mkdoc | <namespace> | Generate IdrisDoc for namespace(s) and dependencies |
84+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
85|:apropos | [<package list>] <name> | Search names, types, and documentation |
86+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
87|:s :search | [<package list>] <expr> | Search for values by type |
88+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
89|:wc :whocalls | <name> | List the callers of some name |
90+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
91|:cw :callswho | <name> | List the callees of some name |
92+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
93|:browse | <namespace> | List the contents of some namespace |
94+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
95|:total | <name> | Check the totality of a name |
96+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
97|:r :reload | | Reload current file |
98+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
99|:l :load | <filename> | Load a new file |
100+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
101|:cd | <filename> | Change working directory |
102+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
103|:module | <module> | Import an extra module |
104+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
105|:e :edit | | Edit current file using $EDITOR or $VISUAL |
106+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
107|:m :metavars | | Show remaining proof obligations (metavariables) |
108+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
109|:p :prove | <metavar> | Prove a metavariable |
110+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
111|:a :addproof | <name> | Add proof to source file |
112+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
113|:rmproof | <name> | Remove proof from proof stack |
114+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
115|:showproof | <name> | Show proof |
116+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
117|:proofs | | Show available proofs |
118+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
119|:x | <expr> | Execute IO actions resulting from an expression using the interpreter |
120+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
121|:c :compile | <filename> | Compile to an executable [codegen] <filename> |
122+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
123|:exec :execute | [<expr>] | Compile to an executable and run |
124+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
125|:dynamic | <filename> | Dynamically load a C library (similar to %dynamic) |
126+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
127|:dynamic | | List dynamically loaded C libraries |
128+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
129|:? :h :help | | Display this help text |
130+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
131|:set | <option> | Set an option (errorcontext, showimplicits) |
132+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
133|:unset | <option> | Unset an option |
134+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
135|:color :colour | <option> | Turn REPL colours on or off; set a specific colour |
136+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
137|:consolewidth | auto|infinite|<number> | Set the width of the console |
138+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
139|:printerdepth | <number-or-blank> | Set the maximum pretty-printing depth, or infinite if nothing specified |
140+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
141|:q :quit | | Exit the Idris system |
142+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
143|:w :warranty | | Displays warranty information |
144+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
145|:let | (<top-level-declaration>)... | Evaluate a declaration, such as a function definition, instance implementation, or fixity declaration |
146+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
147|:unlet :undefine|(<name>)... | Remove the listed repl definitions, or all repl definitions if no names given |
148+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
149|:printdef | <name> | Show the definition of a function |
150+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
151|:pp :pprint | <option> <number> <name> | Pretty prints an Idris function in either LaTeX or HTML and for a specified width. |
152+----------------+------------------------------+----------------------------------------------------------------------------------------------------------+
162The command ``:help`` (or ``:h`` or ``:?``) prints a short summary of
163the available commands.
168If you would like to leave Idris, simply use ``:q`` or ``:quit``.
170Evaluating expressions
171~~~~~~~~~~~~~~~~~~~~~~
173To evaluate an expression, simply type it. If Idris is unable to infer
174the type, it can be helpful to use the operator ``the`` to manually
175provide one, as Idris's syntax does not allow for direct type
176annotations. Examples of ``the`` include:
184 Idris> the (List Nat) [1,2]
186 Idris> the (Vect _ Nat) [1,2]
189This may not work in cases where the expression still involves ambiguous
190names. The name can be disambiguated by using the ``with`` keyword:
195 When elaborating an application of function Prelude.Foldable.sum:
196 Can't disambiguate name: Prelude.List.::,
199 Idris> with List sum [1,2,3]
205To add a let binding to the REPL, use ``:let``. It's likely you'll also
206need to provide a type annotation. ``:let`` also works for other
207declarations as well, such as ``data``.
211 Idris> :let x : String; x = "hello"
214 Idris> :let data Foo : Type where Bar : Foo
218Getting type information
219~~~~~~~~~~~~~~~~~~~~~~~~
221To ask Idris for the type of some expression, use the ``:t`` command.
222Additionally, if used with an overloaded name, Idris will provide all
223overloadings and their types. To ask for the type of an infix operator,
224surround it in parentheses.
231 Prelude.Nat.plus : Nat -> Nat -> Nat
233 Builtins.++ : String -> String -> String
234 Prelude.List.++ : (List a) -> (List a) -> List a
235 Prelude.Vect.++ : (Vect m a) -> (Vect n a) -> Vect (m + n) a
237 plus (Builtins.fromInteger 4) : Nat -> Nat
239You can also ask for basic information about typeclasses with ``:doc``:
250 (>>=) : Monad m => m a -> (a -> m b) -> m b
262Other documentation is also available from ``:doc``:
267 Prelude.Classes.+ : (a : Type) -> (Num a) -> a -> a -> a
272 Class constraint Prelude.Classes.Num a
279 Data type Prelude.Vect.Vect : Nat -> Type -> Type
287 Prelude.Vect.Nil : (a : Type) -> Vect 0 a
290 Prelude.Vect.:: : (a : Type) -> (n : Nat) -> a -> (Vect n a) -> Vect (S n) a
301 Type class Prelude.Monad.Monad
304 Prelude.Monad.>>= : (m : Type -> Type) -> (a : Type) -> (b : Type) -> (Monad m) -> (m a) -> (a -> m b) -> m b
309 Class constraint Prelude.Monad.Monad m
316The command ``:apropos`` searches names, types, and documentation for
317some string, and prints the results. For example:
322 eqPtr : Ptr -> Ptr -> IO Bool
325 eqSucc : (left : Nat) -> (right : Nat) -> (left = right) -> S left = S right
328 lemma_both_neq : ((x = x') -> _|_) -> ((y = y') -> _|_) -> ((x, y) = (x', y')) -> _|_
331 lemma_fst_neq_snd_eq : ((x = x') -> _|_) -> (y = y') -> ((x, y) = (x', y)) -> _|_
334 lemma_snd_neq : (x = x) -> ((y = y') -> _|_) -> ((x, y) = (x, y')) -> _|_
337 lemma_x_eq_xs_neq : (x = y) -> ((xs = ys) -> _|_) -> (x :: xs = y :: ys) -> _|_
340 lemma_x_neq_xs_eq : ((x = y) -> _|_) -> (xs = ys) -> (x :: xs = y :: ys) -> _|_
343 lemma_x_neq_xs_neq : ((x = y) -> _|_) -> ((xs = ys) -> _|_) -> (x :: xs = y :: ys) -> _|_
346 prim__eqB16 : Bits16 -> Bits16 -> Int
348 prim__eqB16x8 : Bits16x8 -> Bits16x8 -> Bits16x8
350 prim__eqB32 : Bits32 -> Bits32 -> Int
352 prim__eqB32x4 : Bits32x4 -> Bits32x4 -> Bits32x4
354 prim__eqB64 : Bits64 -> Bits64 -> Int
356 prim__eqB64x2 : Bits64x2 -> Bits64x2 -> Bits64x2
358 prim__eqB8 : Bits8 -> Bits8 -> Int
360 prim__eqB8x16 : Bits8x16 -> Bits8x16 -> Bits8x16
362 prim__eqBigInt : Integer -> Integer -> Int
364 prim__eqChar : Char -> Char -> Int
366 prim__eqFloat : Float -> Float -> Int
368 prim__eqInt : Int -> Int -> Int
370 prim__eqString : String -> String -> Int
372 prim__syntactic_eq : (a : Type) -> (b : Type) -> (x : a) -> (y : b) -> Maybe (x = y)
374 sequence : Traversable t => Applicative f => (t (f a)) -> f (t a)
377 sequence_ : Foldable t => Applicative f => (t (f a)) -> f ()
381 The Eq class defines inequality and equality.
383 GTE : Nat -> Nat -> Type
384 Greater than or equal to
386 LTE : Nat -> Nat -> Type
387 Proofs that n is less than or equal to m
389 gte : Nat -> Nat -> Bool
390 Boolean test than one Nat is greater than or equal to another
392 lte : Nat -> Nat -> Bool
393 Boolean test than one Nat is less than or equal to another
396 Convert the number to its ASCII equivalent.
398 replace : (x = y) -> (P x) -> P y
399 Perform substitution in a term according to some equality.
401 sym : (l = r) -> r = l
402 Symmetry of propositional equality
404 trans : (a = b) -> (b = c) -> a = c
405 Transitivity of propositional equality
407``:search`` does a type-based search, in the spirit of Hoogle. See `Type-directed search (:search) <https://github.com/idris-lang/Idris-dev/wiki/Type-directed-search-%28%3Asearch%29>`_ for more details. Here is an example:
411 Idris> :search a -> b -> a
412 = Prelude.Basics.const : a -> b -> a
413 Constant function. Ignores its second argument.
415 = assert_smaller : a -> b -> b
416 Assert to the totality checker than y is always structurally
417 smaller than x (which is typically a pattern argument)
419 > malloc : Int -> a -> a
422 > Prelude.pow : Num a => a -> Nat -> a
425 > Prelude.Classes.(*) : Num a => a -> a -> a
428 > Prelude.Classes.(+) : Num a => a -> a -> a
431``:search`` can also look for dependent types:
435 Idris> :search plus (S n) n = plus n (S n)
436 < Prelude.Nat.plusSuccRightSucc : (left : Nat) ->
438 S (left + right) = left + S right
440Loading and reloading Idris code
441~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
443The command ``:l File.idr`` will load File.idr into the
444currently-running REPL, and ``:r`` will reload the last file that was
450All Idris definitions are checked for totality. The command
451``:total <NAME>`` will display the result of that check. If a definition
452is not total, this may be due to an incomplete pattern match. If that is
453the case, ``:missing`` or ``:miss`` will display the missing cases.
458The command ``:e`` launches your default editor on the current module.
459After control returns to Idris, the file is reloaded.
464The current module can be compiled to an executable using the command
465``:c <FILENAME>`` or ``:compile <FILENAME>``. This command allows to
466specify codegen, so for example JavaScript can be generated using
467``:c javascript <FILENAME>``. The ``:exec`` command will compile the
468program to a temporary file and run the resulting executable.
473Unlike GHCI, the Idris REPL is not inside of an implicit IO monad. This
474means that a special command must be used to execute IO actions.
475``:x tm`` will execute the IO action ``tm`` in an Idris interpreter.
477Dynamically loading C libraries
478~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
480Sometimes, an Idris program will depend on external libraries written in
481C. In order to use these libraries from the Idris interpreter, they must
482first be dynamically loaded. This is achieved through the
483``%dynamic <LIB>`` directive in Idris source files or through the
484``:dynamic <LIB>`` command at the REPL. The current set of dynamically
485loaded libraries can be viewed by executing ``:dynamic`` with no
486arguments. These libraries are available through the Idris FFI in `type
487providers <#type-providers>`__ and ``:exec``.
492Idris terms are available in amazing colour! By default, the Idris REPL
493uses colour to distinguish between data constructors, types or type
494constructors, operators, bound variables, and implicit arguments. This
495feature is available on all POSIX-like systems, and there are plans to
496allow it to work on Windows as well.
498If you do not like the default colours, they can be turned off using the
505and, when boredom strikes, they can be re-enabled using the command
511To modify a colour, use the command
515 :colour <CATEGORY> <OPTIONS>
517where ``<CATEGORY`` is one of ``keyword``, ``boundvar``, ``implicit``,
518``function``, ``type``, ``data``, or ``prompt``, and is a
519space-separated list drawn from the colours and the font options. The
520available colours are ``default``, ``black``, ``yellow``, ``cyan``,
521``red``, ``blue``, ``white``, ``green``, and ``magenta``. If more than
522one colour is specified, the last one takes precedence. The available
523options are ``dull`` and ``vivid``, ``bold`` and ``nobold``, ``italic``
524and ``noitalic``, ``underline`` and ``nounderline``, forming pairs of
525opposites. The colour ``default`` refers to your terminal's default
528The colours used at startup can be changed using REPL initialisation
531Colour can be disabled at startup by the ``--nocolour`` command-line
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list