The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

SPVM::Document::Spec - SPVM language specification(BETA)

Number literal

Default number literal type is int.

  123

You can use hex number literal by start 0x. A, B, C, D, E, F must be upper case.

  0xAF

If you use . in number literal, the number is floating point literal.

  1.23

You can use E or e to specify exponential notation.

  1.23E+12
  1.23E-12
  1.23e+12
  1.23e-12

You can use under line _ in number literal. Under line is meanless, only for visuality.

  123_456
  0xAB_CD

You can use specifier to specify number leteral type

  • b

      # Byte
      123b
  • s

      # Short
      123s
  • L

      # Long
      123L
  • f

      # Float
      123f
      # Double
      123d

Type

Numeric type

Numeric types are byte, short, int, long, float, double.

  byte    signed integer          1byte
  short   signed integer          2byte
  int     signed integer          4byte
  long    signed integer          8byte
  float   floating-point number   4byte
  double  floating-point number   8byte

Declaration

  my $value : byte;
  my $value : short;
  my $value : int;
  my $value : long;
  my $value : float;
  my $value : double;

String type

String type is string.

This is same as byte[] at internal data structure.

Declaration

  my $string : string;

Reference type

Reference types are `array` and `object`.

Object type

    PackageName

Declaration

    my $object : PackageName;

Array type

  byte[]   byte array
  short[]  short array
  int[]    int array array
  long[]   long array
  float[]  float array
  doube[]  double array
  PackageName[] object array

Declaration

  my $values : byte[];
  my $values : short[];
  my $values : int[];
  my $values : long[];
  my $values : float[];
  my $values : double[];
  my $values : PackageName[];

Multiple array type

  my $values : byte[][];
  my $values : short[][];
  my $values : int[][];
  my $values : long[][];
  my $values : float[][];
  my $values : double[][];
  my $values : PackageName[][];

  my $values : byte[][][];
  my $values : short[][][];
  my $values : int[][][];
  my $values : long[][][];
  my $values : float[][][];
  my $values : double[][][];
  my $values : PackageName[][][];

Type inference

If the type of right value is known, the type of left value is automatically decided.

  # Type of $value2 is byte.
  my $value1 : byte;
  my $value2 = $value1;

  # Type of $values2 is int[]
  my $values1 = new int[3];
  my $values2 = $values1;

  # Type of $object2 is PackageName
  my $object1 = new PackageName
  my $object2 = $object1;

Array

Create array

Array is created by new. Elements values is not initialized.

  my $nums = new byte[3];
  my $nums = new short[3];
  my $nums = new int[3];
  my $nums = new long[3];
  my $nums = new float[3];
  my $nums = new double[3];

Get array length

  my $len = @$nums;
  my $len = @{$nums};
  my $len = len $nums;

Get and set array element

  # Get
  my $num = $nums->[0];

  # Set
  $nums->[0] = 5;

Condition branch

  if (1) {

  }
  elsif (2) {

  }
  else {

  }

Loop

for

  my $nums = new int[10];
  for (my $i = 0; $i < @$nums; $i++) {
    $nums->[$i] = 0;
  }

while

  my $nums = new int[10];
  my $i = 0;
  while ($i < @$nums) {
    $nums->[$i] = 0;
  }

Constant

Constant type

Type of constant default integral value is `int`.

  # int type
  1;
  3;

Type of constant default floating-point value is `double`.

  # double
  1.2
  5.3

Type of constant is specified by type specifier.

  # long
  3L

  # float
  3.2f

  # double
  3.2d

POD

  =pod
    AAAA
  =cut

__END__

  __END__

Exception

Exception occur

  die "Error";

Catch exception

  eval {
    die "Error";
  };

Exception message

  $@;

Name

Package name

Package name is a combination of alphabets, numbers, and `::`. Numbers should not appear as the first character. `_` can't be used in class name.

  # OK
  Foo
  Foo::Bar
  Foo1::Bar1

  # Not OK
  1Foo
  Foo::2Bar
  Foo_Bar;

Subroutine name

Subroutine name is a combination of alphabets, numbers, and `_` separators. Continual `_`(For example `__`) can't be used in subroutine name.

  # OK
  foo
  foo1
  foo_bar

  # Not OK
  1foo
  foo__bar

Field name

Field name is a combination of alphabets, numbers, and `_` separators. Continual `_`(For example `__`) can't be used in field name.

  # OK
  foo
  foo1
  foo_bar

  # Not OK
  1foo
  foo__bar

Absolute name

Absolute name is combination of package name and subroutine name, or package name and field name.

  PackageName1::foo
  PackageName1::PackageName2::foo_bar

Limitation

Object can't have object and array of object.

If I have idea to implement weaken reference and implement weaken reference, this limitation is removed.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 55:

Unknown directive: =tem