[03:09:48] <vlad2> Это непростое виртуальное наследование...
[03:10:00] <vlad2> Крэшится, сволочь.
[03:10:14] <vlad2> ХЗ почему.
[03:15:10] <vlad2> Похоже на багу компилятора. В релизе работает. В дебаге ерэшится.
[03:17:15] <vlad2> Угу. Перекомпиляция помогла.
[09:16:20] <vlad3> Домучил Дейкстру: http://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123-2.html
[09:17:53] <vlad3> Чувствуется рука математика. Простые вещи непростыми словами.
[09:19:13] <vlad3> Ничего нового не узнал. Из примитивов рассмотрен только "семафор".
[09:21:04] <vlad3> Код мясной. "Доказывается" с помощью картинок (тоже нетривиальных).
[09:21:25] <vlad3> Вобщем разочарование...
[09:23:53] <vlad3> Впрочем я вполне допускаю, что кому-то так понятнее.
[14:10:58] <TRUE> <vlad3> Чувствуется рука математика. Простые вещи непростыми словами.

он физик
[14:13:36] <valexey> причем теоретик вроде бы
[15:55:04] <valexey> vlad2: слушай, а может тупо все модули (да и вообще имена сущностей) в Обероне при трансляции в js предварять тупо подчеркиванием? То есть MODULE Math -> _Matt()
[17:49:16] <valexey> гм. вероятно будет blackboxframework.org <http://blackboxframework.org>
[17:49:38] <valexey> если договорятся конечно
[20:07:52] <vlad2> valexey: зачем подчеркивание?
[20:09:01] <vаlexey> vlad2: чтобы коллизий не было
[20:09:19] <vаlexey> ну, то есть с глобальными объектами жабаскриптовыми
[20:09:31] <vаlexey> с Processing, Math и так далее
[20:09:37] <vаlexey> Эдакий манглинг лайт.
[20:09:49] <vlad2> Да нет коллизий. Точнее есть только с Math, потому что оно в генерируемый код вставляется.
[20:10:47] <vlad2> Причем я думал даже не коверкать Math в общем случае, а когда локальная переменная такая есть, то генерить RTL$.global().Math.
[20:11:23] <vlad2> Но просто заэскейпить Math проще - поэтому так и сделал.
[20:11:34] <vаlexey> А где там Math используется?
[20:11:42] <vlad2> ABS
[20:11:54] <vlad2> И еще где-то.
[20:11:56] <vаlexey> а-а.
[20:12:01] <vаlexey> всякие флоры и проч
[20:12:07] <vаlexey> встроенные функции
[20:12:22] <vlad2> Или можно было сделать RTL$.abs() - тоже без проблем.
[20:12:39] <vаlexey> угу
[20:12:39] <vlad2> Да, это актуально только для встроенных функций.
[20:12:57] <vlad2> (которые inline)
[20:14:19] <vаlexey> я ведь правильно помню, что из функции возвращать можно только либо указатель либо примитивный тип?
[20:14:54] <vlad2> Все остальные коллизии возникают только при использовании JS и их можно легко обойти как раз за счет того, что точно знаешь, что имена транслоируются 1:1
[20:15:18] <vаlexey> угу. ок. не будем плодить исключений
[20:15:18] <vlad2> Да. Вирт говорит "скаляр" не раскрывая этот термин.
[20:15:23] <vаlexey> и неочевидностей
[20:16:15] <vlad2> Судя по контексту "не скаляр" - это реккодр и массив.
[20:16:21] <vlad2> Все остальное скаляр.
[20:16:52] <vlad2> Там, кстати, не помню говорил или нет - у него есть ограничение, что экспортить можно только скаляры.
[20:16:55] <vlad2> Не понимаю зачем.
[20:17:18] <vlad2> В смысле поинтер можно экспоритить, а рекорд нет. В чем профит?
[20:17:23] <vаlexey> не, там так: The result type of a procedure can be neither a record nor an array.
[20:17:34] <vаlexey> Это я про ретурны.
[20:18:04] <vlad2> А. Ну значит он непоследователен. Лучше бы раскрыл понятие скаляра и использовал его.
[20:18:06] <vаlexey> Причем экспортить только на чтение.
[20:18:37] <vlad2> Да. На чтение можно понять почему. Но почему нельзя рекорд или массив???
[20:18:51] <vаlexey> Ну, почему он запрещает структурные типы к возврату через RETURN, в общем то понятно.
[20:19:22] <vаlexey> А почему экспорт запрещен - пока мне не ясно.
[20:19:29] <vlad2> Да, понятно. А экспорт?
[20:20:04] <vlad2> Я могу предположить только, что у него там какие-то особенности реализации модулей, что "размер имеет значение".
[20:20:31] <vlad2> Типа размер какой-то секции напрямую зависит от размера эксопртированных переменный.
[20:20:37] <vlad2> переменных
[20:20:51] <vаlexey> точнее, быть может, помещабельность в регистр (как и в случае ретурнов) имеет значение
[20:22:24] <TRUE> инициализация
[20:22:45] <vаlexey> а что инициализация?
[20:22:48] <vаlexey> и там и там мусор по умолчанию
[20:25:45] <vаlexey> вообще не понятно, указатель входит в понятие скалярного типа: или нет?
[20:27:32] <TRUE> точнее, присвоение значения (и инициализация как частный случай). У меня ощущение, что структуру по указателю проще держать в непротиворечивом состоянии.
[20:27:48] <TRUE> я бы не назвал указатель отдельным типом.
[20:28:12] <vаlexey> ну класс типов. без разницы
[20:29:09] <vаlexey> короче, нужно узнать мнение вирта (хотя бы из его же книжек) что такое скаляр
[20:31:02] <TRUE> не класс типов.
[20:32:30] <TRUE> это указание компилятору. Относительно данных определённого типа. Например, чтобы эти данные хранились в куче.
[20:33:30] <TRUE> то есть, смысл указателя следует из его названия. Это не тип данных, а способ обратиться к данным.
[20:47:24] <vаlexey> круто! то есть у нас могут быть переменные не имеющие типа? :-)
[20:49:47] <TRUE> нет. Как?
[20:50:11] <vаlexey> VAR a : POINTER TO FooBar;
[20:50:23] <TRUE> FooBar
[20:50:24] <vаlexey> a - переменная, очевидно, не имеющая типа :-)
[20:50:30] <TRUE> тип - FooBar;
[20:50:57] <vаlexey> Нет, a не является типом FooBar :-) это же легко проверяется - множество операций над a и над b : FooBar различно
[20:51:25] <vаlexey> И вообще, если уж на то пошло, то Тип - это всего лишь то же самое указание (директива, да) компилятору
[20:51:32] <vаlexey> Во время исполнения нет никаких типов.
[20:52:21] <TRUE> тип данных - это пространство данных и операции над ним. POINTER TO не добавляет ничего ни к пространству, ни к операциям.
[20:53:10] <TRUE> просто POINTER TO хранится в куче, а остальное - на  стеке
[20:54:34] <vаlexey> очевидно добавляет и изменяет.
[20:55:01] <vаlexey> для нчала операция присваивания (assignment) для 'a' совершенно иная нежели для 'b'
[20:55:17] <vаlexey> короче, сходи, репорт прочитай :-)
[20:55:49] <TRUE> да я читал этот момент
[20:56:25] <TRUE> и своё мнение относительно этого момента я тоже сказал
[20:57:01] <vаlexey> кроме того, Вирт в репорте оперирует понятием "Pointer types" - это отдельный класс типов, на равне с другими классами типов такими как: Procedure types, Record types, Array types, Basic types.
[20:59:00] <vаlexey> Record types + Array types = Structured Types
[20:59:21] <vаlexey> То есть, методом исключения, выходит что Scalar types = Pointer types + Basic types
[20:59:34] <TRUE> типы данных одинаковые, а места хранения разные, вот из-за нюансов хранилищ и имеют место различия в синтаксисе. Но с точки зрения типов - всё прозрачно. Должно быть.
[20:59:35] <vаlexey> Иначе не имело бы смысла писать Scalar types вместо Basic types
[20:59:59] <TRUE> я уже читал этот момент в сообщении, ты зря его сюда пишешь
[21:00:29] <vаlexey> Я не его пишу. Я делаю выводы.
[21:00:42] <vаlexey> Чтобы выяснить что такое scalar types
[21:00:45] <TRUE> Значит, у меня несколько иное видение типов данных, чем у Вирта.
[21:00:58] <vаlexey> угу
[21:01:23] <TRUE> <TRUE> типы данных одинаковые, а места хранения разные, вот из-за нюансов хранилищ и имеют место различия в синтаксисе. Но с точки зрения типов - всё прозрачно. Должно быть.
[21:01:46] <TRUE> с точки зрения математики скалярные типы чем характерны?
[21:02:27] <vаlexey> с точки зрения математики они ничем не характерны :-)
[21:02:34] <vаlexey> они характерны с точки зрения инженерии
[21:03:22] <TRUE> коммутативность и ассоциативность
[21:03:37] <TRUE> с векторами такое не работает
[21:04:13] <vаlexey> над какой операцией?
[21:04:24] <vаlexey> деления?
[21:05:06] <vаlexey> или там операции для CHAR'a например (сколь я помню, там есть присваивание и все)
[21:06:06] <TRUE> а какая есть для векторов?
[21:06:24] <vаlexey> а что такое вектор?
[21:06:37] <TRUE> ну ладно, для нескалярных
[21:06:58] <TRUE> для чара есть встроенные функции
[21:07:08] <vаlexey> то же что и для чара - присваивание.
[21:07:17] <vаlexey> для тех тоже есть встроенные функции
[21:07:22] <vаlexey> тот же LEN например
[21:16:35] <vаlexey> vlad2: я понял!
[21:16:55] <vаlexey> с точки зрения Вирта, скалярный тип (в данном случае), это тип размер которого известен БЕЗ компиляции.
[21:17:10] <vаlexey> Поэтому и запрещено экспортировать не скалярные типы
[21:17:25] <vаlexey> Этим вирт добивается независимой компиляции модулей
[21:17:36] <vаlexey> То есть компилировать их ты можешь в ЛЮБОМ порядке.
[21:18:42] <vаlexey> хотя странно что при этом он разрешил вообще типы экспортировать из модуля :-)
[21:18:57] <vаlexey> ну, то есть не скалярного типа :-)
[21:19:29] <vаlexey> вероятно что есть еще какой-то нюанс которого я пока не понимаю
[21:19:55] <vlad2> Не. Не понял. Мне чтоб импортировать переменную все равно нужно знать ее тип.
[21:20:28] <vlad2> Толку от того, что я знаю, что все импортируемые переменные по 4 байта размером.
[21:21:28] <vаlexey> дык, можешь их присваивать очевидным способом :-)
[21:22:30] <vаlexey> О! Понял! Вирт, возможно таким образом разрешил противоречие - что если переменная экспортирована, а её тип - нет? :-)
[21:22:54] <vаlexey> ну, то есть TYPE Foo = RECORD END; VAR Bar* : Foo;
[21:22:56] <vаlexey> и что тогда?
[21:23:32] <vаlexey> Блин, но это получается, что Scalar types == Basic types
[21:23:39] <vlad2> Ошибка компиляции.
[21:23:47] <vlad2> Что ты будешь делать с такой переменной?
[21:24:09] <vаlexey> Да, вот фиг знает
[21:24:33] <vаlexey> Но если это указательный тип Foo, то могу попробовать сделать NEW
[21:24:36] <vаlexey> О!
[21:24:39] <vаlexey> Еще понял.
[21:25:05] <vаlexey> Он это сделал чтобы нельзя было передать структурный тип в функцию как VAR-параметр, где эту переменную изменят.
[21:27:37] <vlad2> Это и так чекается.
[21:27:54] <vаlexey> в репорте чекается? где?
[21:28:15] <vlad2> В репорте сказано, что пемеренные экспортируются только для чтения.
[21:28:27] <vаlexey> хотя, это также позволяет обойти и защиту экспортируемой переменной скалярного типа
[21:28:30] <vlad2> Это аналог не-VAR параметра.
[21:28:44] <vаlexey> val?
[21:28:48] <vlad2> не-VAR параметр не может быть передан ниже как VAR параметр
[21:28:57] <vlad2> (и это чекается)
[21:29:06] <vlad2> А в репорте конечно нихрена не сказано.
[21:29:37] <vаlexey> стоп. а почему собственно?
[21:30:03] <vlad2> Что?
[21:31:16] <vаlexey> If the parameter is a value parameter, the corresponding actual parameter must be an expression. This expression is
evaluated prior to the procedure activation, and the resulting value is assigned to the formal
parameter which now constitutes a local variable.
[21:31:31] <vаlexey> Итак, VAL-параметр становится локальной ПЕРЕМЕННОЙ (VAR'ом)
[21:31:48] <vаlexey> In the case of variable parameters, the actual parameter must be a designator denoting a variable
[21:32:07] <vаlexey> Таким образом, VAL-параметры можно засовывать в VAR-аргументы другой функции.
[21:32:08] <vlad2> А. Тем хуже.
[21:32:21] <vlad2> Это не работает для рекордов.
[21:32:49] <vаlexey> Э? А где про это сказано?
[21:32:59] <vlad2> Т.е. если предположить, что я сначала передаю рекорд по ссылке, а потом создаю его копию и передаю дальше как VAR - получится херня.
[21:33:31] <vlad2> Я бы сказал, что не-VAR параметры всегда read only и все тутю.
[21:33:34] <vlad2> Так проще.
[21:33:47] <vlad2> А использовать аргументы как переменные - все равно плохая праткика,
[21:34:17] <vаlexey> ну, практика может и плохая, но таков репорт :-)
[21:35:05] <vаlexey> гм. если ты передаешь рекорд по ссылке (как VAL - нюанс реализации такой), то дальше тебе ничто не мешает отдать его уже как VAR - банально через тот же механизм
[21:35:07] <vlad2> Репорт уточнить:."which now constitutes a read-only local variable"
[21:35:24] <vаlexey> но да, херня
[21:35:29] <vаlexey> ибо у результате обход защиты
[21:35:38] <vlad2> Угу.
[21:35:49] <vаlexey> причем зависящий от реализации
[21:35:53] <vаlexey> натуральный UB
[21:35:59] <vlad2> Угу.
[21:36:11] <vаlexey> блин
[21:36:24] <vаlexey> но я вроде помню что-то было же в репорте про аргументы, VARы и структурные типы
[21:37:41] <vаlexey> Во!
[21:37:49] <vаlexey> A variable parameter corresponds to an actual parameter that is a variable, and it stands for that variable. A
value parameter corresponds to an actual parameter that is an expression, and it stands for its
value, which cannot be changed by assignment. However, if a value parameter is of a scalar type, it
represents a local variable to which the value of the actual expression is initially assigned.
[21:38:02] <vlad2> Если посмотришь в текущем компиляторе - все чекается :) Кроме того, что скаляры таки можно переприсваивать. Но я думаю это надо починить в сторону тотального read-only.
[21:38:32] <vlad2> А. Ну ладно. Не буду фиксить.
[21:38:58] <vlad2> Хотя нафига такое и исключение - не понимаю. Таки вирт люит использовать аргументы как переменные?
[21:39:07] <vаlexey> да
[21:39:21] <vlad2> некошерно
[21:39:27] <vlad2> моветон
[21:40:22] <vаlexey> Зато позволяет оптимизировать ручками, не наворачивая мозг компилятору :-)
[21:40:28] <vlad2> Возвращаяс к экспорт нескаляров - по прежнему смысла нет.
[21:41:12] <vаlexey> До кучи тут походу еще и в репорте противоречие. Эхъ...
[21:41:46] <vаlexey> Хотя, нет. Гы. Дырка как была так и осталась.
[21:42:10] <vаlexey> Написано лишь что VAL-параметр не может быть изменен лишь через ASSIGNMENT (:=)
[21:42:31] <vаlexey> А вот передать его как VAR-аргумент третьей функции - можно легко
[21:42:38] <vаlexey> И вот там то она с ним сделает что хочет!
[21:42:42] <vаlexey> Хо-хо-хо!
[21:43:07] <vаlexey> Ибо она то понятия не имеет что эта за переменная и откуда оно взялось.
[21:43:48] <vаlexey> Чот какой-то маразм тут у Вирта IMHO. Не даром он эту часть регулярно меняет в репорте.
[21:47:14] <vаlexey> чот мне начинает казаться, что без уточнения репорта, точнее без уточненного репорта, дальше двигаться будет уже трудно.
[21:47:41] <vаlexey> то есть фиг с ними, с расширениями, но уточненная ревизия репорта, книга толкований, нужна.