当我试图编译以下代码时,会得到一个编译错误:
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
怎么才能避开这一切?
发布于 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调用。将它们替换为new和if(_ctfe)来启动。不过,我以前尝试过这样做,除非代码从那时起就被重构了,否则您只会遇到另一个问题:为了运行时性能,std.regex还使用联合之类的东西,而ctfe中也不支持联合。您必须重写其中的一堆,并且要小心,不要在过程中影响运行时的性能。
使用其他函数可能更容易处理特定的情况。
https://stackoverflow.com/questions/30952768
复制相似问题