31
Общий раздел / Re: Oberon rev. 2015 (февраль)
« : Март 06, 2015, 09:07:29 pm »
vlad, тебе надо перерыв сделать. Перегрелся походу. Уже не только пендосский, но и родной язык понимать перестал
Онлайн компилятор Oberon-07/11
Путеводитель по Оберон-проектам.
Логи jabber-конференции.
Онлайн исходники BlackBox: тут:WeBB и на github
Исходники Project Oberon V4 на github.
Сборник решений задач книги "Современное программирование с нуля!" тут. А обсуждение здесь.
В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.
Зачем в примере переменные p0, p1, p2? Можно представить, что пропущено "p0 := p", "p1 := p", "p2 := p" в каждой ветке? Блин, всего 16 страниц описания очень простого языка и вот такая откровенная херня.p0, p1 и p2 - это и есть p
CASE p OF
0) P0: p.b := 10 |
1) P1: p.b := 2.5 |
2) P2: p.b := {0, 2}
END
Вах вах метки тепрь со скобочкой в языке!
The type T of the case expression (case variable) may also be a record or pointer type. Then the
case labels must be extensions of T, and in the statements Si labelled by Ti, the case variable is
considered as of type Ti.
Тип Т CASE-выражения может быть типом-записью или типом-указателем. CASE-метки должны быть расширениями типа Т и в i-той ветке с i-той меткой (i-тый тип Ti) CASE-переменная считается имеющей тип Ti
TYPE R = RECORD a: INTEGER END ;
R0 = RECORD (R) b: INTEGER END ;
R1 = RECORD (R) b: REAL END ;
R2 = RECORD (R) b: SET END ;
P = POINTER TO R;
P0 = POINTER TO R0;
P1 = POINTER TO R1;
P2 = POINTER TO R2;
VAR p: P; p0: P0; p1: P1; p2: P2;
CASE p OF
P0: p0.b := 10 |
P1: p1.b := 2.5 |
P2: p2.b := {0, 2}
END
case variable is considered as of type TiИ будет тупо выбиралка без охраны.
CASE M OF
FontMsg: fnt := M(FontMsg).fnt; w := 0; len := 0; pos := obj(Caption).pos;
Texts.OpenReader(R, T, pos); Texts.Read(R, ch); dy := R.fnt.minY;
WHILE ch > 0DX DO
Fonts.GetPat(fnt, ch, dx, x1, y1, w1, h1, patadr);
INC(w, dx); INC(len); Texts.Read(R, ch)
END ;
INC(obj.y, fnt.minY-dy); obj.w := w; obj.h := fnt.height;
Texts.ChangeLooks(T, pos, pos+len, {0}, fnt, 0 , 0) |
ColorMsg: obj.col := M(ColorMsg).col
и такой:PROCEDURE ChangeMacro(obj: Object; VAR M: Msg);
BEGIN
CASE M OF ColorMsg: obj.col := M.col END
END ChangeMacro;
Угу, угу. Верь в свою думалку.В общем, Romiras, не верь в правильность решения, принятого лауреатом премии Тьюринга.
Верь valexey'ю
Никому не верь -- сам думай. А веру оставь уделом религиозных людей...
PS. Насколько я знаю, ilovb также сумел это все запустить.
С введением замыкаций и анонимных функций в версии 3.1 (июль 1998) мы решили использовать для итераций функции высшего порядка. (На самом деле, необходимость в for была одной из основных причин введения анонимных функций в Lua). Lua 3.1 вышла с двумя предопределенными функциями для итерирования:
foreach(table, f)
foreachi(table, f)
Функция foreach применяет f для всех пар ключ-значение, выбранных в произвольном порядке из заданной таблицы. Функция foreachi похожа, но рассматривает таблицу как список (или массив): она перебирает только элементы с числовыми ключами в порядке возрастания значений ключей. Хоть мы и предоставили только эти два способа обхода, было легко создать новые итераторы.
Но хоть и просто было создавать новые, но за более чем два года практически никто их не делал. Первой причиной был дискомфорт для многих программистов использовать анонимные функции и функции высших порядков в процедурном языке. А второй и, на наш взгляд, значительно более важной причиной было отсутствие необходимости для большинства разработчиков в других итераторах. Это означает, что многие годы мы пытались добиться того, что не нужно реальному пользователю. С пониманием этого, мы быстро разработали два формата цикла for: для числовой итерации и для обхода таблиц.