![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ленивые вычисления
RWolf © (2010-01-05 17:40:00)Допустим, нужно вывести в лог строчку, если установлен флаг отладки.
Конструкция вида if DebugFlag then WriteLog(s) загромождает исходники, поэтому пишем процедуру
procedure Debug(const s:string);
begin
if DebugFlag then WriteLog(s)
end;
Всё бы хорошо, но теперь s вычисляется всегда, независимо от значения DebugFlag — лишняя загрузка CPU.
Есть ли простая в плане читаемости синтаксическая конструкция вроде вышеупомянутого вызова процедуры Debug, чтобы передаваемая в неё строка вычислялась в зависимости от условия?
скажем, в Си можно было бы просто определить макрос
#define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)
RWolf (2010-01-05 18:59:00) [1]
> grammar-nazi (05.01.10 18:14) [4]
> как это согласовывается с
> #define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)
макрос DEBUG("x=%d\n", x) развернётся в if (DebugFlag) printf("x=%d\n", x)
Демо (2010-01-05 18:28:00) [2]
> вот то, на что указывает ссылка, передаваемая в функцию,
> и вычисляется.
Ну раз в рантайм, только конструкция if DefDebug then...
Кука съела ник (2010-01-05 18:26:00) [3]
> Какая тут лишняя загрузка процессора?
DebugLog (Format('%s%s%s%s', ['aaa'+foo, 'bbb'+bar,'ccc'+bazz,'ddd'+blinch])
grammar-nazi (2010-01-05 18:19:00) [4]> Демо © (05.01.10 18:15) [5]
> Что значит "вычисляется"?
> В функцию передаётся ссылка - и всё.
> Какая тут лишняя загрузка процессора?
вот то, на что указывает ссылка, передаваемая в функцию, и вычисляется.
Демо (2010-01-05 18:15:00) [5]
> Всё бы хорошо, но теперь s вычисляется всегда,
Что значит "вычисляется"?
В функцию передаётся ссылка - и всё.
Какая тут лишняя загрузка процессора?
grammar-nazi (2010-01-05 18:14:00) [6]> RWolf © (05.01.10 17:50) [2]
> речь не об условной компиляции, нужен именно runtime.
как это согласовывается с
> RWolf © (05.01.10 17:40)
> скажем, в Си можно было бы просто определить макрос
> #define DEBUG(...) if (DebugFlag) printf(__VA_ARGS__)
?
Jeer (2010-01-05 18:11:00) [7]1. Если говорить о варианте дебаг/боевой - чем мешает IFDEF ?
2. Не вижу проблем в:
if gDebug then MyDebugLog(s);
В более современных версиях может что-то есть менее "загроможнающее".
RWolf (2010-01-05 17:50:00) [8]Jeer © (05.01.10 17:49) [1]
речь не об условной компиляции, нужен именно runtime.
Jeer (2010-01-05 17:49:00) [9]Т.е. посмотреть/почитать о {$IFDEF whoiswho}.. {$ELSE}.. {$ENDIF} не судьба ?