Coder Social home page Coder Social logo

aijs's Introduction

Ai.js

javascriptからAiScriptに変換します。

使い方

まだインストールはできませんが直にできるようになります。

npm install @slofp/aijs

API

  • convert(sourceCode: string, options?: ConvertOption): Promise<string>

【引数】

  • sourceCode: string javascriptソースコード

  • options?: ConvertOption 変換時のオプション、なければ通常設定で変換されます

【返り値】

Promise<string> 変換されたAiScriptソースコード

【オプション型】

ConvertOption

  • minify?: boolean 変換コードのインデントなどをなくし小さくします。

  • meta?: MetaData AiScriptをMisskeyで使用するときのメタデータを指定できます。

  • insertVersion?: boolean AiScriptのバージョンをコード最上部に記述します。

MetaData

  • name?: string 名前

  • author?: string 作成者

  • version?: string バージョン

  • description?: string 説明

permissions?: Permissions[]; コードを使用するために必要な権限

  • config?: { [key: string]: Config } コンフィグ情報を定義します。 また、keyはstringを提示しますがAiScriptに則ったkeyでなければエラーになります。

Config

  • type: 'string' | 'number' | 'boolean' 設定値の型

  • label: string 設定で表示される名前

  • description: string 設定で表示される説明

  • default: string | number | boolean デフォルト値

aijs's People

Contributors

slofp avatar

Stargazers

uzmoi avatar Tassoman avatar

Watchers

 avatar

aijs's Issues

メタデータ

これは、コード内に書くんじゃなくて、オプションのところに記載できるような仕組みがあったらいいかもしれない

version: '0.13.3',
meta: {
  version: '0.0.0',
  name: 'aaa',
  author: '',
  description: '',
  config: {
    aaa: {
      type: 'boolean',
      label: '', description: '', default: false
    }
  }
  permissions: []
}

gist等に入れられるようにする

厳密には
code -> gist -> installUrl
をしたいだけ、

もう一つは、
urlやファイルドロップからfetchしたものを変換できるようにする

Licensing

Consider to defend your code, by unauthorized use. For example, choosing a free software license, GPL compatible.

match式 (`match expr { x => expr }`)

match式はjavascriptには存在しない。
代替を作成することはできないかしら。

例えば

let a = 1
let x = 2
let y = match x {
	1+a => "yes"
	0 => "no"
	* => "other"
}
<: y // "yes"

をしたいとき、

let a = 1
let x = 2
let y = match(x, [1+a, "yes"], [0, "no"], "other");
<: y // "yes"

のようにするとか

web: エラー、警告を出す

javascriptでかけるとしても、互換性的に使用できない物があるのでそれらのエラーを表示させるようにしたい。

括弧がついてるときとついていない時がある

概要

括弧がつけられるべきコードに括弧がつけられていない。乗算ならあまり考えなくても良いが、除算になると順列は重要。

再現コード

a / (b / c)

期待する結果

a / (b / c)

実際の結果

a / b / c

最低限実用的に動かすためのやること

なんかあったら順次追加していく

基本方針

  • できそうな文法変換は意地でも実装する。
  • AiScriptの変換だが、Javascriptとの相互互換を取ること

基本動作系

  • 変数宣言 (let identifier = expr, var identifier = expr)
  • 変数代入 (name = v)
  • 四則演算 (1 + 2 - 3 * 4 / 5)
  • 関数定義 (@identifier(args) {})
  • 関数戻り値 (return expr)
  • 関数呼び出し (identifier(args))
  • 演算代入式 (identifier += expr, identifier -= expr)
  • if文 (if (expr) {} elif (expr) {} else {})
  • #2
  • while(loop)文 (loop {})
  • ブロック文 (eval {})
  • for...of(each)文 (each let e, expr {})
  • ループ制御 (break, continue)
  • オブジェクト参照 (identifier.props)
  • 比較演算 (&&, ||)
  • 括弧 (())

リテラル系

  • num (10.123)
  • bool (true, false)
  • str ('text')
  • null (null)
  • テンプレート文字列 (`text{expr}text`)
  • arr ([el1, el2])
  • obj ({ pr1: expr, pr2: expr })
  • 無名関数(アロー関数) (@(args) {})

