- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个返回 function<char(char const *)>
的规则通过柯里化(Currying) Phoenix 表达式构造。例如,
start = int_[_val = xxx];
rule<Iterator, function<char(char const *)> start;
应该做什么xxx
以便解析字符串 "5"
应该给我一个函数,给我输入的第五个字符吗?我试过类似 lambda(_a = arg1)[arg1[_a]](_1)
的东西可能有用,但我一直没能找到神奇的公式。
换句话说,我想要 curry 属性 arg2[arg1]
关于解析后的int值
非常感谢任何建议。请注意,我使用的是 VC2008,因此 C++11 lambda 不可用。
迈克
最佳答案
修改该规则声明后:
typedef boost::function<char(char const*)> Func;
qi::rule<Iterator, Func()> start;
有效: Live On Coliru (c++03).
更新:
为什么我最终得到了如此复杂的装置?
qi::_val = px::bind(px::lambda[arg1[arg2]], px::lambda[arg1], qi::_1)
嗯。让我告诉您使用惰性求值(在 C++ 模板元编程中具有引用/值语义的这些惊喜)的复杂函数组合的乐趣:不要执行以下操作:
qi::_val = px::lambda(_a = qi::_1) [arg1[_a]] // UB!!! DON'T DO THIS
根据编译器和优化级别,这可能*看起来有效。但它正在调用未定义的行为 [1]。问题在于 qi::_1
将作为 reference 对 qi::int_
解析器表达式公开的属性进行保留。但是,此引用在解析器上下文的生命周期结束后成为悬空引用。
因此通过无效引用间接计算仿函数。为避免这种情况,您应该说 ( Live On Coliru ):
qi::_val = px::lambda(_a = px::val(qi::_1)) [arg1[_a]]
甚至(如果您喜欢晦涩难懂的代码):
qi::_val = px::lambda(_a = +qi::_1) [arg1[_a]]
或者,您知道,您可以坚持使用绑定(bind)嵌套 lambda,因为绑定(bind) 默认 到 qi::_1
的值语义(除非您使用 phx::cref
/phx::ref
包装器)。
我希望以上分析能说明我之前在评论中提出的观点:
Note that I wouldn't recommend this code style. Higher-order programming with Phoenix is tricky enough without composing them from within lazy actors in some embedded expression-template DSL:
qi::_val = px::bind(px::lambda[arg1[arg2]], px::lambda[arg1], qi::_1)
. 'Nuff said?
#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/function.hpp>
namespace qi = boost::spirit::qi;
namespace px = boost::phoenix;
typedef boost::function<char(char const*)> Func;
int main()
{
typedef std::string::const_iterator Iterator;
using namespace boost::phoenix::arg_names;
qi::rule<Iterator, Func()> start;
start = qi::int_
[ qi::_val = px::bind(px::lambda[arg1[arg2]], px::lambda[arg1], qi::_1) ];
// or: [ qi::_val = px::lambda(_a = px::val(qi::_1))[arg1[_a]] ];
static char const* inputs[] = { "0", "1", "2", "3", "4", 0 };
for (char const* const* it = inputs; *it; ++it)
{
std::string const input(*it);
Iterator f(input.begin()), l(input.end());
Func function;
bool ok = qi::parse(f, l, start, function);
if (ok)
std::cout << "Parse resulted in function() -> character "
<< function("Hello") << "; "
<< function("World") << "\n";
else
std::cout << "Parse failed\n";
if (f != l)
std::cout << "Remaining unparsed: '" << std::string(f, l) << "'\n";
}
}
打印
Parse resulted in function() -> character H; W
Parse resulted in function() -> character e; o
Parse resulted in function() -> character l; r
Parse resulted in function() -> character l; l
Parse resulted in function() -> character o; d
[1](MSVC2013 似乎崩溃了,gcc 似乎可以在 -O3 中工作,但在 -O0 中出现段错误等)
关于c++ - 使用函数属性构建 qi::rule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25987763/
在 makefile 中,我可以从另一个规则调用一个规则吗? 类似于: rule1: echo "bye" rule2: date rule3: @ec
我想创建一个只匹配外部链接的 CSS 选择器。问题是它似乎不适用于 :not() 中的多个规则。我不能使用多个 not ( example: ":not():not()") 因为那变成了 ||而不是
我正在动态创建 CSS 动画,所以我需要在我的文档中插入一个 CSS 计时函数。如: @-webkit-keyframes slide { from { -webkit-transfo
错误内容: Error: Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js): HookW
我有这样的文件结构: ---- _base-map.scss ---- _child-map-1.scss ---- _child-map-2.scss ---- _child-map-3.scss
我正在利用 engine.Host 类创建自己的规则引擎实例,并通过 JSON 文件加载规则并调用 set_rulesets() 方法。这一切都运行良好。 持久规则:https://pypi.org/
在无服务器(https://www.serverless.com/framework/docs/providers/aws/events/event-bridge),的EventBridge文档中提到
在无服务器(https://www.serverless.com/framework/docs/providers/aws/events/event-bridge),的EventBridge文档中提到
系统要求我使用最常用的网络规则和应用程序规则配置 Azure 防火墙策略规则集合。 我收集了以下详细信息,其中捕获了最常用的网络规则和应用程序规则。但是我不确定我是否遗漏了任何被认为是最常见的规则?
我想做的是在运行时从 ABNF 语法文件创建一个解析器。我已经在 qi::grammar 中实现了所有 ABNF 规则,如下所示: typedef /*qi::rule or struct conta
对于复杂的多边形(即:自相交),选择缠绕填充规则还是奇偶填充规则会影响多边形的填充方式。 但对于非相交多边形,缠绕或奇偶填充规则之间是否存在任何性能差异。我知道这将是特定于实现的,但哪种算法对于非复杂
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 8 个月前
我正在尝试将 TypeScript 编译添加到现有的 Javascript 项目中。 AFAIK 这应该是可能的(甚至很容易),并且您可以通过代码库逐步传播 TS。不幸的是,这不是我所看到的——在添加
尝试将 Firebase 部署到其托管服务时。我还使用 firebase 工具来发布安全规则。我看到此错误消息: $ firebase deploy Security Rules Error - s
我在使用 ANTLR4 解析某些 SQL 类型的字符串时遇到问题。解析后的字符串是: WHERE a <> 17106 AND b BETWEEN c AND d AND e BTW(f, g) 这是
我已经在 Android 中创建了一个模块以在我的主应用程序中使用,并且似乎有两个文件Consumer-rules.pro 和 proguard-rules.pro。 我想了解以下内容 所有模块代码都
我正在尝试在另一个自定义规则中加载自定义规则,这两个规则均由 Parasoft 规则向导创建。 以下代码是作为方法放在调用规则中的python片段: def somePythonMethod(node
像许多其他问题一样,我正在尝试使用 Boost.Spirit.Qi 将简单语法解析为结构树。 我会尽量提炼我正在尝试做的事情,以尽可能最简单的情况。我有: struct Integer { int
我的samtools_dup规则存在一些问题。 它在/data/mypipeline.smk的第201行中显示“SyntaxError: 规则samtools_dup中的run/shell/scrip
有人可以向我解释一下这两种情况下负载均衡器(v2)后端实际发生的情况吗: 应用入站 NAT 规则。 应用负载平衡规则。 最佳答案 当您有 1 台后端服务器或者您知道要访问哪个后端服务器时,您将使用 N
我是一名优秀的程序员,十分优秀!