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 OR self
  • 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 }; (外延)
  • :: - 名前空間区切り
四ツ山伊吹四ツ山伊吹

算術演算

  • 四則演算 + - * /
  • **
    • C# でときおりほしくなるやつ
  • 剰余 %
    • div mod がどうのこうの
  • 複合代入? += -=` はなくていいか
  • increment ++ / decrement -- は?
四ツ山伊吹四ツ山伊吹
  • エディタの検索で引っかかりやすいようなのがよい
    • e.g. record で検索すればレコード型の定義にあたれる
    • e.g. foo( で検索すれば foo の関数呼び出しにあたれる
四ツ山伊吹四ツ山伊吹

やらないことと代わりにやること

反面教師的な

  • &&&, ~~~, ||| で論理演算(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
    • 音節単位で区切りたい
  • funcName = value 表記の値の返却(VB アンチ)
    • 素直に return value とするか、関数型にならって value
  • 継承
    • インターフェイスなら OK
  • クラス・構造体
    • 審議中
四ツ山伊吹四ツ山伊吹

標準ストリーム

echo 関連のみ特別としたい。

  • echo "Hello, world!" - シェルや Nim 互換
  • warn "Something wrong - 標準エラー出力
  • err - Go の panic ?
四ツ山伊吹四ツ山伊吹

メモリ管理

  • だいたい GC 任せ
  • C/C++ みたいに手動で malloc / free したくない
  • Rust ほど厳格でなくていいが、ライフタイムの概念とかはふんわり盛り込みたい
四ツ山伊吹四ツ山伊吹

識別子

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

Visual Basic っぽい?

  • 英単語の演算子を好む(約物ではなく)
  • 後置の型注釈
このスクラップは4ヶ月前にクローズされました