読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

noop のサンプルソースを読んで理解してみる

OSS noop

せっかく設定したんだ。動かすついでに noop の基礎から勉強じゃぁ!
HelloWorld を読んでみる。

import noop.Application;
import noop.Console;

class HelloWorld(Console console) implements Application {

  Int main(List args) {
    String s = "Hello World!";

    console.println(s);
    return 0;
  }
}

はてなのシンタックスハイライトも新言語にまだ対応してるとは思えないが設定はしてみる。そのうちカラーになるでしょw
Java 似というのは偽りではないらしい。
Application クラスを意味無く継承することはきっとないから、実行インターフェースということだろう。
Int main メソッドについても Application の実行メソッドのオーバーライドであると考えられる。
(Console console) は指定したオブジェクトインスタンスをローカル変数として取り込むという意味なんだろうか?*1
この状況で C:\target\resources\stdlib のソースを各個覗いてみる。
Console.noop

class Console() {
  native Void println(String s) {}
}

げっ!作りかけってのは本当かw
native 宣言は Java と一緒だ実装は native で作成されるという意味だろう。
気になるのはクラス宣言に引数らしい書式があることか。

Int.noop

class Int() {
  native Int plus(Int other) {}
  native Int minus(Int other) {}
  native Int multiply(Int other) {}
  native Int divide(Int other) {}
  native Int modulo(Int other) {}
  native String toString() {}
}

整数型も定義はあると、、、基本演算に toString があるだけか。
算術メソッドがあるが、まさか計算がすべてメソッド経由ということはあるまい?
であれば、operator 定義できる指定のメソッドかもしれない。

他の Object も String も似たり寄ったり。
まぁそんなものかもしれない。

他に気になったのは、static キーワードを全然見ないことだ。
main に関して言えば、実行時引数に実行クラス名を指定しているから、static である必要は無いんだろう。
とはいえ、整数の算術演算メソッドが static でないとは、、、、
ということは、計算も文字通りインスタンス同士のメソッドコールということかっ!左結合か右結合かすっげー気になるが、一次置いておこう。

ここで HelloWorld に戻ってみる。
String 変数に値を突っ込んでそれを表示しているなら、文字列はリテラルか、オブジェクトか?

  Int main(List args) {
    console.println("Hello World!".length().toString());
    return 0;
  }

普通に動くということは、文字列が既にオブジェクト扱いなワケだ。

Arithmetic.noop

namespace arithmetic;

import noop.Application;
import noop.Console;

doc """
Two things about Arithmetic:
 * This class demonstrates some basic arithmetic operations
 * It converts an Int to a String automatically

 @author Alex Eagle (alexeagle@google.com)
"""
class Arithmetic(Console console) implements Application {
  Int main(List args) {
    Int i = 1;
    Int j = 2;
    Int k = i + j;

    console.println(k);
    return 0;
  }
}

doc に文字列を突っ込むのはドキュメント書式らしい。言語仕様に含まれてるのはよい。
「"""」はヒアドキュメント構文か。ここだけ Python ぽいな。
既に「//」でコメントが書けることは試し済みで、「/**/」も動く。インデントも適当でいいらしい。本当に Java っぽいな。
namespace も特に言うことはなさげ。

一番奇怪なのは delegation のサンプルか。
言語仕様に DI コンテナが含まれているという話なんだが、、、。

namespace delegation;

class Delegator(delegate Delegate d) implements Application {
  Int main(List args) {
    aMethod();
  }
}

なんとこれだけ。
Delegate クラスは宣言しているが、import していない。
なので、恐らくは起動時の引数で Delegate を選択実行する仕組みだと予測できる。
aMethod というメソッドは、定義自体はインターフェースのもので、Delegator クラスメソッドではない。
ということは、delegate キーワード引数を指定することで、内部取り込みを実現している?(扱いが継承か、メソッド外部拡張扱いなのかは気になるが、、、)
これ以上は推測を出ないので、次回以降 Wiki かじってみる。

*1:class Foo(Bar bar) {} Scala に似た書式で、デフォルトコンストラクタを定義し,bar が readonly なプロパティとなる。公式より