AiScript特有動作系

  • #3 (対応しない)
  • #4
  • print糖衣構文
  • Std系

対応しない?AiScript特有動作系

  • #13
  • exists (変数存在判定)

Javascript特有動作系(対応しないもの)

  • async/await構文
  • try/catch構文
  • import/export
  • throw

Javascript特有動作系(対応したいもの)

  • #16
  • ビット演算子
  • for...in
  • 三項演算子 expr ? expr : expr
  • ジェネレート関数 function*
  • switch文

Javascript特有動作系(未定なもの)

  • デフォルト引数 (function aaa(x = 10) {})
  • 分割代入 ({ a, b } = { a: 10, b: 10 }, [a, b] = [10, 10])

Missing ConvertError during build

Missing dependency? 🤔

tassoman@tassmobile:~/dev/AiJs(main)$ pnpm run build

> @slofp/[email protected] build /home/tassoman/dev/AiJs
> tsc

src/index.ts:6:30 - error TS2307: Cannot find module './expections/ConvertError' or its corresponding type declarations.

6 import { ConvertError } from './expections/ConvertError';
                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~


Found 1 error in src/index.ts:6

圧縮時に変数名がダブってしまう

classを定義したときに、コンストラクタが変換時に関数になる仕様上terserが想定していない動きになってしまっている

例えば

function create(x) {
  return x;
}
class A {
  constructor(vv) {
    this.vv = vv;
    this.w = this.getW();
  }
  getW() {
    return create(this.vv);
  }
}

としたとき、

function a(x) {
  return x;
}
class A {
  constructor(a) {
    this.a = a;
    this.b = this.c();
  }
  getW() {
    return a(this.a);
  }
}

この様になるため、javascript上では問題なく動作するが、変換の都合上コンストラクタのaと関数のaが重複してしまいローカルスコープが参照されるため実行エラーになる。

for が適切に処理されていない

for (let i = 0; i < a; i++) {
	b.push(c.map(v => func(v, i)).join(''));
}

のとき、

for (let i, a) {
	b.push(c.map(@(v) { func(v, i) }).join(''))
}

が正しいにも関わらず

for (a) {
	b.push(c.map(@(v) { func(v, i) }).join(''))
}

と処理されている

名前空間

これ実際に思ったのが

javascriptは

Object.props

のみで判断するけど、

AiScriptは

Object:props

Namespace:props

の2通りあるから、そこの区別をどうにかしたい

for文 (`for expr {}`)

Javascriptではforは一定

for (let i = 0; i < 10; i++) {

}

ただ、AiScriptでは複数の書き方が存在する

for (10) {
}

for (let i, 10) {
}

これに変換するには

  • 繰り返す回数だけを指定する (for-letとforの区別)
    -> ステート内にカウンター変数を使用してない

  • 0からn回を1回づつ繰り返している
    -> 初期化カウンターが必ず0であること、カウンター更新が必ずi++i+=1であること

  • ステート内でカウンター変数への代入がないこと
    -> AiScriptではfor-letしか無いため

この条件を満たしてるときだけfor文としてかける。

それ以外の場合は以下に変換する

eval {
  <init>
  loop {
    if (<test>) <state>
    else break 
    <update>
  }
}

Webの作成

最低限必要な項目

  • ソースコード入力欄
  • 結果入力欄
  • オプション選択欄

`class`

以下の変換を予定

class A {
  constructor(z) {
    this.mem = z * 10;
  }
  static a() {
  }
  b() {
  }
  static c = 0;
  d = 0;
  static #aa() {
  }
  #bb() {
  }
  static #cc = 0;
  #dd = 0;
}
new A(10);

変換後

let A = {
  new: @(z) {
    let this = {}

    // define method
    this.b = @() {}
    this.__bb = @() {}

    // inited property
    this.d = 0
    this.__dd = 0

    // constructor
    this.mem = z * 10

    this
  },
  // static method
  a: @() {},
  __aa: @() {},
  // static property
  c: 0,
  __cc: 0
}

A.new(10)

これに対する成約

  • extendsは使用できない -> マージ処理をすればできなくはないが大変
  • public identifierに対する__から始まる名前は使用不可 -> privateとの区別をするため
  • get, setは定義不可 -> 実装が大変

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.