プログラミング言語に新たに取り入れて欲しい機能

目次

ラベル付きループ文

指定のループ文をbreak文で抜けられるようにする。

while (true) label: {
  printf("a");
  while (true) { break label; }
  printf("b");
}

printf("\n"); // "a\n"

break if文

if文やブロック文から抜け出すための機能。

if (true) label: {
  printf("a");
  if (true) {
    break label;
  }
  printf("b");
}

printf("\n"); // "a\n"

以下の書き方だと既存の処理をブロック文で囲う作業が面倒。バージョン管理システムの差分も大きく変化する。

if (true) {
  printf("a");
  if (false) {
    printf("b");
  }
}

break/continueブロック

break/continue文の実行前処理を記述できるようにする機能。break実行前のちょっとした処理をワンラインで簡潔に記述できるようにする。

for (i : items) {
  // Before
  if (i.identifier == "bar") {
    i.enabled = false;
    break;
  }
  // After
  if (i.identifier == "bar") {
    break { i.enabled = false; }
  }

  if (i.identifier == "foo")
    break i.enabled = true;
  if (i.identifier == "YES/NO")
    break i.title = "NO", i.enabled = false;
  if (i.identifier == "ON/OFF")
    break {
      i.title = "OFF";
      i.enabled = false;
    }
}

マクロで同等の機能を実現することはできる。

#define break(...) do{ __VA_ARGS__; break; } while (0)

if (item.identifier == "bar")
  break (i.enabled = false);

インナーメンバ

メンバ変数やメンバ関数のスコープ内宣言を実現する。

class App {
  // private lazy Button button; // これを
  Button lazy() {
    private Button button; // ここに書きたい
    return button ?: (button = new Button("Title"));
  }
  void method() {
    // private宣言が面倒なのでここに書きたい
    // 名前空間も汚したくない
    void innerMethod() {}
    innerMethod();
    
    // メソッド宣言式とラムダ宣言式の記法が異なるため、
    // publicメンバ関数への書き換えが面倒になる
    // let innerMethod = () => {}
    // ↓
  } // public void innerMethod() {}
}

メンバ名前空間

メンバ変数やメンバ関数に名前空間を指定できるようにする機能。

従来のA.redColorA.color_redという記法をA.colors.redという構造的な記法に置き換えること目的とする。

class App {
  colors {
    Color sepia = Color(230, 220, 210);
    Color sky   = Color(64, 64, 200);
    static Color blue = Color(64, 64, 200);
  }
}

Color a = new App().colors.sepia;
Color b = new App().colors.sky;
Color c = App.colors.blue;

活用例

/* Categorized Member List, Member Namespace */
class App {
  // Before
  static Font boldFont;
  static Font font_italic;
  // After
  static fonts {
    Font bold;
    Font italic
  }
  // カテゴリーのネスト化も可能
  themes {
    eclipse {
      Theme light;
      Theme dark;
    }
    xcode {
      Theme light;
      Theme dark;
    }
  }
}

App app = new App();
Font boldFont = App.fonts.bold;
Theme theme1 = app.themes.eclipse.dark;
Theme theme2 = app.themes.xcode.light;

ハッシュ引数

名前付き引数をハッシュで渡すための仕組み。仮引数の順序に依存しない形でオプション的な引数を利用することができる。

func f(foo, bar, buz) {
  foo == 1
  bar == 9
  arguments.parameters.foo == 1
  arguments.parameters.bar == 9
  arguments.parameters.hoge == -1
  return buz
}
f(foo: 1, bar: 2, #{bar: 9, hoge: -1}).hoge == -1
f(foo: 1, bar: 2, buz: 3, #{bar: 9, hoge: -1}) == 3

func g() {
  return arguments.parameters
}
g(#{bar: 9}).bar == 9
g(#bar: 9).bar == 9
g(bar: 9).bar == 9
var obj = {bar: 9};
g(obj).bar == {}
g(#obj).bar == 9
g(obj...).bar == 9
広告