Size: a a a

2020 January 22

AK

Andrey Konovalov in Modern::Perl
Уж не говоря о том, что фильтры же есть
источник

OP

Oleg Pronin in Modern::Perl
Vadim Goncharov
а есть чем сделать аналоги сишных макросов? вот за этим, в Си я делаю
#ifdef DEBUG
#define DEBUGLOG dprintf ...
#else
#define  DEBUGLOG
#endif
и без дебага вызовы макроса просто исчезнут из сырца

а вот если я в Перле пишу допустим
AE::log debug => "dump: %s", map {тут хекс-распечатка}
то он всё-таки выполнит и распарсит аргументы перед тем, как AE::log проверит, что щас таки не дебаг и ничего выводить не надо
Через XS сильной магией. Мы как раз готовим логгер фреймворк (апи без бекенда, бекенд можно любой подцепить будет) и у него будет такая фича. Там на место вызова вставится кастомный op который сначала проверит надо ли логировать и только потом если надо начнет вычисление аргументов и вызов бекенда. Здесь проблема не только в аргументах, ты еще дрочишь каждый раз вызов функции AE::log который тоже стоит денег.
источник

OP

Oleg Pronin in Modern::Perl
Короче скорость будет аналогичная if debug а удобство аналогичное ае лог
источник

VT

Vasily Terkin in Modern::Perl
Vadim Goncharov
а есть чем сделать аналоги сишных макросов? вот за этим, в Си я делаю
#ifdef DEBUG
#define DEBUGLOG dprintf ...
#else
#define  DEBUGLOG
#endif
и без дебага вызовы макроса просто исчезнут из сырца

а вот если я в Перле пишу допустим
AE::log debug => "dump: %s", map {тут хекс-распечатка}
то он всё-таки выполнит и распарсит аргументы перед тем, как AE::log проверит, что щас таки не дебаг и ничего выводить не надо
#!/usr/bin/m4 :)
источник

OP

Oleg Pronin in Modern::Perl
Только не if debug а уровни и еще модули, чтобы можно было включать выключать логи с определеных частей программы прямо на лету, вплоть до строчек кода отдельных
источник

VG

Vadim Goncharov in Modern::Perl
Михаил Иванов
Просто добавьте в конце if $debug;
неудобно, если логгинг уже и так под условием
источник

VG

Vadim Goncharov in Modern::Perl
Oleg Pronin
Через XS сильной магией. Мы как раз готовим логгер фреймворк (апи без бекенда, бекенд можно любой подцепить будет) и у него будет такая фича. Там на место вызова вставится кастомный op который сначала проверит надо ли логировать и только потом если надо начнет вычисление аргументов и вызов бекенда. Здесь проблема не только в аргументах, ты еще дрочишь каждый раз вызов функции AE::log который тоже стоит денег.
ну это чот жостко
источник

VG

Vadim Goncharov in Modern::Perl
так-то обычный подошел бы
источник

VG

Vadim Goncharov in Modern::Perl
use constant DEBUG => 0; 
use v5.18;

if (DEBUG) {
  say "debug!";
}
источник

VG

Vadim Goncharov in Modern::Perl
Если посмотреть на -MO=Deparse, то этот if соптимизирует в ноль.
источник

VG

Vadim Goncharov in Modern::Perl
но это записывать неудобно :)
источник

OP

Oleg Pronin in Modern::Perl
Так ты в рантайме не сможешь изменить
источник

VG

Vadim Goncharov in Modern::Perl
Andrey Konovalov
Вадим, ну итить, генерация функций на лету же! Сгенерируй пустую функцию дебага. Это реально не слишком дорогого вызывать такую заглушку.
да я и так затрахался AE:;log на лету подменять
источник

OP

Oleg Pronin in Modern::Perl
А это часто надо. Когда сервер бажит включить дебаг логи на лету
источник

AK

Andrey Konovalov in Modern::Perl
Oleg Pronin
Через XS сильной магией. Мы как раз готовим логгер фреймворк (апи без бекенда, бекенд можно любой подцепить будет) и у него будет такая фича. Там на место вызова вставится кастомный op который сначала проверит надо ли логировать и только потом если надо начнет вычисление аргументов и вызов бекенда. Здесь проблема не только в аргументах, ты еще дрочишь каждый раз вызов функции AE::log который тоже стоит денег.
Не вычислять аргументы можно и передавая блок в функцию типа debug {} . А что мешает perl'овому коду переформировать самого себя, заменяя вызовы дебага на пустоту, - и запустить хотя бы eval'ом? Компиляция eval медленная? Но она же одноразовая
источник

VG

Vadim Goncharov in Modern::Perl
Oleg Pronin
Так ты в рантайме не сможешь изменить
я именно это и хотел
источник

VG

Vadim Goncharov in Modern::Perl
ровно и именно compile time как в Си
источник

OP

Oleg Pronin in Modern::Perl
Andrey Konovalov
Не вычислять аргументы можно и передавая блок в функцию типа debug {} . А что мешает perl'овому коду переформировать самого себя, заменяя вызовы дебага на пустоту, - и запустить хотя бы eval'ом? Компиляция eval медленная? Но она же одноразовая
Прикольный исходник у тебя будет
источник

AK

Andrey Konovalov in Modern::Perl
Oleg Pronin
Прикольный исходник у тебя будет
debug {} var1, var2 ; все вычисления на var'ах - только внутри блока
источник

VG

Vadim Goncharov in Modern::Perl
в мане  Full example:

  # near the init section
  use AnyEvent::Log;
  my $debug_log = AnyEvent:Log::logger debug => \my $debug;
 
  # and later in your program
  $debug_log->("yo, stuff here") if $debug;
 
  $debug and $debug_log->("123");


то есть в чем выигрыш, решительно непонятно.
источник