Branching#

Sometimes we may want programs to do different things in certain conditions. For example, if we’re writing a murder-mystery game, characters might act differently depending on whether the player is acting as an investigator or a friend of the victim. Often, these are achieved by listing different things that the program does for each case we want to consider.

In Crochet, this is achieved by testing for conditions, and then using branches in the code. This section describes these tools in more details.

Conditions#

The condition syntax allows one to list a sequence of conditions and their effects. Crochet will then pick the first condition that holds—the first condition which evaluates to true— and execute the effects associated with it.

For example, if we have a rock-paper-scissors game, we can describe the possible outcomes of the game by using conditions:

enum move = rock, paper, scissors;

command (Player is move) against: (Other is move) do
  condition
    when (Player is rock) and (Other is scissors) => "Player wins";
    when (Player is paper) and (Other is rock) => "Player wins";
    when (Player is scissors) and (Other is paper) => "Player wins";

    when (Other is rock) and (Player is scissors) => "Other wins";
    when (Other is paper) and (Player is rock) => "Other wins";
    when (Other is scissors) and (Player is paper) => "Other wins";

    when Player === Other => "It's a draw";
  end
end

So each condition is specified with the when keyword, using some logical test. The effect of this condition can be described as a single expression with the => Expression syntax, or a sequence of expressions with the do ... end syntax.

We can also end a list of conditions with the otherwise keyword. This always matches, so if every other condition has failed, we’ll execute this effect. otherwise is just a nicer way of writing when true:

condition
  when Number < 0 => "It's negative";
  when Number > 0 => "It's positive";
  otherwise => "It's zero";
end