На базарной площади довольно часто можно слышать высказывания об
Обероне. Мне кажется, что на базарной площади пора появиться ветке об
этой системе и языке, что-то вроде "Мысли об Обероне". Что это такое, перспективы
этой системы, что
полезного можно извлечь из него для программирования на Дельфи
(например) и др.
Ivan
Всего в теме 4531 сообщение
Ссылки по теме "Оберон" и "Компонентный паскаль"
Отслеживать это обсуждение
- Free Pascal, Oberon, BlackBox
- Разработка препроцессора gpre для delphi\freepascal.
- Component Pascal и среда разработки BlackBox
- FreePascal: реальная альтернатива или OpenSource — блажь?
№ 4461 09-02-2006 08:53 | |
Ответ на »сообщение 4460« (Андрей Хохлов)
___________________________
Критика Си - дело конечно хорошее, но делать его надо корректно. Возможно, это немного сложнее рассказов про собственные познания и отсутствие оных у других (В. Лосю).
char *p="car";
2[p]='d';
Правилен ли этот текст и если да, что он делает?
Если вы не знаете ответа, не начинайте с экспериметов.
Эт шо, вы всерьёз считаете, что это задание представляет из себя предмет для обcуждения? Вас на нём на собеседовании "срезали", да? Теперь это - незаживающая душевная рана? :о)
Ну, извольте, я вам её подлечу...
2[p] эквивалентно p[2], *(p+2) - в общем, типичный обрасчик пресловутой "гибкости", которой можно студентов-первокурсников смущать...
но вот присвоение символа работать может будет, а может и - нет... Всё от системы и компилятора зависит. Вернее, компилятор-то,это "проглотит" и выработает код, но, по хорошему, должно подразумеваться, что строка "car" находится в области констант, посему присваивать туда вам не позволят (по-разному, скорее всего по аппаратному исключению на счёт "только чтение"), но в жизни всякое бывает... :о)
Так вы с тем примером с pintf-ами таки разобрались или до сих пор никак? Может подсказать? :о)
№ 4460 09-02-2006 07:22 | |
Ответ на »сообщение 4451« (Сергей Губанов)
___________________________
Ответ на »сообщение 4446« (Андрей Хохлов)
И в чем же я не прав?
x+++++y разбивается на лексемы так:
x \ ++ \ ++ \ + \ y.
Вы - правы! Оно разбивается так. А на самом деле, должно так: "x++ + ++y". Потому, что только в такой комбинации данное выражение имеет смысл. Используемый лексический анализатор до этого додуматься не способен. Значит надо либо сочинить более умный лексический анализатор, либо задаться вопросом - зачем вообще такой синтаксис нужен.
Насколько мне известно, предпринимались попытки построения анализаторов, пытающихся "домысливать" и "исправлять ошибки". Только вот не распространилось это многообещающее направление почему-то (наверное нет уверенности в правильности домысливания).
В данном случае нет повода считать, что допущена опечатка. Английский оригинал найти не удалось, но нашлась ppt-презентация и в ней все тоже самое.
Критика Си - дело конечно хорошее, но делать его надо корректно. Возможно, это немного сложнее рассказов про собственные познания и отсутствие оных у других (В. Лосю).
Если бы речь шла о чем-то в роде
while (*p++=*q++);
не было бы вопроса, хотя есть примеры и хуже, скажем такой:
char *p="car";
2[p]='d';
Правилен ли этот текст и если да, что он делает?
Если вы не знаете ответа, не начинайте с экспериметов.
№ 4459 09-02-2006 04:34 | |
Ответ на »сообщение 4457« (Ev_genus)
___________________________
Не в обиду.
Да ну, какие обиды! :о)
Мало ли что можно писать.
Господи, как вы правы! :о)
Под лексером я имею ввиду весьма конкретный алгоритм описаный в книгах
ЧТО описывали? КАКОЙ алгоритм? ДЛЯ КАКОГО КЛАССА ГРАММАТИК?
Так вот этот алгоритм разобъёт на лексемы так как уже трижды предлагалось, тоесть неправильно :) по-вашему
Расшифруйте фразу, пжлст....
№ 4458 09-02-2006 04:29 | |
Ответ на »сообщение 4452« (Ev_genus)
___________________________
Попытаюсь написать мозголомный код на Обероне. Может и не получится :) ногами не бейте
>>> (Сергей Губанов)
>>> SKIPPED
Писал в текстовом редакторе.
Похоже на то, что сначала надо хотя бы RTFM...... :о)
№ 4457 09-02-2006 04:22 | |
Ответ на »сообщение 4456« (Владимир Лось)
___________________________
Не в обиду. Мало ли что можно писать. Под лексером я имею ввиду весьма конкретный алгоритм описаный в книгах и реализованый в прокраммах типа lexx, flex и им подобных. Так вот этот алгоритм разобъёт на лексемы так как уже трижды предлагалось, тоесть неправильно :) по-вашему
№ 4456 09-02-2006 04:19 | |
Ответ на »сообщение 4450« (Ev_genus)
___________________________
Может я вам америку открою, но лексер (алгоритм разбития на лексемы) - денерминированый автомат. Если вам это о чём то говорит.
Ух-ты! А давайте ещё о контекстной зависимости вспомним?... :о)
Это я по поводу...
Поэтому разбиение на лексемы - такое какое оно есть, а не правильное/неправильное/помоемунеправильное/кажетсянеправильное.
... а вот по этому поводу (правильности и трудностях при окончательном однозначном разбиении текста на Си++ на лексемы), можете почитать хотя бы у Е.Зуева в его статье, о том, как они компилятор с Си++ писали. Или его диссертацию... (на его цюрихской страничке оба материала есть)
№ 4455 09-02-2006 03:44 | |
Ответ на »сообщение 4454« (Ev_genus)
___________________________
Забавно не это. Попробуйте откомпилировать в Plug-In ETH Oberon for Windows только этот кусок:
TYPE
PROC = PROCEDURE(): P;
P = POINTER TO PROC;
Здесь строчки в определении типов намеренно переставлены местами.
А произойдет вот что: при компиляции окно с тестовым примером спустя несклько секунд принудительно закроется. Простой TRAP stack overflow из-за имеющей место быть реализации рекурсивного определения в конкретном компиляторе.
№ 4454 09-02-2006 03:15 | |
Ответ на »сообщение 4453« (Сергей Губанов)
Спасибо за исправления. Писал в текстовом редакторе. Приношу извинения общественности. Короче рассматривайте мозголомный код под редакцией ув. Сергея Губанова
№ 4453 09-02-2006 02:56 | |
Ответ на »сообщение 4452« (Ev_genus)
DO - зарезервированное слово.
Указатели могут быть только на RECORD или на ARRAY. На процедуру указатель - нонсенс, ибо сама процедурная переменная и есть адрес процедуры.
Надо писать так:
TYPE
P = PROCEDURE (): P;
Предварительное объявление делается "крышкой" ^
PROCEDURE^ Do(): P;
Такой вызов
Do();
делать нельзя (семантическая ошибка). Выражения в вакууме не болтаются - их надо к чему-то присваивать или с чем-то сравнивать. Можно так p := Do(); или так: IF Do() # NIL THEN ... END; или, хотя бы, так: IF Do() = Do() THEN ... END.
Такой вызов
Do()();
делать нельзя еще и по другой причине - последняя скобка (XXX) есть операция приведения типа выражения к типу XXX, а в данном случае тип XXX отсутствует - синтаксическая ошибка.
Можно так:
VAR p: P;
BEGIN
p := Do();
p := p();
p := p();
№ 4452 09-02-2006 02:25 | |
Ответ на »сообщение 4448« (Владимир Лось)
___________________________
Понимаете, мне вообще-то параллельны все эти изыски. На языках обероновской группы даже намёка на такую ситуацию вы не можете получить. И этот аргумент (для меня) перевешивает все сопли и слюни о "гибкости и мощности"....
Попытаюсь написать мозголомный код на Обероне. Может и не получится :) ногами не бейте
MODULE Test;
TYPE
P=POINTER TO PROC;
PROC=PROCEDURE():P;
VAR
V:INTEGER;
PROCEDURE DO():P;
PROCEDURE DO2():P;
BEGIN
V:=2;
RETURN DO;
END DO2;
PROCEDURE DO():P;
BEGIN
V:=1;
RETURN DO2;
END DO;
BEGIN
DO();
DO()();
END Test.
Отслеживать это обсуждение
Дополнительная навигация: |
|