7 November 2016

klopp: (размахиваю кувалдой)
Имеется следующая строка (пример на C, но для других языков - аналогично).
for(int i = 0; i < 3; ++i );
Выполняется цикл, понятное дело, 3 раза. Задача: сделать этот цикл бесконечным, никак не модифицируя строку. Доп. условие: переменная цикла должна объявляться внутри него или непосредственно перед, но только объявляться. То есть так можно:
int i;
for( i = 0; i < 3; ++i );
А так - нельзя:
int i = some_magic();
// или int i; some_magic(&i); и т.д.


Пока лидирует решение на Perl (кто б сомневался):
use overload;
BEGIN {
 overload::constant ( integer => sub {
  return 'inf' if($_[1]==3);
  $_[1];
 } );
}

for( my $x = 0; $x < 3; ++$x );
Смысл его в том, что перегружается константа "3", она становится "inf", то есть бесконечностью.

Мой вариант не так эпичен:
use Variable::Magic qw/wizard cast/;

my $foo = \${ *x{SCALAR} };
cast $$foo, wizard( set => sub {
  my ($ref) = @_;
  $$ref = 0;
} );

for( our $x = 0; $x < 3; ++$x );
В принципе аналогичное можно было бы соорудить и с tie, но так веселей :)

Решения на сишностях не так интересны, они в основном с #define играют. А вот C#, Java, JavaScript и даже PHP с PowerShell - оказывается, ещё как могут! Слежу за развитием событий.

Expand Cut Tags

No cut tags

February 2018

S M T W T F S
    123
45678910
11121314151617
181920212223 24
25262728