Кът на програмиста...
Moderator: Moridin
- The Dragon
- Elder God
- Posts: 9062
- Joined: Wed Jan 14, 2004 9:03 pm
- Roamer
- Ascendent
- Posts: 4895
- Joined: Wed Jan 03, 2007 5:25 pm
- Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
- Contact:
УууууууууууууууууууууууууууууЖАС!
Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, слагам етикет пред него и в един момент се замислям дали трябва да фнимафам с името на този етикет - дали трябва да е уникално за функцията, за пакета, за модула, за файла или за Вселената като цяло. Почвам да чета докиментация, чета perlsyn, чета perldata, чета perldoc -f goto, perldoc -f next, perldoc -f last... и нийде нищо не пише за уникалност на етикети.
Ха сега де... тия наистина ли искат да ми кажат, че мога да имам етикети с едни и същи имена? Я да видим...
Коментар към колегите - "Мдам, то наистина няма смисъл да си пазиш глобална таблица за етикетите, достатъчно е да закачаш етикет за всеки блок и при next/last/whatever да вървиш навън по блоковете, докато намериш такъв с етикет. Хитро! Минават без глобална таблица за етикетите!"
...само че... я да видим... мдам, за next, last, continue и redo ще работи... само че има още една езикова конструкция, която ползва етикети... всъщност езиковата конструкция, заради която мноооого отдавна хората изобщо са *измислили* етикетите... езикова конструкция, която Perl също поддържа в някаква, макар и малко особена, форма... а за goto май ще трябва да има глобална таблица за етикетите... я да пробваме да заменим втория next с goto?
Мдааа, както вероятно си личи от поясняващия коментар точно преди goto-то, това goto поглежда в глобалната таблица с етикети, вижда, че там е влязъл един етикет мнооого, много рано и... таковата... ми... скача към него!
Та... мдам... Perl поддържа повтаряне на имената на етикетите, ама next/last/continue/redo и goto ги разбират по два съвършено различни начина!
И с риск да се повторя...
УууууууууууууууууууууууууууууЖАС!
Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, слагам етикет пред него и в един момент се замислям дали трябва да фнимафам с името на този етикет - дали трябва да е уникално за функцията, за пакета, за модула, за файла или за Вселената като цяло. Почвам да чета докиментация, чета perlsyn, чета perldata, чета perldoc -f goto, perldoc -f next, perldoc -f last... и нийде нищо не пише за уникалност на етикети.
Ха сега де... тия наистина ли искат да ми кажат, че мога да имам етикети с едни и същи имена? Я да видим...
- Spoiler: show
Коментар към колегите - "Мдам, то наистина няма смисъл да си пазиш глобална таблица за етикетите, достатъчно е да закачаш етикет за всеки блок и при next/last/whatever да вървиш навън по блоковете, докато намериш такъв с етикет. Хитро! Минават без глобална таблица за етикетите!"
...само че... я да видим... мдам, за next, last, continue и redo ще работи... само че има още една езикова конструкция, която ползва етикети... всъщност езиковата конструкция, заради която мноооого отдавна хората изобщо са *измислили* етикетите... езикова конструкция, която Perl също поддържа в някаква, макар и малко особена, форма... а за goto май ще трябва да има глобална таблица за етикетите... я да пробваме да заменим втория next с goto?
- Spoiler: show

