问题标签 [boost-proto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
325 浏览

c++ - 我可以对 Boost Phoenix 表达式进行字符串化吗?

我可以将 Boost Phoenix 表达式转换为具有代表性的 C++ 字符串吗?我本可以有:

然后可能会生成一个包含以下内容的字符串:

我很欣赏这个例子有一些粗糙的边缘,但我想知道是否已经尝试过这些方面的任何事情?

0 投票
1 回答
183 浏览

c++ - 用表达式树非侵入式地替换自定义类型

我正在尝试将惰性评估引入现有的代码项目。项目核心基本上由使用自定义类型的大量计算组成(它的作用类似于 double,但在后台执行额外的工作)。

我们的目标是使用 boost proto 引入惰性求值概念,以优化现有表达式。

限制:

  • 无法触及现有的计算
  • 使用的类型由 typedef 定义,因此可以替换类型本身

我们试图实现一个简单的概念证明,但没有管理代码以使其按预期运行。这是我们到目前为止得到的:

我们的主要问题是我们无法定义一种既适用于文字又适用于表达式的类型。在这个例子中,c 是一个 proto::terminal 类型的表达式并且忽略了表达式的赋值。使用 auto 存储表达式时,它工作正常。此外,直接初始化是不可能的。

如果我正确理解我们的问题,我们将需要两种不同类型的表达式和文字,这是不可能的,因为我们只能更改现有类型。

我们还研究了其他选项,例如使用 BOOST_PROTO_DEFINE_OPERATORS(...) 使我们的自定义类型成为非侵入式终端,但也不能进行延迟分配。

所以,我们的问题是我们是否可以实现我们想要的,或者我们是否必须更改现有代码以引入惰性评估?

感谢您的帮助,马蒂亚斯enter code here

0 投票
2 回答
432 浏览

c++ - Templating a Simple Boost Proto C++ Expression Evaluator

0 投票
1 回答
133 浏览

c++ - Boost Phoenix 中嵌套 let 块中的变量隐藏

当“内部”局部变量隐藏“外部”局部变量时,我在 Boost Phoenix 中的嵌套 let 块遇到了一些问题。即使使用此处文档中的“可见性”示例,此处显示:

我收到以下错误:

有谁知道我如何在 Phoenix 的内部 let 块的范围内“隐藏”这样一个变量?我目前正在使用带有 GCC 版本 4.8 快照的 Ubuntu 13.04;铿锵声 3.2; 提升 1.49;还有 Boost 1.53。

0 投票
1 回答
229 浏览

c++ - 获取Boost Proto子表达式的标签类型

对于 Boost Proto 表达式,我什么时候不应该期待一个proto_tag成员?我可以使用以下任一方法查询占位符的标签类型:

但是,如果我询问表达式child的标签类型,则该proto_tag成员似乎不存在;以下代码的第三行给出了错误:

Clang 和 GCC 的错误报告有问题的类型:is not a class, namespace, or scoped enumeration。我使用 Clang 3.2、GCC 4.7.2 和 Boost 1.53。

0 投票
1 回答
289 浏览

c++ - Obtaining the types of local variables in Boost Phoenix

How can I obtain the types of the local variables used within a scoped Boost Phoenix statement? Using Phoenix and Proto I can extract numerous aspects of a Phoenix expression. For example, the following code exposes the arity (3); tag type (lambda_actor); and child-2 tag type (shift_left) of a Phoenix lambda expression:

How can I obtain the types of the local variables; in this example: _a and _b?

0 投票
0 回答
1071 浏览

c++ - 如何将 DSL 输入解析为高性能表达式模板

编辑了标题和正文,并创建了一个衍生问题)

对于我们的应用程序,解析一个简单的逻辑表达式 DSL 将是理想的。然而,我想这样做的方法是解析(在运行时)输入文本,将表达式提供为一些惰性求值的结构(表达式模板),然后可以在对性能更敏感的代码中使用。

理想情况下,使用此技术进行评估会尽可能快,因为它将被多次使用,每次都会用不同的值替换占位符。我不希望表达式模板在性能上等同于说一个硬编码函数,该函数模拟与给定输入文本字符串相同的函数,即没有必要沿着实际编译的路线说,c++,原位运行程序(我相信其他问题包括动态库编译/加载)。

我自己阅读 boost 示例的想法是,我可以使用 boost::spirit 来解析输入文本,我相信我可以开发出我需要的语法。但是,我不确定如何将解析器与 boost::proto 结合起来构建一个可执行的表达式模板。我见过的大多数精神例子都只是解释器,或者最终构建了某种语法树,但没有进一步说明。我见过的大多数 proto 示例都假设 DSL 嵌入在主机源代码中,并且不需要最初从字符串中解释。我知道 boost::spirit 实际上是用 boost::proto 实现的,但不确定这是否与问题有关,或者该事实是否会提出一个方便的解决方案。

要重新迭代,我需要能够使以下内容变为现实:

我真的很感激一个最小的例子,甚至只是一个我可以构建的小内核,它从输入文本创建一个表达式,稍后在上下文中进行评估。

我不认为这与此处发布的问题完全相同:解析布尔表达式与提升精神 ,因为我不相信这一定是最快的执行方式,即使它看起来非常聪明。及时我会尝试对发布的所有答案进行基准测试。

0 投票
2 回答
1045 浏览

c++ - 使用 Boost.Proto 构建 Eigen 表达式模板

