Giter Club home page Giter Club logo

logix-as-a-text's Introduction

logix-as-a-text

重要: このプロジェクトは凍結されています。後継言語はoriglangを、コーディングツールはMirageXを参照してください。

なにこれ

  • LogiXをテキスト管理できるようにするプロジェクト

動機

  • 特に大きいプロジェクトだと限界があるよね
  • だからツールチェイン作りたいよね

言語設計

コンセプト

  • LogiXをテキストで管理できるようにする
  • 既存の言語の良い点及び「良い慣習」、「広く受け入れられている慣習」を取り入れる
    • 例: 算術加算を行う演算子を+にする、演算子を中置記法で固定するなど

目指すところ

  • 既存の言語の改善できる点を改善すること
  • 厳密に定義された規格を作り上げること
  • LogiXのローレイヤーを抽象化する
    • 例: Attach Audio ClipAttach MeshAttach SpriteAttach Texture 2Dは出力こそ異なるものの、やりたいことは完全に同一なので、
  • 既存のアセットとの簡単な相互IOをできるようにする
  • LogiXのリファクタリングをより簡単にする

目指さないところ

  • (暗黙のモノパック)

構文

(※構想は構文段階であることに注意されたい)

Hello World

プログラマのみなさんにとってはおなじみのHello Worldは簡単にできる。

"Hello, World!" -> display

これは Hello, World! という値を持つ Input > string ノードを作成し、Display ノードにそのまま出力する。

画像: (Now printing...)

logix-as-a-text's People

Contributors

kisaragieffective avatar renovate[bot] avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

logix-as-a-text's Issues

`Range`のサポート

基本的なコンセプト

  • Range.Inclusive<T>: T型の範囲。終点を含む。
  • Range.Exclusive<T>: T型の範囲。終点を含まない。

制約

  • T: RustのPartialOrd
  • イテレーターとして使う場合、T: Range.Iterator.NextElementが必要。

関数のサポート

関数があると同一のコードを複数回書くことを強制されないので便利!

リストのサポート

リスト

  1. 可変長
  2. 順序付き
  3. 値を任意個入れられ
  4. 多相である

他言語の例

  • Java: java.util.List<E>
  • C#: System.Collection.Generic.IList<E>
  • JavaScript: (Array) [^1]
  • Rust: std::vec::Vec<E> [^1]

実装手法

そもそもできるの?

  • ダイナミックにスロットをスポーンする
  • ペンのバーテックスを有効活用する

`in` 演算子のサポート

概要

  • expr in iterable という形で演算子をサポートする

実装ノート

  • expr: Tかつiterable: Range.Inclusive<T>だった場合、Is Betweenノードを使っても良い

アトリビュート

1. LogiX上には出力されないメタデータを格納するため

  • 共通言語基盤のアセンブリのバージョン
  • nullable or not-null

2. 条件付きコンパイルを行うため

Rustの#[cfg_attr]みたいな

3. コンパイラマジックを発火させるため

(TBD)

`#[inline]`、`#[maybe_inline]`のサポート

  • #[inline]: 関数に付与した場合、その関数はLogiXへコンパイルされたあとでもインラインされる。絶対に (MUST)。
  • #[maybe_inlined]: 関数に付与した場合、その関数はインライン展開されるかもしれない (MAY)。コンパイラのヒューリスティクスによってはインライン展開されないかもしれない (MAY NOT)。

オーバーロードのサポート

一部のノードはオーバーロードをサポートしているので、言語仕様の策定が必要

デザインノート

定義

  1. ノードが複数の引数リストの候補を持つとき、「そのノードはオーバーロードされている」という。

オーバーロードの選択方法

前提

  • 各ステップの終了時:
    • オーバーロードの候補が一つになったならそこで探索を終了する
    • オーバーロードの候補がゼロになったならコンパイルエラー
  1. call-siteの個数に合う引数リストに絞り込む
  2. 引数リストの候補を調べ、call-siteの式の型に合致することができる引数リストに絞り込む
  3. 引数の型とその引数に与えられている型を調べる。
    1. 正確にマッチする (例: u8の文脈で1が与えられている) 場合、クラスAに1を加算する。
    2. 暗黙の型変換を経由してマッチする (例: u16の文脈に_: u8が与えられている) 場合、クラスBに1を加算する。
    3. ジェネリクスでマッチした場合、クラスCに1を加算する。
  4. クラスAの値が最も高い引数リストに絞り込む
  5. クラスBの値が最も高い引数リストに絞り込む
  6. クラスCの値が最も高い引数リストに絞り込む
  7. オーバーロードが解決できないとしてコンパイルエラー

型推論の導入

エルゴノミクスの観点からHM型推論のような推論システムを導入したい

評価順序強制演算子: `*>`

概要

*>演算子とは、左結合の二項演算子である。ある特定の文脈内 (以下、F) で計算された2つの計算を受け取り、左オペランドのFに包まれた計算を評価したあとに結果を捨て、右オペランドの計算の結果を返す二項演算子である。

注釈

LaaD内の場合、F=LaaDWorldとなる。LaaDWorld[A]は大まかに言うとLaaDの型システムそのものを表す。

活用例

これによって

/* C言語 */
int foo;
foo = (bar++, baz--);

declare foo: SyncVariable<i32>
declare bar: SyncVariable<i32>
declare baz: SyncVariable<i32>

foo = (bar++ *> baz-- *> baz);

と書けるようになる。優先順位は代入よりも低い。 疑問点: 優先順位

実装例

初出

*>の初出: おそらく typelevel/cats@0bf1ae7 (#278) https://gitlab.haskell.org/ghc/ghc/-/commit/c472d50485288057fc3029a34662e1e466400e8d#93cfa7229707be3930d7b9ecd5d2b579ec900761_0_29 (2005年11月、Glasgow Haskell Compiler)
編注: typelevel/cats#4278 により修正

なぜ >> ではないのか?

  • シフト演算子とダブって都合が悪いから

仮想ノードの宣言方法

仮想ノード:コンパイルされたあとは他のノードへと展開され、コンパイル結果からは見えない。
関数でカプセル化するときに便利。
とても高級な例を上げると、Rustの(0..5).into_iter()は現在の要素が準備されたインパルスと現在の値を出力エッジとしてそれぞれ持つ一つの仮想ノードとして考えることができる。

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Ignored or Blocked

These are blocked by an existing closed PR and will not be recreated unless you click a checkbox below.

Detected dependencies

cargo
toolchain/Cargo.toml
  • anyhow 1.0.80
  • atty 0.2.14
  • chrono 0.4.35
  • clap 3.2.25
  • fern 0.6.1
  • log 0.4.17
  • serde 1.0.197
  • serde_json 1.0.94
  • strum 0.24.1

  • Check this box to trigger a request for Renovate to run again on this repository

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.