Даже неудобно как-то критиковать правильный на 99,9% пост...
M>Единственным человеком, что решил отречься от фанатизма, был AVC. В одной из веток он верно отметил, что Оберон предназначен для работы в системе, построенной на нем же. И так же отметил, что BlackBox — это и есть эмлятор такой вот системы. Единственные доступные для изучения системы такого рода, что можно пощупать, — это BlueBottle и BlackBox.
Что, и сборку мустора будем на Оберонах писать? Успехов... покажите только потом исходники, посмеемся вместе.
Здравствуйте, Курилка, Вы писали:
К>Математически доказал, что там -1 вместо 0?
Да, без шуток.
Программа работала корректно (там почти всегда возвращались числа большие 0, ноль — минимум, вот такие данные были), так что тестирование проходило на ура. Методом пристального вглядывания в исходный текст программы обнаружил, вот...
Примеры типичных ошибок как так может быть:
Было:
n = ...
while(n > 0)
{
...
n--;
}
use(n);
После глупого с моей стороны так сказать усовершенствования стало:
n = ...
while(n --> 0)
{
...
}
use(n); // теперь n на 1 меньше чем надо (а иногда нет)
Мне стыдно за такую глупость, поддался "моде" на --> 0 оператор...
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Здравствуйте, boomsic, Вы писали:
B>>так что получается в обероне точно так же програмист не может быть "уверен, что перед следующим оператором после выхода из цикла выполняется условие ~p (NOT p)."
СГ>Может. Таково одно из положений структурного программирования. СГ>
СГ>WHILE p DO
СГ> ...
СГ>END;
СГ>ASSERT(~p)
СГ>
СГ>Этот ассерт ни когда не остановит выполнение программы, условие ~p всегда истинно.
СГ>
СГ>while (p)
СГ>{
СГ> ...
СГ>}
СГ>assert(!p)
СГ>
СГ>А вот этот ассерт иногда может остановить работу программы. Например, если внутри цикла сделать break не присвоив p ложное значение.
А при чем тут деструктор? И что тебе вообще не нравится? То, что можно прервать цикл в любое время? Так это даже иногда полезно.
СГ>После глупого с моей стороны так сказать усовершенствования стало: СГ>
СГ>n = ...
СГ>while(n --> 0)
СГ>{
СГ> ...
СГ>}
СГ>use(n); // теперь n на 1 меньше чем надо (а иногда нет)
СГ>
СГ>Мне стыдно за такую глупость, поддался "моде" на --> 0 оператор...
Моде? Может просто не потрудился прочитать документацию и выяснить разницу между постфиксным и префиксными -- и ++? Просто, на мой взгляд, если не удосужился подумать, то никакая верификация тут не поможет
Здравствуйте, Сергей Губанов, Вы писали:
CX>>почему он должен соответствовать этим критериям?
СГ>Потому что меньше одной "звездочки" нельзя, а больше одной — уже не надо.
Почему Вы решили, что минимальное количество лексем является признаком правильности синтаксиса? Это откровение свыше или этому есть какие-то реальные обоснования?
Здравствуйте, Сергей Губанов, Вы писали:
СГ>В Modula/Oberon ни одно из указанных Вами слов не присутсвует. До Паскаля мне дела нет, он устарел давным давно.
вот так вот сидишь, проектируешь, реализовываешь на языке который устарел
это наверное скучно, куда веселее схватить что-то новенькое, посмыкать и выкинуть как ненужное.
да и я как-то устарел наверное, мне б спроектировать, набросать чуток и не задумываться кто, когда и на чем будет реализовывать, только вот пожалуйста не на модуле или обероне, потому как этому экстрималу что-то в голову всбредет и потом ищи интузизистов на доработку...
ЗЫ меня много что не устраивает в делфях, но поверьте не синтаксис
к begin/end привыкаешь за теже 10-15 минут перехода на делфи, за которые привыкаешь к {} в сях. в конце концов подсветка синтаксиса рулит и эти конструкции заметны только с непривычки.
ЗЫЫ
procedure TReferenceTree.UnlinkNode(current: PReferenceNode);
begin// unlink left/rightif Assigned(current^.LeftInline) then
begin
if Assigned(current^.RightInline) then
begin// glue left with right
current^.LeftInline^.RightInline := current^.RightInline;
current^.RightInline^.LeftInline := current^.LeftInline;
end
else// unlink left
current^.LeftInline^.RightInline := nil;
end
else ; // nothink glue/unlink
// unlink next/previousif Assigned(current^.PrevSibling) then
begin
if Assigned(current^.NextSibling) then
begin// glue periouse with next
current^.PrevSibling^.NextSibling := current^.NextSibling;
и т.д... и посмотрю на того кто осмелится такое писать в одну строку! понимаю что процедуры на 2-3 экрана это не нормально, но иногда без них не обойтись
Разрешите вклинится.
Мой е2-е4:
AVC>а) Соответствие структурным принципам.
AVC>В отличие от синтаксиса Модулы/Оберона синтаксис Си/Си++ не соответствует принципам структурного программирования. AVC>Рассмотрим хотя бы циклы.
Да. Рассмотрим.
Пример:
MODULE TestTest;
IMPORT StdLog, Files;
PROCEDURE Test*();
VAR by: INTEGER;
BEGIN
by := 10;
LOOP
(*I expect by==0 after LOOP. Always. Oberon is cool.*)IF by=0 THEN EXIT END;
by := by - 1;
EXIT;
END;
IF by # 0 THEN(*What the fuck !*)END;
END Test;
END TestTest.
Итак, Оберон тоже не соответствует принципам структурного программирования.
Здравствуйте, Privalov, Вы писали:
P>Много раз уже звучал вопрос, а что EXIT убрали из языка?
Ёёёёёёёёёёё, повторяю еще раз.
Циклы бывают всего трех типов:
1) Проверка условия продолжения перед выполнением итерации
WHILE a DO ... END
post condition a = FALSE
2) Проверка условия завершения в середине выполнения итерации
LOOP
...
IF a THEN ...; EXIT END;
...
END
3) Проверка условия завершения в конце итерации
REPEAT ... UNTIL a
post condition a = TRUE
В WHILE и в REPEAT нету никакого EXIT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EXIT есть только внутри LOOP ... END. Теперь понятно?
P>Простейший пример: найти в массиве первый отрицательный элемент.
На, пожалуй начинать надо с элементарных примеров:
i := 0;
WHILE (i < LEN(a)) & (a[i] >= 0) DO INC(i) END
Но это не главное. Я привык, чтобы на мои ответы реагировали адекватно. И сам, по мере сил, пытаюсь адекватно реагировать на ответы других.
То есть. Если я знаю что-то, я это скажу. Если я чего-то не знаю, то с удовольствием послушаю мнение других и отреагирую оценками. Если я в чем-то не уверен, то я спрошу и выслушаю мнения. Если я уверен в чем-то неправильном, то я выслушаю все аргументы и, возможно, останусь при своем мнении, но буду знать, что я, возможно, не прав.
Ключевое слово в последнем предложении — аргументы.
Против аргументов, да еще поддержаных фактами, не попрешь. Вернее, попрешь, но с еще более убедительными аргументами.
Но когда, во-первых, меня не слушают, во-вторых, кормят лапшой, а потом еще и пытаются оскорблять, то, извините, вы разбудили во мне зверя. Но не кролика, и он не испугается и не убежит.
Причины, по которой я продолжаю участвовать в этой дискуссии, следующие:
1 (и главное). Здесь участвуют очень интересные люди с большим опытом в программировании, чье мнение я уважаю и ценю. Даже среди того флейма, что мы породили, можно найти инетерсные мысли, куски кода, способы аргументирования и проч.
2. Я тестирую себя. Хоть поле и неблагодарное, я смотрю, насколько мои собственные аргументы правильны. И, если они неправильны, я отойду в сторону, согласившись со своей неправотой.
3. Мне интересно понаблюдать за Сергеем. Ага, как в лаборатории. Интересна реакция организма на критику
Известно, что даже самый главный фанатик RSDNa, Vlad2, имеет право быть таким фанатиком. За его плечами опыт, в его руках очень немаленький проект (я о R#). Он стоит на своем, но стоит с аргументами в руках.
Но в случае с Обероном фанатизм переходит все границы. Отсутствие аргументов заменяется истеричными выкриками "сам такой" и каким-то, колобковским, что ли, поведением. А такой фанатизм надо усмирять.
Это все было мое могучее ИМХО и все обо мне, любимом Злой я и голодный
Здравствуйте, Сергей Губанов, Вы писали:
П>>... то я получу syntax error? СГ>Ну да. Вы получите ошибку времени компиляции. Такая программа не будет скомпилирована. EXIT бывает только внутри LOOP ... END, а внутри WHILE или REPEAT его быть не может.
Угу, ясно. Допустим (совершенно условно):
while (queue.has_elements()) {
Elem elem = queue.get_first();
if (elem.get_state() == ST_FREE) {
elem.start_processing(...);
break;
} else {
queue.make_last(elem);
}
}
Здравствуйте, Сергей Губанов, Вы писали:
СГ>Циклы бывают всего трех типов:
На самом деле все три типа можно свести к одному — WHILE. Обоснование есть, IMHO, и у Вирта.
[.....]
СГ>В WHILE и в REPEAT нету никакого EXIT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! EXIT есть только внутри LOOP ... END. Теперь понятно?
На фиг мне такой EXIT, чтобы я еще думал, в каком цикле его можно использовать, а в каком — нет.
P>>Простейший пример: найти в массиве первый отрицательный элемент.
СГ>На, пожалуй начинать надо с элементарных примеров: СГ>i := 0; СГ>WHILE (i < LEN(a)) & (a[i] >= 0) DO INC(i) END
Я не просил переписать этот код на Обероне. Вопрос был: в каком из примеров assert сработает, а в каком — нет. Сами примеры еще раз не привожу.
Здравствуйте, Privalov, Вы писали:
P>Здравствуйте, Sergey J. A., Вы писали:
SJA>>Та что там не тривиальный ! Вот тут автором треда был запощен простейший код на 20 строк:
SJA>>код
SJA>>(второй листинг) SJA>>В котором он как ни странно допустил ошибку. Математический аппарат дал сбой ?
P>Меня за такие лестницы еще на первом курсе по рукам били. И очень правильно били. P>А вообще-то там и первый листинг чтобы разобрать — серьезно попотеть надо. А после пары-тройки написанных процедур по весьма запутанному алгоритму у меня, боюсь, здоровья не хватит прочесть оба листинга сразу, а тем более найти в них ошибки.
да что там запутанного! там же бред полный! лол! я как посмотрел — мне смешно стало...
тут наверное в основном сишники сидят, потому и не поняли всю кривизну.
в двух словах, в делфях нет автоконструкторов и автодеструкторов, потому объекты не освобождаются сами в конце блока, а их нужно освобождать ручками. в случае ИС мы можем пролетель точку освобождения, потому существует следующая конструкция:
т.е, заходя в блок try finally мы гарантированно в любом случае освободим объект.
соответственно конструкция try try не имеет права на жизнь
вот вам и математически доказанная глупая избыточность кода, и проявилась она не из-за Си, а из-за непонимания синтаксиса языка вообще.
P>>Простейший пример: найти в массиве первый отрицательный элемент.
СГ>На, пожалуй начинать надо с элементарных примеров: СГ>i := 0; СГ>WHILE (i < LEN(a)) & (a[i] >= 0) DO INC(i) END
Здравствуйте, Privalov, Вы писали:
P>Здравствуйте, Socrat, Вы писали:
P>>>
P>>> for (i=0; a[i]>=0 && i < N; i++);
P>>>
S>>Хм... Лучше сначала i сравнить с N...
P>А почему? Если a[i]<0, то i с N сравниваться уже не будет. Сэкономим пару тактов. Хотя может я не вижу чего. Устал...
Если N — это длина массива, то при i = N вначале вылетит ошибка и до проверки i < N не дойдёт. Вот и всё
Здравствуйте, CrystaX, Вы писали:
CX>Здравствуйте, Сергей Губанов, Вы писали:
CX>>>почему он должен соответствовать этим критериям?
СГ>>Потому что меньше одной "звездочки" нельзя, а больше одной — уже не надо.
CX>Почему Вы решили, что минимальное количество лексем является признаком правильности синтаксиса? Это откровение свыше или этому есть какие-то реальные обоснования?
Оберон есть ЕДИНСТВЕННЫЙ ЯЗЫК! И Сергей Губанов — пророк его!