Desk言語概説
4726 ワード
- 値と型とエフェクトがある
- 全ての値は不変である
- 型が値の真の名である
- 変数名はビジュアルプログラミングには不要であるため存在しない
- 同じ型の値がスコープに複数存在して区別することはできない
- nominalに定義されるものは存在しない
- 型付けにはstructural subtypingを用いる
- 識別子には予約記号で始まらない空白を含む任意のUTF-8文字列を用いることができる
-
camelCase
やsnake_case
はアンチパターンである
@first name "ryo" (型は@first name 'string)
-
-
()
の中身がコメントである - 全ての型は先頭のトークンにより種別を判断できる
-
ident
は型変数である -
'number
は数値である -
'string
は文字列である -
* type, ...
は直積である- 単に
*
はunitを表す -
* a, b
<:a
である
- 単に
-
+ type, ...
は直和である- 単に
+
はneverを表す -
a
<:+ a, b
である
- 単に
-
[type]
はベクターである -
{type}
は集合である -
\ type, ... -> type
は関数である -
$ ident ~ type
は全称である -
@ident type
はラベル付された型である-
a
<:@label a
かつ@label a
<:a
である -
@ident
がブランドである場合はa
<:@brand a
でない
-
-
! type ~ effect expr
はエフェクトを伴う型である-
effect expr
はエフェクト集合を計算する式である -
{effect, ...}
はエフェクト集合である -
+ effect expr, ...
はエフェクト集合の加算である -
- effect expr, effect expr
はエフェクト集合の減算である -
> type ~ type, ...
は関数呼出に伴うエフェクトの集合である
-
! 'string ~ - > a 'number, {'number => 'string} (文字列型であり、a('number)のエフェクト集合から {'number => 'string}を引いたエフェクト集合を持つ)
-
_
は推論される型である -
?
はHoleである -
% type, ...
が型クラスとなるであろう
-
- エフェクトは入力型と出力型を指定して
type => type
と表現する - 全ての構文は式およびリテラルである
- リテラルには数値・文字列・ベクター・集合・直積がある
-
1
や1.5
や2/3
は数値である -
"abc"
は文字列である -
[expr, ...]
はベクターである -
{expr, ...}
は集合である -
* expr, ...
は直積である
-
- 全ての式は先頭のトークンによって種別を判断できる
-
?
はHoleである -
$ expr ~ expr
はlet式である(~
は省略可能)-
$ expr: type ~ expr
のように型を明示した定義も可能である
(let number = 1 in number) $ 1 ~ &'number
-
-
> type ~ type, ...
は唯一の演算子である関数呼び出しである-
> type
の場合、値を参照する
-
-
+ expr ~ type -> expr, ...
は唯一の制御式であるmatch式である- 直和型を型に場合分けし、それぞれ処理を行う
- match式の型は各caseの型の直和となる
+ expr ~ 'number -> @this is a number * 'string -> @this is a string * (式全体の型は + @this is a number *, @this is a string *)
-
& type
は> type
である -
\ type, ... -> expr
は関数である -
^ expr : type
は型アノテーションである^> \ 'number, 'number -> @sum 'number ~ 1, 2: 'number (@sum 'numberを'numberにキャスト)
-
! expr => type
はエフェクトのperformを示す- perform式の型は
type
となる - 計算が中断され
expr
の計算結果と継続がハンドラーに渡る -
=>
以降は省略可能になるはずである
- perform式の型は
-
'handle expr ~ effect -> expr, ...
はエフェクトフルな式にハンドラーをアタッチする- ハンドラーではperformされたエフェクトの入力型の値を使うことができる
- エフェクトフルな式の型を
t
、performされたエフェクトをinput => output
とするときoutput => t
なエフェクトをperformすることで継続を実行できる - その際、代わりに
<! expr
でも継続できる - 継続は任意の回数実行できる
'type add \'number, 'number -> @sum 'number 'handle $ ! "a" => 'number: x ~ >add &x, &x (performした結果を2倍する) 'string => 'number -> >add (1でcontinueした結果と2でcontinueした結果を足す) <! 1, <! 2 (1*2 + 2*2 = 6を返す)
-
@ident expr
は式の型にラベルを付ける式である
-
Author And Source
この問題について(Desk言語概説), 我々は、より多くの情報をここで見つけました https://zenn.dev/ryo33/articles/f3a3b42e936ee4著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol