Page 32 of 79
Posted: Tue Apr 22, 2008 1:24 pm
by The Dragon
Трябва ми прост, елегантен и качествен механизъм за auto update на win32/mfc апликации.
Posted: Tue Apr 22, 2008 3:43 pm
by Roamer
УууууууууууууууууууууууууууууЖАС!
Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, слагам етикет пред него и в един момент се замислям дали трябва да фнимафам с името на този етикет - дали трябва да е уникално за функцията, за пакета, за модула, за файла или за Вселената като цяло. Почвам да чета докиментация, чета perlsyn, чета perldata, чета perldoc -f goto, perldoc -f next, perldoc -f last... и нийде нищо не пише за уникалност на етикети.
Ха сега де... тия наистина ли искат да ми кажат, че мога да имам етикети с едни и същи имена? Я да видим...
- Spoiler: show
Code: Select all
#!/usr/bin/perl -wT
use strict;
print "First loop, first line:\n";
FOO:
while (<>) {
if (/enough/) {
print "Okay, leaving the first loop\n";
last;
} elsif (/furrfu/) {
print "Furrfu\n";
next FOO;
}
print "Foo!\n";
} continue {
print "First loop, next line:\n";
}
print "Second loop, first line:\n";
FOO:
while (<>) {
if (/enough/) {
print "Okay, leaving the second loop\n";
last;
} elsif (/furrfu/) {
print "BarFurrfu\n";
next FOO;
}
print "Bar!\n";
} continue {
print "Second loop, next line:\n";
}
print "Enough!\n";
Пускам го и... що да видя... да, наистина всеки next си next-ва неговия цикъл. Яяяяяя, прекрасно!
Коментар към колегите - "Мдам, то наистина няма смисъл да си пазиш глобална таблица за етикетите, достатъчно е да закачаш етикет за всеки блок и при next/last/whatever да вървиш навън по блоковете, докато намериш такъв с етикет. Хитро! Минават без глобална таблица за етикетите!"
...само че... я да видим... мдам, за next, last, continue и redo ще работи... само че има още една езикова конструкция, която ползва етикети... всъщност езиковата конструкция, заради която мноооого отдавна хората изобщо са *измислили* етикетите... езикова конструкция, която Perl също поддържа в някаква, макар и малко особена, форма... а за goto май ще трябва да има глобална таблица за етикетите... я да пробваме да заменим втория next с goto?
- Spoiler: show
Code: Select all
#!/usr/bin/perl -wT
use strict;
print "First loop, first line:\n";
FOO:
while (<>) {
if (/enough/) {
print "Okay, leaving the first loop\n";
last;
} elsif (/furrfu/) {
print "Furrfu\n";
next FOO;
}
print "Foo!\n";
} continue {
print "First loop, next line:\n";
}
print "Second loop, first line:\n";
FOO:
while (<>) {
if (/enough/) {
print "Okay, leaving the second loop\n";
last;
} elsif (/furrfu/) {
print "BarFurrfu\n";
print "(warning, moving on to the first loop, enter a line)\n";
goto FOO;
}
print "Bar!\n";
} continue {
print "Second loop, next line:\n";
}
print "Enough!\n";
И тук ни чака изненада

Мдааа, както вероятно си личи от поясняващия коментар точно преди goto-то, това goto поглежда в глобалната таблица с етикети, вижда, че там е влязъл един етикет мнооого, много рано и... таковата... ми... скача към него!
Та... мдам... Perl поддържа повтаряне на имената на етикетите, ама next/last/continue/redo и goto ги разбират по два съвършено различни начина!
И с риск да се повторя...
УууууууууууууууууууууууууууууЖАС!
Posted: Tue Apr 22, 2008 3:49 pm
by thunder
Да, ужасно е, т.е goto е ужасно

не ползвай goto

Posted: Tue Apr 22, 2008 3:54 pm
by Roamer
Ммммм... щооооо?

понякога - макар и много, *много* рядко - е полезно... а пък точно в Perl формата goto &sub е просто брилянтна в редките ситуации, в които можеш да се измъкнеш с нея

Posted: Wed Apr 23, 2008 8:48 pm
by The Dragon
The Dark Side of C++ and Win API. Can be scary! Can be horrible!
Posted: Fri May 02, 2008 10:40 am
by Marfa
Posted: Fri May 02, 2008 10:42 am
by Moridin
Windows has that effect
Posted: Fri May 02, 2008 11:00 am
by Corwin
Roamer wrote:УууууууууууууууууууууууууууууЖАС!
Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, сл....
Абе има някаква логика. В крайна сметка прави това, което очакваш да прави.
Командите за цикъл гледат първият най-близък цикъл със същото име, предполат, че си имал предвид точно това и те запращат там.
Гоуту вече е друга бира - при него вече не е сигурно, че искаш най-близкия етикет и те препраща на първия намерен - най-вероятно е направено просто по различен начин търсенето на етикетите в двата случая.
Друг въпрос е, че на юз стрикт не гърми като копеле с грешка.
И разбира се, че са ебали мамата на консистентността в езика, за да се мъчат да ти четат мислите. Един подреден Си програмист би припаднал, ако го научи това...
Posted: Fri May 02, 2008 8:51 pm
by dellusion
Posted: Fri May 02, 2008 10:32 pm
by Roamer
Мдааааа... друго си е човек да си подхване любимите религиозни войни

Били те за модели компютри, модели операционни системи, дори модели редактори...
Corwin, мдам, то логика има - и за логиката и сам се сетих общо-взето - то това изобщо да пробвам с goto ми хрумна, след като разбрах колко леко и лесно са направили това със закачането на етикет към блок и търсенето на най-близкия по-външен блок с този етикет

И, да, TIMTOWTDI[0] и DWIM[1] и друг път са водели до такива шашави особености на езиците, и не само в Perl
А ако това за подредения C програмист е било в някаква степен опит да си обясниш за себе си моето моментно ужасяване от ситуацията, мнье, ни съ мъчи

Или поне не с този аргумент

Виж, първият език, на който прописах (и то много по-успешно, отколкото сега ми се иска да е било, и с години), беше AppleSoft BASIC
[0] за тези, които още не са прегърнали религията на Perl - "There Is More Than One Way To Do It" - едно от основните мотота на езика
[1] за същите заблудени суеци, които още не са прегърнали религията на Perl - "Do What I Mean" - кратко название на куп особености в езика с общата идея, че синтактично леко неправилни и неясни конструкции правят понякога не твърде логични неща просто защото това е най-простият начин, по който човек би написал нещо, ако иска то да прави тези не твърде логични неща

Posted: Fri May 02, 2008 11:30 pm
by Moridin
Roamer wrote: Виж, първият език, на който прописах (и то много по-успешно, отколкото сега ми се иска да е било, и с години), беше AppleSoft BASIC

А тъкмо когато си мислиш, че знаеш всичко за хората!!!
Posted: Sat May 03, 2008 12:10 am
by Moridin
Покрай един от легендарните проблеми на този форум (е, легендарен е главно сред модераторите, но нз) се сблъсках с някаква непостижима идиотия на любимата на всинца ни базетка MySQL.
Когато използваш променлива от типа @a (user-defined variable) тя започва със стойност NULL, докато й зададеш някаква стойност, което става или със SET a = 5, или със a := 5. Принципно идеята на тия променливи е да ти предават някакво състояние между различните стейтмънти. На мен ми трябват за да си ъпдейтна няколко реда, придавайки нарастващи стойности на едното поле.
Е да, ама не. Следното нещо в phpMyAdmin и от php:
SET @a = 5;
SELECT @a as test;
дава резултат NULL
Седя аз и се пуля, но за всеки случай пробвам да ги събера на един ред и да ги пусна с една "заявка", доколкото това е праилният термин в случая. Бах мааму - работи??? (демек връща 5)
Ставам още по-удивен.
Опитвам се да приложа този полу-успех и в php, обаче дали от целия им mysqli или конкретно от ДБ класа, който трябва да ползвам, не ми дава да слагам повече от един стейтмънт в заявка. Значи не става.
Решавам да съм хитър и правя нещо от сорта на:
UPDATE tbl SET field = IFNULL(@a:=@a+1, @a:=5)
функцията се очаква да върне първия аргумент, ако той не е NULL, и втория, ако е.
Пак пишка - явно изразът се оценява само веднъж и никва инкрементация не става - всички са ми петички.
Решавам да се правя на още по-хитър и след известно количество нагласяванки успявам да бутна израза в WHERE клаузата, където БИ СЛЕДВАЛО да се оценява повече от веднъж (реално за всеки ред)
Е не и в MySQL!
Имам решение, което изобщо не използва user-defined variables, но то има известен дроубек и не ми се ще да прибягвам до него. Та някой да се е сблъсквал с нещо подобно? Идеи?
едит: Така де, поизнервих се и затова може би не става съвсем ясно - не казвам, че не е правилно решение да оценяват само веднъж и where клаузата по отношение на променливите. Вероятно иначе би било голям гърч. Но не ми се струва много коректно, а и остро ми вързва ръцете в този случай, след като по НЯКАКВА причина нормалният начин за работа с тия променливи (просто един предварителен SET) не работи.
Posted: Sat May 03, 2008 1:40 am
by The Dragon
SET в MYSQL работи що годе правилно само в транзакции. Освен това работи само при една конеция - ако php поддържа някакъв пул или проство всеки път отваря конекция няма как да работят.
НИКОГА не слагай израз който изисква сложна евалюация в WHERE клауза - чупи се брутално индекса и не се ползва и имаш пълен table scan. И не го пише в документацията.
Неща от сотра на SELECT * FROM TBL where DATE<NOW() е лоша идея в MySQL

Posted: Sat May 03, 2008 7:16 pm
by Moridin
За първото изречение - да, ама при два последователни пхп стейтмънта в рамките на един скрипт??? Който е писал тоя ДБ клас, трябва да е абсолютен идиот за да отваря нова конекция за втория. По подразбиране конкецията се затваря на края на скрипта. Но по-тъжното е, че и в phpMyAdmin не работи, а ТАМ вече ако отварят нова конекция за всяка заявка, си е *** мамата от глупост.
За второто - ясно. То беше за пробата.
Posted: Sat May 03, 2008 8:09 pm
by The Dragon
phpMyAdmin май отваряше. можеш да провериш като направиш temporary и след това пробваш да селектнеш от нея. Ако върне йебало си мамата - значи отваря.