[00:00:22] <valexey> vlad2: слушай, а что будет при попытке привести NIL к типу?
[00:01:14] <vlad2> NIL?
[00:01:42] <vlad2> раздклители - тоже числа
[00:01:55] <vlad2> Вообще конечно это все объекты, но для примера можно и INTEGER
[00:02:17] <valexey> ну, то есть ptr : BaseTypePtr; ptr := NIL; ptr(ChildTypePtr).foo;
[00:02:36] <valexey> точнее даже так: NEW(ptr(ChildTypePtr));
[00:02:38] <valexey> во
[00:02:49] <TRUE> так - ошибка
[00:02:51] <TRUE> должна быть
[00:02:57] <valexey> на основании чего?
[00:02:58] <TRUE> разыменование нулевого указателя
[00:03:08] <valexey> и какая именно ошибка?
[00:03:23] <TRUE> пошли по нулевому указателю
[00:03:27] <TRUE> чтобы тег посмотреть
[00:03:46] <valexey> тут вроде нет разименования. я просто NEW явным образом указываю, что создай ка мне объект вот такого вот типа и присвой ка вот этому указателю
[00:04:13] <TRUE> а
[00:04:37] <TRUE> так к типу приводят значение, а не переменную.
[00:05:31] <valexey> а как переменную приводят? :-)
[00:05:39] <valexey> по моему, в обероне - это никак ваще
[00:05:49] <valexey> vlad2: а походу я ошибку в компиляторе нашел :-)
[00:05:59] <vlad2> Пока не понял - где?
[00:05:59] <TRUE> переменную не приводят. Переменной пользуются, чтобы сослаться на значение
[00:07:42] <TRUE> сначала отработает ptr(ChildTypePtr), а потом NEW
[00:09:56] <valexey> vlad2:
[00:10:00] <valexey> MODULE test;
IMPORT JS;
TYPE
Parent = RECORD END;
ParentPtr = POINTER TO Parent;
ChildPtr1 = POINTER TO RECORD (Parent) a : INTEGER END;
Child = RECORD (Parent) a : INTEGER END;
ChildPtr2 = POINTER TO Child;
VAR
ptr : ParentPtr;
BEGIN
ptr(ChildPtr1).a := 42; (* unexpected error *)
ptr(ChildPtr2).a := 42; (* unexpected error *)
END test.
[00:10:14] <valexey> unexpected - мной не ожидаемый еррор :-)
[00:10:21] <valexey> его там не должно быть на этапе компиляции.
[00:10:26] <valexey> line 15: invalid type cast: RECORD type expected as an argument of type guard, got 'ChildPtr2'
[00:11:06] <valexey> согласно 8.1:
[00:12:06] <valexey> The typeguard v(T0) asserts that v is of type T0, i.e. it aborts program execution, if it is not of type T0. The guard is applicable, if
1. T0 is an extension of the declared type T ofv , and if
2. v is a variable parameter of record type, or v is a pointer.
[00:14:09] <vlad2> Не. Все правильно.
[00:14:23] <vlad2> Он тип в харде хочет RECORD
[00:14:52] <valexey> э? в ком он хочет?
[00:14:54] <vlad2> А переменная может быть указатлем,да.
[00:15:26] <vlad2> ptr(Child).a := 42;
[00:15:30] <vlad2> - работает
[00:15:43] <vlad2> ptr(ChildPrt2).a := 42; - не работает
[00:15:55] <valexey> А это не правильно :-)
[00:16:02] <vlad2> Потому что ChildPtr2 - не рекорд.
[00:16:41] <vlad2> К Вирту :) В репорте черным по-белому "T0 is an extension of the declared type T ofv"
[00:16:54] <valexey> "T0 is an extension of the declared type T"
[00:16:55] <vlad2> Указатель не является extension of RECORD
[00:17:09] <vlad2> Можешь еще в ББ глянуть.
[00:17:24] <valexey> При этом очевидно что запись потомка НЕ ЯВЛЯЕТСЯ расширением УКАЗАТЕЛЯ на предка
[00:17:42] <vlad2> И?
[00:18:44] <valexey> ". If a type T is an extension of T0 and P is a pointer type bound to T, then P is also an extension of P0, the pointer type bound to T0."
[00:19:01] <vlad2> Т.е. ты приводишь к типу T, но на выходе у тебя или T* или T& в зависимости от типа переменной.
[00:19:05] <valexey> Таким образом если basePtr(ChildPtr) -- можно, base(ChildPtr) - нельзя
[00:19:15] <valexey> basePtr(Chld) -- тоже нельзя
[00:19:16] <vlad2> Иначе получаются очень странные неоднонаяности.
[00:19:37] <valexey> у меня был вариант basePtr(childPtr)
[00:20:10] <valexey> и оно это не позволило, хотя должно было.
[00:20:34] <vlad2> Не, не должно.
[00:20:36] <valexey> то есть на входе указательный тип, на выходе тоже должен быть указательный тип.
[00:20:40] <valexey> обязано :-)
[00:20:43] <vlad2> Иначе будет бардак.
[00:20:52] <valexey> пример бардака плиз :-)
[00:21:21] <vlad2> Вирт и так не делает разницы (почти) между указателями и ссылками.
[00:21:42] <vlad2> Если еще в type guard требовать "строгий" тип - вообще херня получится.
[00:21:52] <valexey> да не будет бардака. более того - это явно следует из репорта. уж тут то разночтений быть не может
[00:22:28] <valexey> там написано, что если у нас указатель на дите, то оно является расширеним УКАЗАТЕЛЯ на базу
[00:22:34] <valexey> но не является расширением базы
[00:22:39] <vlad2> Нет, там не так написано :)
[00:22:48] <valexey> тайпГард работает ТОЛЬКО для базы и дитя.
[00:22:59] <valexey> скрещивать рекорд с указателем на рекорд - низя
[00:23:12] <valexey> можно только от рекорда к рекорду и от указателя к указателю
[00:23:28] <vlad2> Хорошо. Я шляну как в ББ.
[00:23:32] <vlad2> И у акрона.
[00:23:36] <valexey> ок
[00:24:36] <vlad2> Хотя по мне - было бы проще в существующем варианте. За исключением того, что уже нельзя кастнуть к указателю на анонмный рекорд :)
[00:26:17] <valexey> во-от.
[00:27:29] <valexey> проверил. я прав :-)
[00:27:33] <valexey> MODULE Test;
TYPE
Parent = EXTENSIBLE RECORD END;
ParentPtr = POINTER TO Parent;
ChildPtr1 = POINTER TO RECORD (Parent) a : INTEGER END;
Child = RECORD (Parent) a : INTEGER END;
ChildPtr2 = POINTER TO Child;VAR
VAR
ptr : ParentPtr;
BEGIN
ptr(ChildPtr1).a := 42; (* ok *)
ptr(ChildPtr2).a := 42; (* ok *)
END Test.
[00:27:36] <valexey> Это ББ
[00:27:50] <vlad2> А если guard не указательный?
[00:28:05] <valexey> ptr(Child).a := 42;
[00:28:13] <vlad2> Угу.
[00:28:14] <valexey> error
[00:28:17] <vlad2> ОК
[00:28:31] <valexey> говорит что обезъян быть указателем
[00:28:43] <valexey> я ж говорю - репорт в этом месте не оставляет места для разночтений
[00:31:04] <TRUE> POINTER TO удобнее рассматривать как директиву, а не как составляющую типа. То есть, с ним и или без него - тип один и тот же.
[00:31:54] <valexey> эмм.. нет
[00:32:06] <valexey> тип разный. в частности операция присваивания работает по разному
[00:32:15] <TRUE> и присваивать их значения друг другу можно
[00:32:32] <valexey> в обероне это не так :-)
[00:33:10] <TRUE> POINTER TO добавляет ещё один уровень косвенности при обращении к данным записи, но не более того.
[00:33:45] <valexey> pr1:=pr2; r1:=r2; (* это семантически разные действия *)
[00:34:03] <valexey> в частности в первом случае тушку r2 возмжно соберет мусорщик
[00:34:15] <valexey> а во втором случае происходит копирование полей записей
[00:34:36] <valexey> не путай с js плиз :-) ну и с явой тоже
[00:39:36] <TRUE> проверил - да, не работает.
[00:39:58] <TRUE> но вот это: pr^ := r - логично
[00:40:30] <TRUE> просто pr в куче, а r - в стеке
[00:42:45] <valexey> дык у тебя и слева и справа никакие не указатели а рекорды-значения :-)
[00:42:57] <valexey> (а на стеке они или в куче - вопрос реализации на самом деле :-) )
[00:44:46] <TRUE> да, поэтому я и сказал про поинтер.
[00:46:16] <valexey> дык, ты тут разименовываешь ведь :-) отпили крышечку, и все станет печально. ибо см. репорт.
[10:04:09] <Kemet> %
[10:35:43] <valexey> гы. да. Оберон-07 местами на ФП в плане геморроя с массивами, смахивает.
[10:42:07] <Kemet> Оберон07 же нинужен как ЯП общего назначения, нужно пилить православный Оберон-1 !!!
[10:44:02] <valexey> Просто массив в Обероне-07 окончательно превратился из контейнера в низкоуровневую штуку для построения контейнеров.
[10:44:35] <Kemet> причем статического характера
[10:49:41] <valexey> строительный блок
[10:50:43] <Kemet> неэффективное использование памяти, или городить блочный мемфайл
[10:51:16] <Kemet> где блок - все равно рекорд над массивом
[10:52:19] <valexey> рекорд это ладно
[10:52:31] <valexey> но ведь потом еще операцию приведения типа надо использовать будет
[10:52:42] <valexey> то есть там WITH или еще какой typeguard
[10:53:57] <Kemet> ну да, или тогда чанки одного размера
[10:54:19] <valexey> тэги и ООП на ровном месте :-)
[10:55:13] <valexey> впрочем, это не столь страшно
[10:56:01] <Kemet> но вообще, можно использовать что-то типа StringPool, и элемент типа запись в котором будет индекс и длина
[10:56:23] <Kemet> для кождого эполучаемого элемента
[10:56:23] <valexey> э? пул для массивов?
[10:56:29] <Kemet> ага
[10:56:37] <valexey> ну, то есть по сути, собственный менеджер памяти
[10:57:00] <Kemet> разницы то нет, массив чего - символов или чисел, работа то одинаковая полностью
[10:57:01] <valexey> а пользователю выдавать дескриптор очередного "массива"
[10:57:31] <valexey> А если чел захочет массив каких-то своих рекордов?
[10:57:35] <valexey> или даблов
[10:59:13] <Kemet> опредеяем тип ДИАПОЗОН, а над чем он значения не имеет, понятно, что для символов, челых, рекордов и тп придется свой пул соорудить
[11:00:11] <Kemet> ну те чанк для каждого типа будет свой
[11:00:29] <valexey> угу. на каждый тип - свой пул
[11:00:47] <valexey> таки надо вкрутить сбоку механизм дженериков аля Модула-3
[11:00:53] <valexey> то есть внешней тулзой, не в язык.
[11:01:09] <Kemet> ну механизм может быть один, а детали реализаии да, прдется делать, но думаю не шибко сложно будет
[11:02:55] <Kemet> в принципе если бы оно реально нужно было, можно было бы посидеть, покодить
[11:34:06] <valexey> http://habrahabr.ru/post/191654/
[11:34:08] <valexey> :-D
[16:00:31] <vlad2> Хе-хе. Ну не только ж M$ забивает на поддержку :)
[16:03:02] <vlad2> Гы. Аллахакбар, не иначе ;)
[16:05:29] <TRUE> заклинание приручения джинна.
[16:06:02] <TRUE> при недостаточно сильной воле заклинателя джинн таки вырывается на свободу и начинает мстить.
[16:12:41] <valexey> у меня на маке, кстати все ок.
[16:30:16] <Kemet> valexey: значит у тебя неправильный мак!
[16:30:35] <valexey> OS X 10.7
[16:30:44] <valexey> я ж не псих использовать unstable версию операционки :-)
[16:31:09] <Kemet> вот-вот всего две десятки, а а правильный мак это три икса
[16:31:23] <valexey> :-)
[16:32:51] <TRUE> правильный мак - это тот, от которого колбасит
[16:50:04] <Kemet> valexey: шо за хрень? "Впоследствии компилятор BlackBox был встроен в кросс-платформенную среду программирования Denia, в частности для операционной системы реального времени JBed, полностью написанной на Компонентном Паскале."
[16:54:24] <valexey> это откуда?
[16:54:42] <Kemet> из вики
[16:55:03] <valexey> http://forum.oberoncore.ru/viewtopic.php?f=60&t=3423#p63185
[16:55:49] <valexey> Kemet: кстати, ты скриншотик обещал :-)
[16:58:00] <Kemet> за скринами ехать надо
[16:58:16] <valexey> ага. ну будет оказия - снимите шот
[17:05:12] <Kemet> аха
[20:25:44] <Kemet> да, википедия странная штука, вернее некоторые авторы и типа администраторы и считающие себя таковыми
[20:26:27] <TRUE> википедики?
[20:33:49] <Kemet> ага
[20:33:57] <Kemet> викушники
[23:23:53] <vlad2> А вот как в С++ сделать контейнер некопируемых объектов?
[23:23:58] <vlad2> И чтоб без new ;)
[23:24:15] <vlad2> Объектик маленький, но некопируемый.
[23:24:25] <vlad2> И их много.
[23:27:51] <vlad2> Неужели велосипкедить...
[23:40:57] <vlad2> Блин. Вот нету. Причем объекта может перемещаться (а-ля std::auto_ptr).