| [/ |
| / Copyright (c) 2008 Eric Niebler |
| / |
| / Distributed under the Boost Software License, Version 1.0. (See accompanying |
| / file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| /] |
| |
| [section:rationale Appendix C: Rationale] |
| |
| [/==================================================] |
| [section:static_initialization Static Initialization] |
| [/==================================================] |
| |
| Proto expression types are PODs (Plain Old Data), and do not have constructors. They are brace-initialized, as follows: |
| |
| terminal<int>::type const _i = {1}; |
| |
| The reason is so that expression objects like `_i` above can be ['statically |
| initialized]. Why is static initialization important? The terminals of many domain- |
| specific embedded languages are likely to be global const objects, like `_1` and |
| `_2` from the Boost Lambda Library. Were these object to require run-time |
| initialization, it might be possible to use these objects before they are |
| initialized. That would be bad. Statically initialized objects cannot be misused |
| that way. |
| |
| [endsect] |
| |
| [/=========================================================] |
| [section:preprocessor Why Not Reuse MPL, Fusion, et cetera?] |
| [/=========================================================] |
| |
| Anyone who has peeked at Proto's source code has probably wondered, "Why all the |
| dirty preprocessor gunk? Couldn't this have been all implemented cleanly on top of |
| libraries like MPL and Fusion?" The answer is that Proto could have been |
| implemented this way, and in fact was at one point. The problem is that template |
| metaprogramming (TMP) makes for longer compile times. As a foundation upon which |
| other TMP-heavy libraries will be built, Proto itself should be as lightweight as |
| possible. That is achieved by prefering preprocessor metaprogramming to template |
| metaprogramming. Expanding a macro is far more efficient than instantiating a |
| template. In some cases, the "clean" version takes 10x longer to compile than the |
| "dirty" version. |
| |
| The "clean and slow" version of Proto can still be found at |
| http://svn.boost.org/svn/boost/branches/proto/v3. Anyone who is interested can |
| download it and verify that it is, in fact, unusably slow to compile. Note that |
| this branch's development was abandoned, and it does not conform exactly with |
| Proto's current interface. |
| |
| [endsect] |
| |
| [endsect] |