Continuation 0.0.4

php_continuation-0.0.4devel.tgz


一昨日書いた以下の項目を実装。

配列で continuation に渡す引数リストを指定する方法はダサいしミスの元になりやすいので、次のバージョンでは後方互換性を無視して可変長引数にしようと思います。
今は実行時にローカル変数用のシンボルテーブルをプリセットする方法で実現しているのですが、opcode のスタティック変数用領域を弄ればもっと純粋にクロージャっぽいことができる・・・はず。

新しく加わった関数 co_create_closure() を使うと、create_function() と同じような使い方でクロージャが作成できます。

<?php
function paidMore($amount)
{
    return co_create_closure('$e', 'return $e->salary > $amount;');
}

$highPaid = paidMore(150);

$emps = array(
    (object)array('name' => 'Jon',  'salary' => 200),
    (object)array('name' => 'Bon',  'salary' => 100),
    (object)array('name' => 'Jovi', 'salary' => 180),
);

var_dump(array_map($highPaid, $emps));

関数

  • mixed co_call(resource continuation $co[, mixed $param[, mixed ...]])
    • 最初の引数で指定した continuation をコールする。
    • @param resource continuation $co
      • コールする continutation。
    • @param mixed (可変長引数)
      • $co にバインドされた関数に渡される引数。
    • @return mixed
      • $co にバインドされた関数の返り値。
  • mixed co_call_array(resource continuation $co, array $params)
    • 最初の引数で指定した continuation をコールする。
    • @param resource continuation $co
      • コールする continutation。
    • @param array $params
      • $co にバインドされた関数に渡される引数のリスト。
    • @return mixed
      • $co にバインドされた関数の返り値。
  • resource continuation co_create(callback $func[, array $env_vars[, int $flags]])
    • ユーザ定義関数と、そのローカル変数のプリセットをバインドする。
    • @param callback $func
      • ユーザ定義関数 or ユーザ定義クラスのメソッド。
    • @param array $env_vars
      • 変数のリスト。未指定または null の場合はコールされたスコープの変数をインポートする。
      • キーが整数かつ値が文字列の場合は、コールされたスコープから値と同名の変数をインポートする。変数が存在しない場合は値が null の変数が定義される。
    • @param int $flags
      • 初期化と継続に関するフラグのビット和。定数の項を参照。
    • @return resource continuation
      • バインドされた関数と変数を格納したリソース。エラー時は false。
  • string co_create_closure(string $args, string $code[, array $env_vars[, int $flags]])
    • クロージャを作成する。
    • co_make_callable(co_create(create_function($args, $code), $env_vars, $flags)) と等価。
    • @param string $args
      • 関数の引数。
    • @param string $code
      • 関数のコード。
    • @param array $env_vars
      • @see co_create()
    • @param int $flags
      • @see co_create()
    • @return string
      • 一意な関数名を表す文字列。エラー時は false。
  • array co_inspect(resource continuation $co)
    • continuation の状態を調べる。
    • @param resource continuation $co
      • 状態を調べる continutation。
    • @return array
      • $co にバインドされた変数のリストのコピー。
  • string co_make_callable(resource continuation $co)
    • continuation から無名関数を作成する。
    • @param resource continuation $co
      • 無名関数化する continutation。
    • @return string
      • 一意な関数名を表す文字列。

定数

co_create(), co_create_closure() のフラグ引数にビット和で与える定数。
未指定の場合のデフォルト値は CONTINUATION_ENV | CONTINUATION_IMPORT_REGULAR 。

  • CONTINUATION_NONE
    • ローカル変数の変更は維持されない。
  • CONTINUATION_ENV
    • $env_vars からインポートされた変数の変更が維持される。
  • CONTINUATION_ALL
    • すべてのローカル変数の変更が維持される。
  • CONTINUATION_IMPORT_REGULAR
    • 名前が ^[A-Za-z][0-9A-Za-z_]*$ にマッチする変数をインポートする。
  • CONTINUATION_IMPORT_UNDERSCORED
    • 名前が ^[A-Za-z_][0-9A-Za-z_]*$ にマッチする変数をインポートする。
  • CONTINUATION_IMPORT_ALL
    • 全ての変数をインポートする。