「デリゲート」の版間の差分

編集の要約なし
編集の要約なし
 
(同じ利用者による、間の14版が非表示)
1行目: 1行目:
[[Category:Alice(名前空間)]]
{{Alert|この記事のより新しい版が[https://docs.wsoft.ws/products/alice/api/delegate/ WSOFTDocs]にあります。AliceScriptWikiでは、この記事はもう更新されません。||04}}[[Category:Alice(名前空間)]]
[[Category:基本]]
[[Category:基本]]
デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。
デリゲートは、AliceScriptにおける”匿名関数”のメカニズムです。デリゲートは匿名関数として、その場ですぐに実行したり、変数に代入したり、関数に引数として渡すことができます。


例えば、蔵書検索アプリケーションを作成することを考えてみましょう。この検索にはAND検索、OR検索、完全一致検索が用意されています。
例えば、蔵書検索アプリケーションを作成することを考えてみましょう。この検索の条件は、それと完全に一致する、それを含む、それを含まない、の3つが用意されています。いずれの場合も、Seartch()関数が行うことは基本的に同じです。つまり、なんらかの条件に基づいて一連の蔵書から項目を検索します。しかし、条件に基づいて検索するコードはそれぞれの条件によって異なります。
いずれの場合も、Seartch()関数が行うことは基本的に同じです。つまり、なんらかの条件に基づいて一連の蔵書から項目を検索します。しかし、条件に基づいて検索するコードはそれぞれの条件によって異なります。
 
そのような場面でデリゲートを使うと、変数のように値を変更することでプログラムの実行中に処理内容を切り替えることができます。Seartch関数に関連づけられているデリゲートを変更すればよいのです。


ソフトウェアには、この種の手法が半世紀にわたって使用されてきました。AliceScriptのデリゲートは、さらに思い通りのプログラミングを実現します。
ソフトウェアには、この種の手法が半世紀にわたって使用されてきました。AliceScriptのデリゲートは、さらに思い通りのプログラミングを実現します。
11行目: 12行目:
*デリゲートを使用すると、関数を引数として渡すことができます。
*デリゲートを使用すると、関数を引数として渡すことができます。
*デリゲートは、コールバック関数の仕組みを実現するのに使用できます。
*デリゲートは、コールバック関数の仕組みを実現するのに使用できます。
*デリゲートは連結でき、たとえば、複数の関数を1つのイベントで呼び出すことができます。
*デリゲートは連結でき、たとえば、複数の関数を一度の呼び出しで実行することができます。


この記事では<code>delegate</code>キーワードまたはラムダ式とそれによってサポートされる機能、<code>delegate</code>型に実装される機能を説明します。
この記事では<code>delegate</code>キーワードまたはラムダ式によって提供される機能、<code>delegate</code>型に実装される機能を説明します。


[[Category:基本]][[Category:Alice(名前空間)]]
[[Category:基本]][[Category:Alice(名前空間)]]
51行目: 52行目:


ラムダ式には、次の2つの形式があります。
ラムダ式には、次の2つの形式があります。
==式形式のラムダ==
===式形式のラムダ===
式形式のラムダは、次の形です。
式形式のラムダは、次の形です。
  (input-parameters) => expression
  (input-parameters) => expression
式形式のラムダは、実行時にその式の値を返します。次の例では、<code>x</code>を二乗した値を返すデリゲートを<code>pow</code>という名前で宣言します。
式形式のラムダは、呼び出された時にその式の値を返します。
  var pow = (x) => x * x;
例えば、次のような関数が定義されていたとします。この関数は、与えられた数<code>num</code>を二乗した結果を返します。
  function pow(number num)
  {
    return num ** 2;
  }
  print(pow(2));//出力例:4
  print(pow(2));//出力例:4
==ステートメント形式のラムダ==
次の例は、この関数と等価な結果を返すデリゲートをラムダ式で定義する例です。
var pow = (number num) => num ** 2;
print(pow(2));//出力例:4
===ステートメント形式のラムダ===
ステートメント形式のラムダは次の形です。
  (input-parameters) => { <sequence-of-statements> }
  (input-parameters) => { <sequence-of-statements> }
 
式形式のラムダとの違いは、ステートメント形式のラムダの本体が任意の数のステートメントで構成できる点と、<code>return</code>キーワードを使用することでのみ値を返すことができることです。次の例では、<code>x</code>を二乗した値を出力するデリゲートを<code>powoutput</code>という名前で宣言します。
var powoutput = (x) =>
  {
    var powed = x*x;
    print(x);
  };
powoutput(2);//出力例:4
==関数からの暗黙的な変換==
==関数からの暗黙的な変換==
ほとんどのネイティブ関数とユーザー定義関数は、デリゲート型の変数へと暗黙的に変換できます。ユーザー定義関数を丸括弧なしで呼び出すと、それはその関数をデリゲート型に変換されたオペランドと認識されます。次に例を示します。
ほとんどのネイティブ関数とユーザー定義関数は、デリゲート型の変数へと暗黙的に変換できます。ユーザー定義関数を丸括弧なしで呼び出すと、それはその関数をデリゲート型に変換されたオペランドと認識されます。次に例を示します。
75行目: 90行目:


関数の属性について詳しく知るには、[[関数#属性|関数]]の記事を参照してください。
関数の属性について詳しく知るには、[[関数#属性|関数]]の記事を参照してください。
==デリゲートの組み合わせ==
==デリゲートの組み合わせ==
デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、<code>foreach</code>文を使用して一つずつに分解することも可能です。上記の例ですでに<code>SayHello</code>を定義しましたから、もう一つ、<code>SayBonjur</code>デリゲートを定義し、それらを結合して実行する例を示します。
デリゲート型は、複数のデリゲートを一つに結合することができます。組み合わされたデリゲートの各ステートメントは、順番に実行され、<code>foreach</code>文を使用して一つずつに分解することも可能です。上記の例ですでに<code>SayHello</code>を定義しましたから、もう一つ、<code>SayBonjur</code>デリゲートを定義し、それらを結合して実行する例を示します。
  var SayBonjur = delegate()
  var SayBonjur = delegate()
   {
   {
87行目: 100行目:
  //出力例:Hello,World!
  //出力例:Hello,World!
  //    :Bonjur
  //    :Bonjur
==イベント駆動型プログラム==
==イベント駆動型プログラム==
イベント駆動型プログラムは例えば「キーボードが押下された」とか、「マウスが移動した」などの受動的なイベントの発生によってコードが実行されるプログラムです。AliceScriptでは、デリゲート型とその組み合わせによって実現できます。ここでは簡単なサンプルとして、1秒おきにHello,Worldを表示し続け、それをeキーが押下されたときに停止するプログラムを作成します。このコードでは非同期的に1秒前にHello,Worldを表示し続け、同時に同期的にキーの押下を待機し続け、なんらかのキーが押下されたときに<code>OnkeyDown</code>にキーの情報を渡して呼び出します。
イベント駆動型プログラムは例えば「キーボードが押下された」とか、「マウスが移動した」などの受動的なイベントの発生によってコードが実行されるプログラムです。AliceScriptでは、デリゲート型とその組み合わせによって実現できます。ここでは簡単なサンプルとして、1秒おきにHello,Worldを表示し続け、それをeキーが押下されたときに停止するプログラムを作成します。このコードでは非同期的に1秒前にHello,Worldを表示し続け、同時に同期的にキーの押下を待機し続け、なんらかのキーが押下されたときに<code>OnkeyDown</code>にキーの情報を渡して呼び出します。