組み込み型

整数型

整数型 int は 64 ビット符号付き整数を表します。

リテラル

整数リテラルは以下のように記述します。

var zero = 0
var one = 1
var n = 65535

浮動小数点数型

浮動小数点数型 float は環境依存の精度を持つ浮動小数点数を表します。

リテラル

浮動小数点数リテラルは以下のように記述します。

var zero = 0.0
var n = 1.5
var big = 1.0+e9
var small = 1.0-E9

真偽値型

真偽値型 booltrue または false を表します。

リテラル

真偽値リテラルは truefalse です。

var b1 = true
var b2 = false

文字列型

文字列型 string は文字列を表します。

リテラル

文字列リテラルにはシングルクォートリテラル, ダブルクォートリテラル, 及び raw リテラルがあります。文字列リテラルには改行を含むことができます。

シングルクォートリテラル

シングルクォートリテラルは、\\\' を除いて文字列の解釈は行われません。

echo('abc')  // => abc
echo('\r\n') // => \r\n
echo('\'\\') // => '\
ダブルクォートリテラル

ダブルクォートリテラルでは、エスケープシーケンス、式展開、変数展開が有効になります。

変数展開

$var と記述すると、文字列に変数を埋め込みます。

式展開

${expr} と記述すると、式を評価した結果を文字列に埋め込みます。式には任意の式を使用できます。

var n = 40
var foo = 'foo'
echo("answer: ${ n + 2 }")     // => answer: 42
echo("${ "${ n + 2 } $foo" }") // => 42 foo
raw リテラル

r プレフィックスを付けた文字列リテラルは raw 文字列リテラルです。raw 文字列リテラル内では、一切の解釈は行われません。

assert r'\\' == '\\\\'
assert r"\n" == "\\\n"

タプル型

タプル型 (Type1, Type2, ...) は複数の値を組み合わせた値を表します。タプル型とシーケンス型以外の任意の型を要素として使用できます。

タプル内で ... を使用することでタプルを展開できます。エイリアスされたタプルにも適用可能です。

var int3: (...(int, int), int)
assert typeof(int3) == '(int, int, int)'

type int_pair = (int, int)
var int4 = (...int_pair, ...int_pair)
assert typeof(int4) == '(int, int, int, int)'

リテラル

タプルリテラルは以下のように記述します。

var int_pair: (int, int) = (10, 20)

配列型

配列型 []Type は任意長の要素を持つ配列を表します。

リテラル

配列リテラルには [v1, v2, ...][]Type{len: n, init: v} の 2つの記述方法があります。前者の記法では少なくとも1つの要素含む必要があります。

var arr1 = [1, 1, 1]
var arr2 = []int{len: 3, init: 1}
assert(arr1 == arr2)

マップ型

マップ型 map[KeyType]ValueType はキーと値のペアのコレクションを表します。

リテラル

マップリテラルは以下のように記述します。いずれの記述方法でも同じ値が得られます。

var map1 = { 'key': 'value' }
var map2 = map{ 'key': 'value' }
var map3 = map[string]string{ 'key: 'value' }

型エイリアス

type TypeName = TargetType で型エイリアスを定義できます。

type Vec2 = (int, int)
var v: Vec2 = (1, 2)

メソッド

型に対してメソッドを定義できます。レシーバ以外は通常の関数と同様です。レシーバは値であり、レシーバを変更しても元の変数は変更されません。

type Num = int
fn (n: Num) twice(): Num {
  return n * 2
}

var two: Num = 2
assert(two.twice().twice() == 4)

演算子オーバーロード

型に対して二項演算子および単項演算子のオーバーロードができます。

type Vec2 = (int, int)

fn (lhs: Vec2) + (rhs: Vec2): Vec2 {
  return (lhs[0] + rhs[0], lhs[1] + rhs[1])
}

fn (v: Vec2) * (n: int): Vec2 {
  return (v[0] * n, v[1] * n)
}

fn -(v: Vec2): Vec2 {
  return v * -1
}

var v1: Vec2 = (1, 2)
var v2: Vec2 = (2, 1)
assert(v1 + v2 == (3, 3))
assert(v1 * 2 == (2, 4))
assert(-v1 == (-1, -2))

Copyright © zakuro <z@kuro.red>

Design by zakuro & Yuki Amane (Pianoforte)