parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Документацию поправим.

MoKo 09.10.2012 22:45

Что же касается диагностики ошибок, с этим сложнее. :(

Немного о самой оптимизации. Она весьма эффективна, даже в среднем ее выигрыш виден, а уж в коде, где много действий, эффект часто меряется десятками процентов. Да, самому можно собрать парсер без этой оптимизации.

Суть в том, что при первом запуске метода запоминается, использует метод $result или нет, и далее при последующих вызовах:
- в случае, когда $result не используется, весь вывод метода напрямую добавляется к выводу вызывающего метода.
- в случае, когда $result используется, весь вывод метода вообще игнорируется. А любой перенос строки, пробел между операторами - это тоже вывод.

Ну и теперь по диагностике. В первом случае можно проверять наличие $result и выдавать исключение, если что-то присваивали. Но это лишнее "подглядывание" в хеш локальных переменных, то есть трата времени (но в среднем наверное меньше процента).

Во втором случае тоже можно проверять определенность $result, в этом к переменной уже есть обращение, так что здесь выдача исключения будет дешевой операцией. Но здесь-то как раз то, что возращается пустая строка всех устраивает - мало кто пишет код ^if($a){ yes }{ $result[no] }, и поэтому было решено не выдавать исключение.

Опять же, если не бросать исключение во втором случае, то странно бросать его в первом. А не бросать нельзя, поскольку просто вернуть $result уже нельзя, вывод метода уже добавлен к родителю...

Идеальный вариант - детектировать обращение к $result на этапе компиляции. Это автоматом решит все проблемы, но надо сделать это эффективно, минимально заметив компиляцию кода. Внесу это в to-do, чтобы не забылось снова.