コンストラクタ、アプライザ、コンバータ、イニシャライザ

@@'文字配列からString(コンストラクタ)'
can String(*characters@Array[Character])

  @@'バイト配列からString(クラスアプライザ)'
  do Self(bytes@Array[Byte], encoding@Encoding)
    ?
  DO

  @@'文字と文字数から文字列(クラスアプライザ)'
  do Self(character@Character, n@Integer)
    Self(1..n.map character)
  DO

  @@'クラスイニシャライザ'
  do Self
    $.log@info Self.name, 'loaded'
  OD

  @@'指定位置の文字(アプライザ)'
  do self@Character(index@Integer)
    characters(index)
  DO

  @@'StringからInteger(コンバータ)'
  do self@Integer
    ?
  DO

  #mainが定義されていなければ実行される
  $.log@info Self.name, 'main not called'

  @@'エントリーポイント'
  do main
    $.log@info Self.name, 'main called'
  DO
CAN

#クラス名の引数はコンストラクタの引数、letを付けるとプロパティとして参照可能、つけなくてもクラス内からは参照可能、クラス名(引数)で呼び出し(クラス参照は&クラス名)

#Selfで定義した引数ありのメソッドはクラスアプライザとなりインスタンスは生成しない。インスタンス生成が必要ならコンストラクタを呼び出す

#Selfで定義した引数なしのメソッドはクラスイニシャライザでクラスが読み込まれた際に実行される

#selfで定義した引数ありのメソッドはアプライザとなりインスタンス(引数)で呼び出せる

#selfで定義した引数なしで戻り値型の型のメソッドはコンバータとなりインスタンス@(戻り値の型)で呼び出せる

#クラス内に羅列した命令はmainメソッドに集約され実行される(mainメソッドも定義されている場合はmainメソッドのみ実行され羅列した命令は実行されない)

#生成

String('a', 'b', 'c').dump #= 'abc'@String
String(616263@16).dump #= 'abc'@String

#パターンマッチ(let 型 タプルでコンバータ呼び出し)

case '123'
when(let String n@Integer) '数値です'
else '数値ではありません'
CASE #= 数値です

case 'abc'
when(let String n@Integer) '数値です'
else '数値ではありません'
CASE #= 数値ではありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です