Та... мдам... Perl поддържа повтаряне на имената на етикетите, ама next/last/continue/redo и goto ги разбират по два съвършено различни начина!
И с риск да се повторя...
УууууууууууууууууууууууууууууЖАС!
Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.
Ed: It's not good, Eric. It's a gazebo.
- The Dragon
- Elder God
- Posts: 9062
- Joined: Wed Jan 14, 2004 9:03 pm
Абе има някаква логика. В крайна сметка прави това, което очакваш да прави.Roamer wrote:УууууууууууууууууууууууууууууЖАС!
Пиша си, значи, разни Perl-овски глупости, пиша си някакъв цикъл, сл....
Командите за цикъл гледат първият най-близък цикъл със същото име, предполат, че си имал предвид точно това и те запращат там.
Гоуту вече е друга бира - при него вече не е сигурно, че искаш най-близкия етикет и те препраща на първия намерен - най-вероятно е направено просто по различен начин търсенето на етикетите в двата случая.
Друг въпрос е, че на юз стрикт не гърми като копеле с грешка.
И разбира се, че са ебали мамата на консистентността в езика, за да се мъчат да ти четат мислите. Един подреден Си програмист би припаднал, ако го научи това...
I like rusty spoons....
I like to touch them...
It's almost orgasmic...
I like to touch them...
It's almost orgasmic...
- Roamer
- Ascendent
- Posts: 4895
- Joined: Wed Jan 03, 2007 5:25 pm
- Location: Hier ist hier und jetzt ist jetzt doch jetzt ist jetzt schon nicht mehr da...
- Contact:
Мдааааа... друго си е човек да си подхване любимите религиозни войни
Били те за модели компютри, модели операционни системи, дори модели редактори... 
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" - кратко название на куп особености в езика с общата идея, че синтактично леко неправилни и неясни конструкции правят понякога не твърде логични неща просто защото това е най-простият начин, по който човек би написал нещо, ако иска то да прави тези не твърде логични неща


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


А ако това за подредения C програмист е било в някаква степен опит да си обясниш за себе си моето моментно ужасяване от ситуацията, мнье, ни съ мъчи



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

Eric: I use my sword to detect good on it.
Ed: It's not good, Eric. It's a gazebo.
Ed: It's not good, Eric. It's a gazebo.
- Moridin
- Global Moderator
- Posts: 19290
- Joined: Fri Dec 19, 2003 10:21 pm
- Location: On the other side
- Contact:
Покрай един от легендарните проблеми на този форум (е, легендарен е главно сред модераторите, но нз) се сблъсках с някаква непостижима идиотия на любимата на всинца ни базетка 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) не работи.
Когато използваш променлива от типа @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) не работи.
This is it. Ground zero.
- The Dragon
- Elder God
- Posts: 9062
- Joined: Wed Jan 14, 2004 9:03 pm
SET в MYSQL работи що годе правилно само в транзакции. Освен това работи само при една конеция - ако php поддържа някакъв пул или проство всеки път отваря конекция няма как да работят.
НИКОГА не слагай израз който изисква сложна евалюация в WHERE клауза - чупи се брутално индекса и не се ползва и имаш пълен table scan. И не го пише в документацията.
Неща от сотра на SELECT * FROM TBL where DATE<NOW() е лоша идея в MySQL
НИКОГА не слагай израз който изисква сложна евалюация в WHERE клауза - чупи се брутално индекса и не се ползва и имаш пълен table scan. И не го пише в документацията.
Неща от сотра на SELECT * FROM TBL where DATE<NOW() е лоша идея в MySQL

The sinking of the Titanic was a miracle to the lobsters in the ship's kitchen.
- Moridin
- Global Moderator
- Posts: 19290
- Joined: Fri Dec 19, 2003 10:21 pm
- Location: On the other side
- Contact:
За първото изречение - да, ама при два последователни пхп стейтмънта в рамките на един скрипт??? Който е писал тоя ДБ клас, трябва да е абсолютен идиот за да отваря нова конекция за втория. По подразбиране конкецията се затваря на края на скрипта. Но по-тъжното е, че и в phpMyAdmin не работи, а ТАМ вече ако отварят нова конекция за всяка заявка, си е *** мамата от глупост.
За второто - ясно. То беше за пробата.
За второто - ясно. То беше за пробата.
This is it. Ground zero.
- The Dragon
- Elder God
- Posts: 9062
- Joined: Wed Jan 14, 2004 9:03 pm
Who is online
Users browsing this forum: No registered users and 4 guests