1.3.1 Walkthrough: Conditionals
In this lesson, we will write a generator that takes an integer and checks if it is an even number between 1 and 100. This will help demonstrate how boolean (true or false) conditional expressions work in Hoon.
:- %say |= [* [n=@ud ~] ~] :- %noun ?: ?& =(0 (mod n 2)) ?& (gte n 1) ?! (gth n 100) == == %.y %.n
On the very first line, with
:- %say we are beginning to create a generator of the
%say variety. The result of a
%say generator is a cell with a head of
%say and tail that is a gate, itself producing a
cask, a pair of a
mark and some data. For more information about
%say generators, see the Generators documentation.
|= [* [n=@ud ~] ~]
The code above builds a gate. The gate's first argument is a cell provided by Dojo that contains some system information we're not going to use, so we use
* to indicate "any noun." The next cell is our arguments provided to the generator upon invocation at the
dojo. Here we only want one
@ud with the face
This code is the third line of the
%say "boilerplate," and it produces a
cask with the head of
%noun. We could use any
mark here, but
%noun is the most generic type, able to fit any data.
Below we'll examine the the series of
? runes used.
?: ?& =(0 (mod n 2))
?: is the simplest "wut" rune. It takes three expressions: a boolean test, a yes-branch, and a no-branch. The yes-branch is executed when the test evaluates to
%.y and the no-branch is executed when the test evaluates to
%.n. Here the yes-branch is
%.y and the no-branch is
%.n. The boolean test is the more complicated portion. First we're going to use
?& to combine two expressions with a logical "and" operation.
The first expression is:
=(0 (mod n 2))
which simply asks if
n is even or not.
The second expression is:
?& (gte n 1) ?! (gth n 100) ==
Again we use the "and" operator on two expressions with
?& the first is just checking if n is greater than or equal to 1. The second we have artificially use the
?! rune to demonstrate its use.
?! is a logical NOT operation. We use that on the result of asking if n is greater than 100 to effectively ask if it is less than or equal to 100.