Closed15
自作言語(処理系)の夢

名前
Gamma
- ギリシャアルファベットの三番目の文字
- ラテンアルファベットの三番目の C と対応
- 第一音が濁点でつよそう
- ググラビティにほどほどに配慮(C とか F# とかの反面教師)
- 拡張子は
.ga
とか? - CLI フロントエンドのコマンド名も
gamma
にしとこう。-
dotnet
,go
,cargo
,nim
などから(サブ)コマンド体系は拝借する。
-
- コンパイラのコマンド名は
gammac
(Gamma Compiler)

データ型
特に数値型の名前は Rust にならうこととする。
-
整数型 -
i8
..i128
,u8
..u128
-
浮動小数点数 -
f16
,f32
,f64
-
bool
-true
/false
-
unit
- ML 系?にならうこととする。()
のみの値。
文字と文字列
Unicode 対応。内部表現は UTF-8 になっているといいなあ。
基底
.NET にならうならば object
だが、よその言語ではどんな感じですか?

配列・コレクション
組み込み型として提供する
-
配列 -
array<'T>
-
連結リスト -
list<'T>
-
集合 -
set<'T>
-
seq -
seq<'T>

リテラル
- 文字列リテラル
"foo"
-
"foo"a
とかa"foo"
とか接頭辞または接尾辞つきで追加の属性(この場合 ASCII) - 補完文字列は
f"foo {bar}"
(Python 風)とか$"foo {bar}"
(C# 風) - 三連二重引用符でよくあるやつ
"""
-
- 文字リテラル
'a'
- 内部形式を UTF-8 としたときに一文字あたりのデータサイズがかなり可変。
- 数値リテラル
- Rust にならうか?
-
0xff
とか0b_1111_1110
とか0o777
とか - 正規表現リテラル
/regex/

予約語・キーワード(文脈依存を含む)
すべて lower case
-
let
,var
,const
,constexpr
-
func
,proc
,action
struct
-
if
else
-
this
ORself
constructor
-
enum
/record
module
namespace
約物類
-
:=
- 変数束縛 -
|>
- パイプライン演算子(F# から拝借) -
>>
- シフト演算子なのか関数合成なのか -
{}
- ブロック、集合 -
()
- 関数呼び出し、unit
-
[]
- インデクサ、配列; e.g.bytes[3]
-
<>
- 型パラメータ; e.g.list<'T>
-
[||]
- 連結リスト -
(,)
- タプル; e.g.let a : (i32, string) := (42, "Hello");
-
'
- 型パラメータ -
<-
- 再代入(Hasckell とか) -
->
- 関数型、匿名関数; e.g.let f : (i32 -> i32) := func x -> x + x;
-
{,}
- 集合; e.g.let a : set<i32> := { 1, 2, 3 .. 20 };
(外延) -
::
- 名前空間区切り

やらないことと代わりにやること
反面教師的な
-
&&&
,~~~
,|||
で論理演算(F# のはイヤ)- よくある
&&
,||
-
and
/or
/xor
/not
- よくある
- みっつ以上つらなる約物(JavaScript の
===
を念頭)-
...
→ ✔..
-
- 型名の前置 (C-like)
- Pascal や Rust にならう
-
=
<>
で等値比較(F# のはイヤ)-
==
,!=
-
-
!
の論理否定(if (!bool)
が見づらいとかなんとか)-
not
キーワード
-
-
-lt
,-gt
,-eq
のシェル風演算子- ふつうに約物を採用する
-
begin
/end
のブロック- ブレース
{}
で構成する
- ブレース
- 前方参照
- F# や Python にならって禁止
- キーワードの極端な省略
- e.g.
fst
,snd
,trd
,exn
(ML 系?にありがち?) - e.g.
fn
,fun
- 音節単位で区切りたい
- e.g.
-
funcName = value
表記の値の返却(VB アンチ)- 素直に
return value
とするか、関数型にならってvalue
- 素直に
- 継承
- インターフェイスなら OK
- クラス・構造体
- 審議中

標準ストリーム
echo
関連のみ特別としたい。
-
echo "Hello, world!"
- シェルや Nim 互換 -
warn "Something wrong
- 標準エラー出力 -
err
- Go のpanic
?

printf
? println
? sprint
?

メモリ管理
- だいたい GC 任せ
- C/C++ みたいに手動で
malloc
/free
したくない - Rust ほど厳格でなくていいが、ライフタイムの概念とかはふんわり盛り込みたい

ターゲット
巨人の肩にのっておこう
- WASM
- .NET
- JVM
- LLVM

識別子
-
``identifier``
で逐語的なやつ(F#) -
foo?
で predicate、foo!
で副作用込み(Ruby)- 強い静的型付けならば不要?
- .NET の慣習では三人称で predicate
-
foo!
でマクロをあらわす (Rust) - アポストロフィ
'
で型パラメータの明示-
'T
まではいいが'TResult
となると冗長?
-

Visual Basic っぽい?
- 英単語の演算子を好む(約物ではなく)
- 後置の型注釈

MoonBit
このスクラップは4ヶ月前にクローズされました