首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在编译时执行编译时编译的regex

在编译时执行编译时编译的regex
EN

Stack Overflow用户
提问于 2015-06-20 10:09:39
回答 1查看 282关注 0票数 1

当我试图编译以下代码时,会得到一个编译错误:

代码语言:javascript
复制
import std.regex;
enum truth = "baba".matchFirst(ctRegex!`[ab]+$`) ? true : false;
void main() {}

/usr/local/Cellar/dmd/2.067.1/include/d2/std/regex/package.d(671): Error: malloc cannot be interpreted at compile time, because it has no available source code

怎么才能避开这一切?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-21 00:52:47

不能,正则表达式可以在编译时编译,但不能运行。您必须以其他方式编写匹配,可能是indexOf或其他更简单的函数的组合。(原因并不是regex太复杂,而是因为它内部调用malloc以提高效率,因为它是一个外部C函数,在编译时不受支持。)

理解ctRegex需要解释一下Phobos的正则表达式引擎。它分两个步骤工作:给定一个正则表达式,它首先将其编译成一些字节码,然后在字符串上匹配它,然后运行该代码。

在普通的regex中,这两个步骤都发生在运行时。当您构造regex对象时,它会将其编译成字节码。然后,当您匹配一个字符串时,它会运行该代码。

使用ctRegex,第一部分在编译时发生,而第二部分仍然在运行时发生。所以当D被编译时,它将正则表达式编译成字节码.然后将该字节码推入D编译器的其余部分,以优化为完全本机代码。这就是它能提供的好处。(顺便说一下,差别通常并不重要,您应该对输入字符串进行基准测试,看看哪一个更好。)

通常,CTFE (编译时函数评估)意味着运行时代码也可以在编译时运行,但前提是源代码是可用的。malloc的情况并非如此,这就是为什么错误这么说的原因。

所以答案将取决于你的正则表达式是什么。您可能希望简化它,并根据其他字符串和/或std.algorithm函数重写它。

...or重写std.regex源代码以消除那些malloc调用。将它们替换为newif(_ctfe)来启动。不过,我以前尝试过这样做,除非代码从那时起就被重构了,否则您只会遇到另一个问题:为了运行时性能,std.regex还使用联合之类的东西,而ctfe中也不支持联合。您必须重写其中的一堆,并且要小心,不要在过程中影响运行时的性能。

使用其他函数可能更容易处理特定的情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30952768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档