The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

Name

SPVM::Document::Language::Statements - Statements in The SPVM Language

Description

This document describes statements in the SPVM language.

Statements

A statement is a basic instruction that tells the program what to do.

Statements can be written direct under the scope block.

  # Scope block
  {
    # Statements
    STATEMENT1
    STATEMENT2
    STATEMENT3
  }

Conditional Statements

if Statement

The if statement is a conditional statement with the following syntax.

  if (CONDITION1) {
    
  }
  elsif (CONDITION2) {
    
  }
  elsif (CONDITIONn) {
    
  }
  else {
    
  }

The elsif statement and the else statement are optional.

At first, all elsif statements are expanded to the following code using if - else statements.

  if (CONDITION1) {
    
  }
  else {
    if (CONDITION2) {
      
    }
    else {
      if (CONDITIONn) {
        
      }
      else {
        
      }
    }
  }

The if statement is converted to simple if - else statements, so see a simple if - else statement.

  if (CONDITION) {
    
  }
  else {
    
  }

The boolean conversion is performed on the condition CONDITION.

If the evaluated value is not 0, the program jumps to the beginning of the if block.

If the evaluated value is 0 and there is the else block, the program jumps to the beginning of the else block.

If the evaluated value is 0 and there is no else block, the program jumps to the end of the if block.

A if - else statement is enclosed by an invisible simple block.

  {
    if (CONDITION) {
      
    }
    else {
      
    }
  }

Examples:

  # if statement.
  my $flag = 1;
  
  if ($flag == 1) {
    say "One";
  }
  
  # if statement with elsif and else
  my $flag = 2;
  
  if ($flag == 1) {
    say "One";
  }
  elsif ($flag == 2) {
    say "Two";
  }
  elsif ($flag == 3) {
    say "Three";
  }
  else {
    say "Other";
  }

else Statement

The else statement is a conditional statement used in the if statement.

  if (CONDITION) {
    
  }
  else {
    
  }

elsif Statement

The elsif statement is a conditional statement used in the if statement.

  if (CONDITION1) {
  
  }
  elsif (CONDITION2) {
  
  }

unless Statement

The unless statement is a conditional statement with the following syntax.

  unless (CONDITION) {
    
  }

The unless statement is expanded to the following code.

  if (!CONDITION) {
    
  }

Examples:

  # unless statement.
  my $flag = 1;
  
  unless ($flag == 0) {
    say "Not Zero";
  }

switch Statement

The switch statement is a conditional statement with the following syntax.

  # The switch statement
  switch (CONDITION) {
    case CASE1: {
      # ...
    }
    case CASE2: {
      # ...
    }
    case CASEn: {
      # ...
    }
    default: {
      # ...
    }
  }

The integer promotional conversion is performed on the condition CONDITION.

The operand of the case statement CASEn must be a character literal, an integer literal and an enumeration value.

If CASEn is a character literal, the value is converted to the int type at compile-time.

The case statements and the default statement are optional.

If CONDITION matches CASEn, the program jumps to the beginning of the case block of CASEn.

If there are no case statements and no default statement, the program jumps to the end of the switch block.

If there is the default statement and CONDITION dose not matches CASEn, the program jumps to the beginning of the default block.

If there is no default statement and CONDITION dose not matches CASEn, the program jumps to the end of the switch block.

A break statement is implicitly added to the end of the statements in every case block.

  case CASEn: {
    # A break statement is added implicitly to the end of the statements
    break;
  }

It is allowed to jump multiple case statements into a single block.

  switch (CONDITION) {
    case CASE1:
    case CASE2:
    {
      # ...
    }
  }

Compilation Errors:

CONDITION must be an integer type within int, otherwise a compilation error occurs.

The values of the case statements cannnot be duplicated. If so, a compilation error occurs.

Examples:

  # switch statement
  my $code = 2;
  my $flag = 1;
  switch ($code) {
    case 1: {
      say "1";
    }
    case 2: {
      say "2";
    }
    case 3: {
      if ($flag) {
        break;
      }
      say "3";
    }
    case 4:
    case 5:
    {
      say "4 or 5";
    }
    default: {
      say "Other";
    }
  }
  
  # switch statement using enumeration
  class Foo {
    enum {
      ID1,
      ID2,
      ID3,
    }
    
    static method main : int () {
      my $value = 1;
      switch ($value) {
        case Foo->ID1: {
          say "1";
        }
        case Foo->ID2: {
          say "2";
        }
        case Foo->ID3: {
          if ($flag) {
            break;
          }
          say "3";
        }
        default: {
          say "Other";
        }
      }
    }
  }

case Statement

The case statement specifies a case in the switch statement.

  # The case statement
  switch (CONDITION) {
    case CASEn: {
      # ...
    }
  }

default Statement

The default statement specifies a default case in the switch statement.

  # The default statement
  switch (CONDITION) {
    default: {
      # ...
    }
  }

break Statement

The break statement makes the program jump to the end of the switch block.

  # The break statement
  break;