我想使用 Boost.Proto 将嵌入式领域特定语言转换为一系列使用 Eigen 库实现的矩阵运算。由于效率很重要,我希望 proto 生成 Eigen 表达式模板并避免过早评估。

我已经实现了一个可以生成矩阵乘法表达式的简单语法。下面的代码在没有警告的情况下编译(在 g++ 4.8.0 和 Intel C++ 2013.3 上,使用 Boost 1.54.0 和 Eigen 3.1.3)并且只要我的表达式只有一个乘法运算就可以工作。一旦我向链中添加更多乘法,它就会崩溃。Valgrind 告诉我这是因为 Eigen::GeneralProduct 表达式模板临时变量之一在评估完成之前被破坏。

我不明白为什么会发生这种情况,或者我能做些什么来防止它。感谢所有帮助!

0 投票
1 回答
339 浏览

c++ - 是否可以在 Boost.Proto 中构建和增量评估/变异表达式树?

是否可以提取 Boost.Proto 表达式树的部分,单独(外部)评估它们,然后改变表达式树,用结果替换提取的部分?

在我的具体情况下,我正在尝试评估是否可以重复重写一些遗留代码:

  1. 生成sql
  2. 查询数据库
  3. 使用结果生成新的 sql 查询
  4. 再次查询数据库...(等等)

我希望做的是: 1. 生成单个大型表达式树 2. 从表达式树中获取 SQL。这包括: b. 访问树并检查在生成单个 sql 之前必须评估的子查询 c.如果有子查询,则创建 sql 并以字符串形式返回,在外部评估 sql,然后改变树,用结果替换子查询

(另外,我想识别相同的子查询,如果可能的话,只评估一次)

这可能吗?它是否需要难以理解/学习的代码?

我浏览了 Boost.Proto 文档,但我不确定它是否适用于我需要从外部评估子树并用结果替换它的场景,直到整个树减少为单个查询。

编辑:

可以说我有以下表格:

对象 ID | 姓名

属性链接对象ID | 属性id

属性 ID | 父母身份 | 姓名 | 价值

我的查询以自定义“查询”对象的形式出现——具有多个 AND、OR 子句的(二进制)树。

示例:query1 = object.id=10 OR (attribute.name = "name" OR attribute.name = "name2")

这转换为:获取对象 10 的属性,其中属性的名称是“名称”。注意 parentid 字段,这意味着我们要查找的 attribute.name可以嵌套,而不是直接链接到我们的 object

我需要做的是: 1. 将其转换为具有足够信息的表达式树 2. 将此树发送到 db 层 3. 如上所述处理树(有时分多个阶段)

也许表达式树看起来像:

find_attributes(object_id = 10 AND attribute_name = ("name" OR "name2"))

有多个数据库的 SQL 语法不同,这就是我想这样做的原因。因此,我需要能够覆盖一些基于数据库的处理步骤。

例如 PostgreSQL:

  1. 处理将首先识别 find_attributes 节点,并知道我们正在搜索属性

  2. 进一步看,属性需要链接到object.id = 10,我们立即生成并运行查询以获取object.id = 10的所有属性,并将表达式树中的object_id = 10节点替换为实际属性ids (object_id = 10) => (attribute_id = (20 OR 21))。

  3. 然后,我们找到attribute_name节点,由于属性是嵌套的,我们需要找到所有具有name =“name”或“name2”的属性行

  4. 作为一个(可选的)优化步骤,由于有数百万个属性,我们需要将 attribute_id 和 attribute_name 节点合并到一个查询中

生成的查询可能类似于:

  1. (find attributeids) SELECT id FROM attributes WHERE objectid = 10)

  2. (最终查询)---

    WITH
    get_roots AS (SELECT * FROM attributes WHERE (id=20 OR id=21)),
    get_childs AS (SELECT * FROM get_roots, attributes WHERE attributes.parentid = get_roots.id),
    get_grandchilds AS (SELECT * FROM get_childs, attributes WHERE attributes .parentid = get_childs.id)

    SELECT * FROM get_roots UNION
    SELECT * FROM get_childs UNION
    SELECT * FROM get_grandchilds

(假设这里的属性只有三层深,可能会被重写为递归CTE)

我想这可能是可能的,但它会不会工作太多?有一组有限的查询,这里介绍的查询是最复杂的。

0 投票
1 回答
416 浏览

c++ - Boost.Proto:具有自定义终端类的 EDSL 的通用类布局

为了让自己熟悉 Boost.Proto,我正在尝试通过改编用户指南中的 TArray 示例来为固定但任意大小的浮点向量构建另一个表达式模板库。我要做的第一件事是定义我的向量类:

vector_expr_wrapper还重载其以使用从终端返回的派生operator[]来评估自身。vector_contextproto::callable_contextvector[index]FPVector

当我编译我的代码并用一个非常简单的语句 ( a = b + c;) 调用它时,我收到错误消息:

然后 g++ 列出了可能的候选者的东西......我从中理解的是,我必须在定义vector_expr_wrapper之前给出完整的定义,FPVector但我不能这样做,因为其他一切都vector_expr_wrapper取决于FPVector(语法,评估上下文......)

我该如何解决这个问题(即我应该如何布置我的课程)?

TArray 示例绕过了这个问题——我猜——通过非常晚地定义它们的数组类并用int[3]之前指定它的类型,我认为我无法在我的上下文中重现。

非常感谢您的帮助!