std.regex.regex() не чистый. Зачем?
В D std.regex.regex() не чисто:
import std.regex;
pure void test() // test.d(5): Error: pure function 'test' cannot call impure function 'regex'
{
auto r = regex(r"patern123", "g");
}
Зачем?
Это
А. недостаточно pure
ключевые слова были добавлены.
или же
B. Существует более глубокая причина
1 ответ
std.regex
это модуль, поэтому он не может быть помечен как чистый.
Ответ A: Маркировка функции как pure
не делает его чистым. Он просто говорит компилятору, что вы хотите, чтобы он был чистым, и он сделает свою работу, если функция действительно может быть сделана чистой. Если это не может быть чисто, компилятор выдаст ошибку. Это тот случай, когда test() не может быть чистым, потому что std.regex.regex()
не чисто. Основное правило - чистая функция не может вызывать нечистую функцию.
Ответ Б.: Да, существуют более глубокие причины, и я уверен, что вы, вероятно, уже знаете о них. В качестве напоминания прочитайте http://en.wikipedia.org/wiki/Pure_function и спросите себя, выполняет ли ваша функция test()
удовлетворить эти два основных правила? Для этого, естественно, вам необходимо понять семантику функции std.regex.regex()...
Возможно, вы хотели спросить, почему std.regex.regex() не является чистым? Мэт уже ответил на этот вопрос, я думаю. - Модуль std.regex действительно поддерживает некоторый кеш и изменяет его.