2015-06-20 115 views
1

時間編譯的正則表達式我得到一個編譯錯誤,當我嘗試編譯這段代碼:,可執行編譯在編譯時

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

如何解決這個問題?

+0

這可能對您有用我相信:http://forum.dlang.org/thread/[email protected] – ShellFish

+0

嗯..我將結果摺疊成一個布爾值,所以問題是不是我想要在CT和RT中使用一個類。 – Tamas

回答

2

你不能,正則表達式可以在編譯時編譯,但無法運行。您必須以其他方式編寫匹配,也許是indexOf或其他更簡單函數的組合。 (原因是不是因爲正則表達式是太複雜了,它實際上是因爲它內部調用malloc的效率,這是不是在編譯時間,因爲它是一個外部的C函數的支持。)

瞭解ctRegex需要解釋的火衛一正則表達式引擎。它的工作原理分爲兩步:給定一個正則表達式,它首先是編譯成字節碼的一些,那麼與之匹配的字符串,它運行的代碼。

在普通regex,這兩個步驟發生在運行時。當你構造正則表達式對象時,它將它編譯成字節碼。然後,當你匹配一個字符串時,它會運行該代碼。

隨着ctRegex,第一部分發生在編譯時間,但第二部分仍然在運行時發生。因此,編譯正則表達式成字節碼時,d編譯...然後塞到通過d編譯器的其餘字節碼進行優化,以完全的本地代碼。所以這是它可以提供的好處。 (順便提一下,差異通常並不重要,您應該根據您的輸入字符串來確定哪個更好。)

通常,CTFE(編譯時函數評估)意味着運行時代碼也可以在編譯時運行,但只有當來源可用時。 malloc不是這種情況,這就是錯誤說明的原因。


因此,答案將取決於你的正則表達式是什麼。你可能想簡化它,並用其他字符串和/或std.algorithm函數來重寫它。

...或重寫std.regex源代碼,以擺脫那些malloc的調用。將它們替換爲newif(_ctfe)以啓動。我試過這樣做之前,除非從那時起代碼被重構,否則你只會遇到另一個問題:對於運行時性能,std.regex也使用像聯合這樣的東西,這在ctfe中也不受支持。 。你不得不重新編寫它,並小心不要損害過程中的運行時性能。

可能更容易處理您的具體情況與其他功能。

+0

提交https://issues.dlang.org/show_bug.cgi?id=17070 – timotheecour