WSOFT-Project / alicescript

The repo for the design of the AliceScript programming language
https://a.wsoft.ws/alice
3 stars 0 forks source link

[PROPOSE]:注釈 #1

Open taiseiue opened 6 months ago

taiseiue commented 6 months ago

注釈

概要

JavaのアノテーションやC#の属性のように、インタプリタやスクリプト内である式に追加のデータを通知できる機能が欲しい。

@anotaion(args)
public void Func();

動機

デバッグモードのみ実行できる関数を定義したり、非推奨であることを通知したりすることは、コメントでは不十分で、修飾子では過剰で引数が使用できない。例えば、この機能によって関数定義時にもう使用して欲しくないことを通知するために、次のようなコードを書ける。

@obsolete("func_newを使用してください")
public virtual void func_old();

詳細設計

注釈を見つけたら実行時コード生成で関数呼び出しに変換する。 対応する関数は、AttibuteFunctionを継承するようにし、メインの関数を実行するまでHashSetで持っておく。 AttributeFunctionの名前の先頭は\ufdd5で始まるようにし、引数にはLiteralFunction(とValueFunction)のみ使用できるようにする。

具体的に

@obsolete("func_newを使用してください")
public virtual void func_old();

をこのようにコード書き換えする

.obsolete("func_newを使用してください")
public virtual void func_old();

欠点

前例

なし。

未確定の設計

アーカイブ

taiseiue commented 6 months ago

@rokuosan

rokuosan commented 6 months ago

メタデータを与える意味での注釈(アノテーション, annotation)であれば、@の利用がいいかと思います。

理由について述べると、まずC言語におけるプリプロセッサとの区別を明らかにできるためです。C/C++由来のプリプロセッサと混同して利用する場合、名前の重複を意識しなければならず、冗長な表現や、適切な表現ができない可能性が考えられます。

また、PythonとJavaではほぼ同一の機能を提供するシンボルとして@が用いられています。利用者の多い言語に合わせて設計することは、慣習的に利用でき、学習コストが減るという利点があります。

慣習的な利用という点については、差異を理解する必要があるなど、デメリットも存在しますが、少なくともこの機能においては大きな問題にはならないと予測しています。

余談ですが、Javaでは引数付きのアノテーションは以下のように記述します。

@RestController
public class SampleController {
  @GetMapping("/sample")
  public Sample sample(@RequestParam(value = "hoge") String text) {
    // Do something
    return new Sample();
  }
}

一方、Javadocでは同一の記号をJavadocタグとして利用されており、以下のように記述します。

/**
 * This is a sample function.
 *
 * @author john doe
 * @param hoge hoge_description
 */
 public void Sample(String hoge) {
  // Do something
 }
taiseiue commented 6 months ago

JavaのAnnotationライクにするかぁ

注釈用関数の内部表現のプレフィクスは\ufdd5でええかいな

WSOFT-Project/Losetta#98 のリストにも反映しとこ

taiseiue commented 6 months ago

これ属性の関数出だしの名前さえ未とけばAttributeFunctionクラス継承してなくてもよくないか

そうしたらユーザーも作れるし

taiseiue commented 6 months ago

ユーザーでも定義できるようにこんなんでもいいかも

注釈定義側

@annotation
array myannotation()
{
    return data;//使い手に与えるデータ
}

注釈使用側

@myannotation
void Func();