Primitive Types
- i8, i32, i64, i128
- u8, u32, u64, u128
- f32, f64
- char
Built-in Types
- String
- Vec<T>
- Map<K, V>
- Set<T>
Comments
// single comment のみDefine
// マーカー型
# Created
// Record Type
# User
id: UserId
name: Name
// newtype
# UserId: u64
// 関数
# fn a: i32, b: i32, c: i32 -> i32
a * b * c
# Yes<T>: T
# No<T>: T
# It<T, E> :any Yes, No
# GetUser -> :any User, NotFound, Critical
it = get-user |> !
? it
:is User user => user
:is NotFound => _
:is Critical cause => log cause |> !
# DatabaseResult :any Disconnected, SyntaxError
# Query sql: SQL -> DatabaseResult
# GetUser id: UserId -> :any User, DatabaseResult
# GetUserResult :is $.type:return GetUser
# Publish<T> message: T -> Void
# Subscribe<T> fn: i(message: T -> Void) -> Void
:pub
:GetUser
:resolve Query, At.building, './select-user.sql'
get-user q: Query, id: UserId ->
q id |> !Module
// 全体に公開
:share .all
# Model
// 自分が配置されているdir以下に公開
:share .tree
# Model
// 自分が配置されているdirのみに公開
:share .here
# Model
// import
@ ./model
Model
// lib
@ std/file
File
// path alias
@ ~/repositories/user
UserString
// primitive は char のみ
a: char = 'a'
// String と文字列操作はstd libからimportする
@std/string
String
replace
pad-start
pad-end
repeat
length
a: char[4] = 'aaaa'
a: String = String:from 'aaaaa' |> !
replaced = replace /a/g, 'b' a |> !
// bbbbb
replaced = replace 'a', 'b' a |> !
// bbbbbFunction
// カリー
// a, b を束縛
f = f 1, 2
// 残りの引数を入れた後実行
f 3 |> !
:pub
# Vec<T>
:pub
:for Vec<T>
# With xs: Vec<T>, x: T -> Vec<T>
:pub
:for Vec<T>
# RemoveAt xs: Vec<T>, index: u64 -> Vec<T>
:pub
:for Vec<T>
// 無名関数内の引数名を省略できないようにする
# Map<T, U> transform: (x: T -> U), xs: Vec<T> -> Vec<U>
:pub
# GetUser select: Select, id: UserId -> :any
User
UserNotFound
TooManyResults
GiveUp
:pub
:async
get-user: GetUser select, id ->
'select * from users where id = {id}'
|> sanitize
|> select
|> :await
|> :match
:is Empty => UserNotFound id |> !
:is One found => User:from found |> !
:is Many results => TooManyResults:from results |> !
:else cause => GiveUp:from cause |> !
|> !
a: i32 = 0
a: i32:r = 0
a: i32:w = 0
a: i32:r:w = 0
# File
:pub
:for File
# Open path: PathLike, mode: Mode -> File
:for File
:when .linux
open path, mode ->
// epoll使う
:for File
:when .windows
open path, mode ->
// IOCP使う
:pub
# Add a: u32, b: u32 -> :any u32, OverFlow
:pub
:test 'limit', t ->
limit: u32 = upper-limit<u32>!
result = add limit, 10 |> !
? result
:is OverFlow => t:ok!
:else v => t:err v |> !
add: Add a, b ->
sum = a + b
? sum
:in 0..upper-limit<u32>! => sum
:else => OverFlow:from '{a}, {b}'