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
Weak reference
Using weak reference, recursive reference is resolved.
my $foo = new Foo;
my $bar = new Bar;
# Recursive reference
$foo->{bar} = $foo;
$bar->{foo} = $foo;
# Weak reference
weaken $foo->{bar};
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 55:
Unknown directive: =tem