boost 的 phoenix

phoenix 的首要任务是将 functional programming language 的一些特性带入到 C++ 的 compile-time,为此它大量的利用了 boost.proto 提供的 template expression:

  • higher order function:主要是强调它们和正常函数不同的地方,可以看成“泛函”,注意“泛函分析”的英文名 functional analysis 的意义其实和这个类似;
  • lambda:匿名函数,方便写一些简单的函数
  • currying(partial function application):实现的类似 boost.bind 的功能,能够方便的占用一些函数参数,返回参数变少的函数
  • lazy evaluation:expression template 的核心,获得的是 expression 的结构,而不是其 evaluate 的结果。

从功能上来看 phoenix 和很多其他的 boost 库有重合,比如 boost.lambda,boost.bind,boost.ref 等。下面我们列举一些基本的 phoenix 的功能:

  • val 将值作为 functor 的返回;
  • ref 将引用作为 functor 的返回;
  • argn 返回输入参数列表中第 n 个;
  • 这些对应的操作都是 lazy 的:这意味着 ref(x) = 1 这句话并不改变 x 的值,而只有等到调用(将这个 expression 进行 evaluate)时才会产生效果。
  • 对应内存管理的调用构造函数、new、delete 与 static_cast 都存在 lazy 的版本:construct<class>(…),new_<class>(…),delete_ 与 static_cast_
  • 为了方便将某些正常的函数转变为 lazy 的,phoenix 提供了 function<non_lazy_function> lazy_version 这个模板;

有了这些基本的了解以后,我们可以来看 phoenix 的结构(每项是一个单独的 module,形成四个 layer):

  • actor:放在 phoenix_core.hpp 中,提供最基础的支持,基本上提供了构造 expression template 所必须要的东西(和 boost.proto 关系最密切?)
  • value、reference 和 argument:前面三个 template 已经讲了,另外有一个 nothing,用于什么都不干(有时候还必须用上)
  • function、operator、object、statement 和 scope:第一个已经讲过了,operator 是形成 expression 的工具;statement 实现了包括 operator, 组织多个 statement,if_、if_else_、switch_、while_、do_while_、for_、try_catch_、throw_ 这些 C++ 语句的 lazy 版本;object 的四条前面也讲了;所谓 scope 包括 local variables(在 statement 里面出现的 variable 怎么办,这大概就是解决方案)和 lambda(格式大致为 lambda[expression])。
  • STL、fusion 和 bind:bind 实现的和 boost.bind 完全一致,因此可以互换;STL 的支持包括对容器的支持,并将常用的成员函数封装成 lazy 的版本,对 algorithm 的封装。

通过 phoenix,boost.spirit 不论是 qi 还是 karma 就可以在 parsing 的同时将 lazy expression 作为 semantic action 添加到对应的部分,这样这些 expression 就能在合适的时候 evaluate 帮助我们将一些需要的内容从 input iterator 转换到程序执行过程中可控制的对象里面了。例子这里就免了。继续 spirit 🙂

——————
And I will make you exceeding fruitful, and I will make nations of you, and kings shall come out of you.

Advertisements
boost 的 phoenix

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s