Оберон-технология: особенности и перспективы |
Тематика обсуждения: Оберон-технология. Особенности, перспективы, практическое применение.
Всего в теме 6256 сообщений
Добавить свое сообщение
Отслеживать это обсуждение Обсуждение из раздела Школа ОБЕРОНА
№ 5226 26-09-2007 09:45 | |
Ответ на »сообщение 5224« (panda)
___________________________
заморачиваться с индексами иногда необходимо, а лишняя конструкция в языке, с суженной (уточнённой) областью применения, ИМХО должна приниматься, только если она очень полезна и удобна.
всякие форичи итд не кажутся мне таковыми, зачем пудрить мозги ещё одной сущностью, их и так расплодилось много :)
вот тут я понимаю Вирта с его минимализмом.
№ 5225 26-09-2007 05:28 | |
Ответ на »сообщение 5222« (Руслан Богатырев)
___________________________
Коллеги, а чем вам не нравится концепция итератора, предложенная ещё в начале 1970-х годов Барбарой Лисков в языке CLU?
Мне - нравится. Я люблю и итераторы, и циклы foreach, и реализацию foreach через итераторы :-)
№ 5224 26-09-2007 05:27 | |
Ответ на »сообщение 5220« (Beginner)
___________________________
Это отрыжка от правила считать с 0, а не как нормальные люди - с 1. Опять противоречие между привычкой (прагматика) и заумной (хоть абсолютно правильной) учёностью.
Ну так foreach и позволяет считать не заморачиваясь с индексами ;-)
№ 5223 26-09-2007 04:44 | |
Ответ на »сообщение 5221« (Fktrc)
___________________________
DoForEach(List, Procedure, fBeg, fEnd), где fEnd может быть отрицательным. Отрицательность fEnd будет свидетельствовать, что диапазон перебора кончается за abs(fEnd) элементов до конца списка.
Ну тогда опять будут писать DoForEach(List, Proc, 1, Count), когда надо DoForEach(List, Proc, 0, Count-1). :)
Ответ на »сообщение 5222« (Руслан Богатырев)
___________________________
Коллеги, а чем вам не нравится концепция итератора, предложенная ещё в начале 1970-х годов Барбарой Лисков в языке CLU?
DoForEach, в большинстве случаев, будет реализован через итератор или что-то похожее. А если прямо использовать итератор, то ведь он имеет состояние, за которым надо следить.
№ 5222 26-09-2007 04:17 | |
Ответ на »сообщение 5221« (Fktrc)
___________________________
DoForEach(List, Procedure, fBeg, fEnd), где fEnd может быть отрицательным. Отрицательность fEnd будет свидетельствовать, что диапазон перебора кончается за abs(fEnd) элементов до конца списка.
Коллеги, а чем вам не нравится концепция итератора, предложенная ещё в начале 1970-х годов Барбарой Лисков в языке CLU?
№ 5221 26-09-2007 04:09 | |
Ответ на »сообщение 5218« (Mirage)
___________________________
Ну или тогда в язык надо вводить ForEachExceptLastOne, ForEachExceptLastTwo и т.д.
DoForEach(List, Procedure, fBeg, fEnd), где fEnd может быть отрицательным. Отрицательность fEnd будет свидетельствовать, что диапазон перебора кончается за abs(fEnd) элементов до конца списка.
№ 5220 26-09-2007 03:29 | |
Ответ на »сообщение 5217« (panda)
___________________________
Это отрыжка от правила считать с 0, а не как нормальные люди - с 1. Опять противоречие между привычкой (прагматика) и заумной (хоть абсолютно правильной) учёностью.
№ 5219 26-09-2007 03:21 | |
Ответ на »сообщение 5214« (AVC)
___________________________
Ну в принципе, задачка эдеиентарная.
Нужно создать потенциально бесконечный список нечётных чисел, претендующих на звание простых, затем с помощью функции filter отфильтровать из этого списка все составные числа и получить, опять же, потенциально бесконечный список, но уже именно простых чисел (используя для этого уже имеющиеся элементы в этом отфильтрованном списке), и наконец, изъять из него стотысячный или миллионный элемент...
Программа на Хаскелле, которая именно так решает эту задачу, выглядит так:
primes :: [Int]
primes = 2:3:filter isPrime [5,7..]
where
isPrime !x = all (\p -> x `mod` p /= 0) $ takeWhile (\p -> p*p <= x) $ tail primes
n = 100000
main = print $ primes !! (n-1) стотысячный элемент извлекается за 3 сек, миллионный - за 79 сек.
Нижеприведённая программа на КП использует массив, и время работы у неё, соответственно, 0.65 и 17 сек. Такая же программа на Си (gcc 3.4.5) - 0.44 и 11 сек...
MODULE Primes;
IMPORT SL:=StdLog;
CONST nmax = 1000000;
VAR ps : ARRAY nmax OF INTEGER;
PROCEDURE Prime(n : INTEGER) : INTEGER;
VAR i, j, p : INTEGER;
f : BOOLEAN;
BEGIN
ps[0] := 2; ps[1] := 3;
i := 2; p := 5;
WHILE i < n DO
f := TRUE;
j := 1;
WHILE f & (ps[j]*ps[j] <= p) DO
f := (p MOD ps[j]) # 0;
INC(j)
END;
IF f THEN
ps[i] := p;
INC(i)
END;
INC(p,2)
END;
RETURN ps[n-1]
END Prime;
PROCEDURE Do*;
BEGIN
SL.Int(Prime(100000)); SL.Ln;
END Do;
END Primes. А вот любопытно, какая скорость будет у варианта на КП и Си, которые имеют такой же алгоритм, как на Хаскелле, т.е. с бесконечными ленивыми списками...
№ 5218 26-09-2007 02:58 | |
Ответ на »сообщение 5217« (panda)
___________________________
Вы никогда не замечали в ходе code review перлов навроде
for I := 0 to List.Count или for I := 1 to List.Count ?
Вам крупно повезло ;-)
Бывало, хотя в большинстве случаев при запуске возникает range check error с указанием места ошибки и все очевидно.
В крайнем случае, можно сделать свой DoForEach(List, Procedure).
Ну или тогда в язык надо вводить ForEachExceptLastOne, ForEachExceptLastTwo и т.д.
№ 5217 26-09-2007 02:40 | |
Ответ на »сообщение 5213« (Mirage)
___________________________
Смысла вводить foreach ни в C# ни в Delphi (а ввели ведь) не вижу. Ни укорачивания кода, ни унификации кода для разных типов контейнеров, этим не достигается. Единственная цель, которая действительно этим достигнута - "шобы было".
Вы никогда не замечали в ходе code review перлов навроде
for I := 0 to List.Count или for I := 1 to List.Count ?
Вам крупно повезло ;-)
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|