Examples:

  my $code = 2;
  my $flag = 1;
  switch ($code) {
    case 3: {
      if ($flag) {
        # The break statement makes the program jump to the end of the switch block
        break;
      }
      say "3";
    }
    default: {
      say "Other";
    }
  }
  # The end of the switch block

Loop Statements

while Statement

The while statement is a loop statement with the following syntax.

  # The while statement
  while (CONDITION) {
  
  }

The boolean conversion is performed on the condition CONDITION.

If the evaluated value is 0, the program jumps to the end of the while block, otherwise the program jumps to the beginning of the while block.

When the program reaches the end of the while block, it jumps to the beginning of the while statement.

Examples:

  # The while statement
  my $i = 0;
  while ($i < 5) {
    
    say "$i";
    
    $i++;
  }

The while statement is enclosed by an invisible simple block.

  {
    while (CONDITION) {
    
    }
  }

next Statement

The next statement makes the program jump to the beginning of the current while statement.

  # The next statement
  next;

Examples:

  my $i = 0;
  
  # The beginning of the while statement
  while ($i < 5) {
  
    if ($i == 3) {
      $i++;
      
      # The next statement makes the program jump to the beginning of the current while statement.
      next;
    }
    
    say "$i";
    $i++;
  }

last Statement

The last statement makes the program jump to the end of the current while statement.

  # The last statement
  last;

Examples:

  while (1) {
    # The last statement makes the program jump to the end fo the current while statement.
    last;
  }
  # The end fo the while statement

for Statement

The for statement is a loop statement with the following syntax.

  # The for statement
  for (INIT; CONDITION; INCREMENT) {
  
  }

A for statement is expanded to the following code using a while statement.

  {
    INIT;
    while (CONDITION) {
      
      # ...
      
      INCREMENT;
    }
  }

Exampels:

  # The for statement
  for (my $i = 0; $i < 5; $i++) {
    say "$i";
  }

for-each Statement

The for-each statement is a loop statement with the following syntax.

  # The for-each statemenet
  for my VAR (@ARRAY) {
    
  }
  
  for my VAR (@{ARRAY}) {
    
  }

A for-each statement is expanded to the following code using a for statement.

  for (my $i = 0; $i < @{ARRAY}; $i++) {
    my VAR = ARRAY->[$i];
    
  }

Example:

  # The for-each statemenet
  my $array = [1, 2, 3];
  for my $element (@$array) {
    say "$elemenet";
  }

return Statement

The return statement returns a value for a method.

  // void
  return;
  
  // non-void
  return OPERAND;

Compilation Errors:

If the return type of the current method is the void typ, OPERAND cannnot exist. If so, a compilation error occurs.

If the return type of the current method is the non-void type, OPERAND must exist, otherwise a compilation error occurs.

The type of OPERAND must satisfy the assignment requirement to the return type of the current method, otherwise a compilation error occurs.

die Statement

The die statement throws an exception.

  # The die statement
  die
  die OPERAND_MESSAGE
  
  # The die statement with an error class
  die ERROR_CLASS
  die ERROR_CLASS OPERAND_MESSAGE
  
  # The die statement with the basic type ID of an error class
  die OPERAND_ERROR_ID, OPERAND_MESSAGE

OPERAND_MESSAGE is a string of the string type for an error message. If the exception thrown by the die statement is catched, the exception variable $@ is set to OPERAND_MESSAGE with stack traces added.

If the exception is not catched, the program prints it to SPVM's stderr, and finishes the program with an error ID.

The following is an example of stack traces of an exception message.

  Error
    TestCase::Minimal->sum2 at SPVM/TestCase/Minimal.spvm line 1640
    TestCase->main at SPVM/TestCase.spvm line 1198

If OPERAND_MESSAGE is not given or undef, OPERAND_MESSAGE is set to "Error".

ERROR_CLASS is a class name, normally of the Error class, or its child class. If the exception thrown by the die statement is catched, the eval_error_id is set to the basic type ID of ERROR_CLASS.

The integer promotional conversion is performed on OPERAND_ERROR_ID.

OPERAND_ERROR_ID is an integer value within int type. If it is given and the exception thrown by the die statement is catched, the eval_error_id is set to OPERAND_ERROR_ID.

See also Exception Handling for exception handling using the die statement.

Comlication Errors:

OPERAND_MESSAGE must be the string type or the undef type, otherwise a compilation error occurs.

ERROR_CLASS must be a class type, otherwise a compilation error occurs.

OPERAND_ERROR_ID must be an integer type within int, otherwise a compilation error occurs.

Examples:

  # The die statement with exception handling
  eval {
    die "Error";
  }
  
  if ($@) {
    # ...
  }
  
  # The die statement with an error class
  die Error::System "System Error";
  
  # The die statement with the basic type ID of an error class
  my $error_id = Fn->get_basic_type_id("Error::System");
  die $error_id, "System Error";

Operator Statement

The operator statement operates an operator.

  # The operator statemenet
  OPERATOR;

Examples:

  1;
  $var;
  1 + 2;
  &foo();
  my $num = 1 + 2;

Empty Statement

The empty statement operates nothing.

  # The empty statemenet
  ;

See Also

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License