[09:04:53] <prospero3000> geniepro> не знаю, что делает process, но в нормальном языке вместо process(lambda x: process2(x)) нужно писать process(process2)
Это вызов процедуры, которая будет вызвана потом, а параметры переданы сейчас. Зачем вы обсуждаете содержимое? Речь шла про форму.
[09:07:49] <prospero3000> О том, что запись не корректна пользователь может узнать только через полгода.
[09:08:13] <prospero3000> И ни pylint, ни mypy тупо не помогут.
[09:46:21] <Kemet> нуу, спаведливости ради .. бойницы на стене в обе стороны местами, местами на китай, местами наоборот. Но там много где потрудились "реставраторы". А трудились они в меру своего понимания
[10:28:20] <Kemet> valexey:
» [18:11:23] <valexey> в обероне довольно дофига динамической типизации так то
Откуда в Обероне динамисеская типизация? Её там нет даже теоретически
[16:58:09] <geniepro> Kemet: полиморфизм наследования и есть динамическая типизация с рантайм-кастами
[16:58:50] <geniepro> prospero3000> Зачем вы обсуждаете содержимое? Речь шла про форму.
Форма ничто, содержание всё!
[17:00:35] <TRUE> это не динамическая типизация
[17:08:42] <geniepro> а что это?
[17:14:12] <Kemet> geniepro, это полиморизм))). к динамической типизации это не имеет никакого отношения
[17:22:21] <geniepro> Kemet: динамическая типизация -- это тоже полиморфизм
[17:34:42] <TRUE> полиморфизм разным бывает
[17:35:09] <TRUE> то есть, не весь полиморфизм - динамическая типизация
[17:41:52] <geniepro> TRUE: думаю, Кемет под динамической типизацией имеет в виду варианты, когда в любую функцию можно запихнуть любое значение, и пусть оно там крутится как хочет.
[17:42:47] <geniepro> но вапще-то в полиморфизме наследования тоже разные значения могут попадать, ограничение лишь в том, что они наследники какого-то базового типа
[17:43:07] <geniepro> разница, конечно, очень сильная, но всё равно это вариант динамической типизации
[17:43:29] <TRUE> да не динамическая она
[17:44:18] <geniepro> а какая? когда ты в рантайме вручную выясняешь, какого типа тебе дали значение -- это не динамическая типизация????
[17:45:08] <TRUE> когда ты в рантайме используешь информацию и метаинформацию, то это не имеет отношения к типизации.
[17:45:22] <TRUE> если ты это делаешь явно, конечно
[17:46:15] <valexey> это как раз динамическая и есть. строгая динамическая типизация
[17:46:19] <TRUE> типизация же относится к переменным, не к значениям?
[17:46:32] <TRUE> к значениям - это преобразование типов?
[17:47:20] <TRUE> тип переменной не меняется после объявления. Это не динамическая типизация
[17:47:24] <valexey> эмм.. чего? чем значение от переменной отличается?
[17:48:18] <valexey> Object o = new MyRect(); // допустим java это
вот тут в `o` может лежать объект вообще любого типа.
[17:48:34] <valexey> а потом мы сделаем апкаст выяснив какого типа оно там лежит
[17:48:38] <TRUE> переменных в рантайме нет. Там только значения. Переменные нужны были на этапе написания кода, чтобы транслятор и линковщик потом могли привязать обращение к данным и адрес в памяти
[17:48:45] <valexey> это динамическая типизация в чистом виде. строгая динамическая
[17:49:08] <valexey> ровно для того же во всяких питонах есть замечательные функции вроде type и isinstance
[17:49:11] <TRUE> o будет всегда типа Object
[17:49:32] <valexey> см. выше строчку кода - там не Object
[17:49:33] <TRUE> переменная всегда с одним типом
[17:50:43] <TRUE> там Object. Если бы значение не было Object, то была бы ошибка компиляции.
[17:51:02] <TRUE> просто из-за наследования у одного и того же значения может быть много типов.
[17:52:03] <valexey> интересно. а что такое динамическая типизация по твоему?
[17:52:30] <TRUE> в одну и ту же переменную можно записывать значения разных типов.
[17:52:49] <valexey> ок. берем erlang -- там в одну и ту же переменную нельзя записывать значения разных типов.
[17:53:03] <valexey> у erlang'a статическая или динамическая типизация?
[17:54:04] <geniepro> TRUE> в одну и ту же переменную можно записывать значения разных типов.
если эти типы не связаны каким-то ограничениями типа общего родительского типа или общего класса типов, то это называется слабая типизация
[17:54:47] <valexey> а если в языке все типы имеют общего предка? :-D
[17:55:03] <valexey> это тотальный ООП же :-)
[17:55:30] <geniepro> TRUE: вот сишечка -- статически типизированный объект, но там можно в любую переменную записать любое значение после каста в (void*) -- но это тоже слабая статическая типизация
[17:55:42] <valexey> ООП изначально, бай дефолт -- для чисто динамической типизации ведь. "всё есть объект" -- как раз означает что значение любого типа можно записать в любую переменную
[17:56:00] <valexey> точнее не так, что можно создать переменную в которую можно записать значение любого типа
[17:56:01] <valexey> вот
[17:56:53] <TRUE> динамическая типизация и преобразование типов - это разные вещи
[17:56:58] <valexey> БГГ
[17:57:02] <geniepro> valexey: если смотреть исторически, то изначальный ООП -- это Симула-67, и я не уверен, что она динамически-типизирована
а вот то, что ты имеешь в виду -- это смоллток, в котором любому объекту можно отправить любое сообщение, и пусть они там разбираются сами как хотят
[17:57:05] <TRUE> (void*) - это преобразование
[17:57:24] <valexey> динамическая типизация это всё целиком про рантайм проверку и преобразование типов
[17:57:37] <geniepro> TRUE: (void*) -- это стирание информации о типе
[17:57:39] <valexey> статическая типизация - это всё целиком про компайл тайм проверку и преобразование типов
[17:57:56] <valexey> компайлтайм проверок и преобразований типов в Обероне почти нет.
[17:57:57] <TRUE> valexey> ООП изначально, бай дефолт
есть два разных ООП. В смолтолке - динамическая типизация
[17:58:08] <TRUE> но там нет понятия наследования и т.д.
[17:58:22] <valexey> есть понятие интерфейса, сколь я помню.
[17:58:59] <geniepro> TRUE> но там нет понятия наследования и т.д.
как это нет наследования? если есть иерархии классов, значит и наследование есть
[18:01:01] <TRUE> динамическая типизация только на автоматическом преобразовании типов. Да и то, они разнесены во времени. Типизация работает на уровне разбора исохдников, а преобразование случается в рантайме.
[18:01:51] <geniepro> прикольно:
Simula часто представляется как респектабельный, но более не существующий предок. В действительности он еще жив и используется небольшим, но восторженным сообществом. Определение языка поддерживается Группой Стандартов Simula (Simula Standards Group). Существуют компиляторы и ПО от нескольких компаний, в основном скандинавских.
[18:02:43] <geniepro> прямо как будто про оберонщиков ))) небольшое, но восторженное сообщество )))
[18:03:11] <TRUE> valexey> компайлтайм проверок и преобразований типов в Обероне почти нет.
а рантайм проверок - и подавно
[18:03:32] <valexey> TRUE: то есть python и js это не чистая динамическая типизация? Ведь типы там приводить приходится. num_str = int(num_str)
[18:03:35] <valexey> например
[18:04:34] <valexey> TRUE: это как это нету? а куда они делись? куда делся Обероновский CASE например, или КПшный WITH?
[18:04:42] <TRUE> geniepro> TRUE> как это нет наследования? если есть иерархии классов, значит и наследование есть
там нет в языке понятия класса. Соответственно, и иерархия там совсем другая, не такая, как в Обероне или си п п
[18:04:43] <valexey> или там IS
[18:06:09] <TRUE> valexey> то есть python и js это не чистая динамическая типизация? Ведь типы там приводить приходится. num_str = int(num_str)
там приходится *правильно* приводить типы. Иначе, получится что-то странное. По крайней мере, в js
[18:06:12] <valexey> python вообще не живет без явного преобразований типов. Вот это выдаст ошибку:
num_int = 123
num_str = "456"
print(num_int+num_str)
[18:06:23] <valexey> без ЯВНОГО преобразование.
[18:06:28] <valexey> *преобразования
[18:06:44] <valexey> ибо строгая динамическая типизация
[18:06:51] <geniepro> TRUE: у тебя какие-то устаревшие сведения о смоллтоке: http://patshaughnessy.net/assets/2012/12/17/metaphysics.png
[18:07:10] <TRUE> valexey> это как это нету? а куда они делись? куда делся Обероновский CASE например, или КПшный WITH?
это ручная работа с метаинформацией. Это делает программист, а не компилятор
[18:07:45] <valexey> а, ну ок. тогда когда в питоне пишем int(num_str) эт тоже ручная работа с метаинформацией.
[18:08:29] <valexey> а когда ты делаешь вызов виртуальной функции и у тебя вызывается функция хз какого типа, а не твоего Object -- это тоже ручная работа с метаинфой?
[18:08:58] <TRUE> это не динамическая типизация
[18:09:18] <valexey> угу, конечно.
[18:09:45] <TRUE> где в определении динамической типизации говорится про вызов виртуальной функции?
[18:10:15] <valexey> это поведение зависящее от типа в рантайме и не определяемое (поведение) в компайл тайме. конечно же это не динамическая типизация, угу.
[18:10:24] <geniepro> https://people.engr.ncsu.edu/efg/517/f05/common/lectures/lectures/lec4.pdf "The Smalltalk class hierarchy"
http://pharo.gforge.inria.fr/PBE1/PBE1ch14.html "Classes and metaclasses"
[18:10:27] <TRUE> valexey> а, ну ок. тогда когда в питоне пишем int(num_str) эт тоже ручная работа с метаинформацией.
это автоматическое преобразование типов
[18:10:47] <valexey> еще раз - тип ты тут узнаешь только в рантайма и тип определит поведение программы.
[18:11:08] <valexey> TRUE: в каком месте это автоматическое преобразование то? я ж тут явно пишу - преобразуй мне в int пожалуйста.
[18:11:14] <TRUE> valexey> это поведение зависящее от типа в рантайме и не определяемое (поведение) в компайл тайме.
это поведение. Относится к значению, а не к переменной.
[18:12:22] <TRUE> valexey> еще раз - тип ты тут узнаешь только в рантайма и тип определит поведение программы.
Нет. Тип известен на этапе компиляции. Зачем, по-твоему нужна таблица виртуальных функций? Именно потому, что на неё пологаются при компиляции
[18:12:55] <geniepro> TRUE> это автоматическое преобразование типов
автоматическое приведение типов -- это когда команда print(123+"456") выдаёт не сообщение об ошибке, а что-то типа "123456" или 579
[18:12:59] <valexey> таблица виртуальных функций это частный случай реализации функциональности. это к разговору отношения не имеет
[18:13:07] <TRUE> valexey> в каком месте это автоматическое преобразование то?
а, я неправильно прочитал. Да, это не то
[18:13:39] <geniepro> TRUE: либо ты нас троллишь, либо ты дилетант и тебе пора учить матчасть
[18:14:35] <TRUE> Когда ты у Object o; вызываешь функции, то ты можешь вызвать только то, что есть в Object. Даже если значение - экземпляр MyRect
[18:15:20] <TRUE> я не троллю, а тебе бы самому почитать определения тех слов, которые ты используешь
[18:15:24] <valexey> TRUE: ок. int(num_str) -- это автоматическое преобразование типов. допустим. а вот SHORT(myLongInt) -- это тогда тоже автоматическое преобразование типов?
[18:15:41] <TRUE> я же сказал, я неправильно прочёл, что ты написал
[18:15:43] <geniepro> valexey> таблица виртуальных функций это частный случай реализации функциональности. это к разговору отношения не имеет
ну да, какой-нить там суперкомпилятор может все эти таблицы вирт. методов заинлайнить в коде, как это делается, в частности, для обычной арифметики в том же хаскелле, например
[18:15:48] <TRUE> это ручное преобразование
[18:16:33] <valexey> geniepro: в плюсах тоже
[18:16:41] <valexey> TRUE: на этом мои полномочия всё.
[18:16:49] <geniepro> TRUE> я не троллю, а тебе бы самому почитать определения тех слов, которые ты используешь
типичный оберонщик, просто хоть кол на голове тиши -- бесполезно
[18:18:13] <TRUE> так ты из своей головы достал определение динамической типизации и назвал Оберон динамически типизированным.
[18:18:28] <TRUE> и ещё ко мне притензии предъявляешь
[19:04:38] <vlad2> prospero3000: какой pylint? Это тупо "synax error", проверь свой копипаст
[19:07:38] <vlad2> prospero3000: про "юзер не узнает" - тоже смешно. Какой юзер? Где твои тесты? Я ж говорю - тебе просто надо часок пообщаться с кем-то, кто знает как его готовить...
[19:46:13] <vlad2> prospero3000: У тебя типичный синдром Блаба: ты точно знаешь как оно должно работать, а оно так не работае. На самом деле оно может работать по-другому. Пытаешься запустить автомобиль по рельсам, хотя тебе всего лишь надо узнать про наличие автодорог в природе...
[19:47:43] <vlad2> Ты можешь и дальше предпочитать ездить на паровозе, но уж если сел за руль автомобиля, то надо ехать по дороге, а не по рельсам.
[19:48:15] <valexey> vlad2: btw я, кажется, тоже не знаю как готовить питон. то есть мелкие скрипты понятно как писать и так далее. но не понятно как большие (100к строк кота) проекты анализировать.
Я привык такие проекты, на тех же плюсах, просто читать и анализировать в IDE. В питоне так тоже прокатывает, но времени на это уходит на порядок больше.
[19:48:32] <valexey> Наверно надо как-то интерактивно в этом ковыряться, чтоли...
[19:50:29] <vlad2> А оно плохо работает на большом. В смысле можно заставить (делают же), но уже с кучей нюансов.
[19:51:31] <valexey> ну вот у меня был опыт такой, и это было больно. При этом, пообщавшись с питонистами (которые до мозга костей), я понял что они думаю ВООБЩЕ иначе. Совсем. Настолько, что нам тяжело понимать друг друга.
[19:51:32] <vlad2> Просперо до 100k далеко еще, как я понимаю. Он там в песочнице мучается.
[19:52:01] <valexey> На уровне песка то питоняшка вполне няшка. Что-нибудь до 1000 строк кода вообще без вопросов.
[19:52:13] <valexey> а потом уже тестами обкладываться начинать.
[19:52:25] <valexey> заворачиваться :-) и медленно ползти к 100к :-)
[19:55:54] <valexey> vlad2: смотри какая штука для плюсов: https://include-what-you-use.org/
[19:56:10] <valexey> и в cmake поддержка есть: https://cmake.org/cmake/help/latest/prop_tgt/LANG_INCLUDE_WHAT_YOU_USE.html
[21:44:57] <vlad2> Давно пора...
[21:55:52] <geniepro> а разве ваша IDE не верещит вам о бесполезных инклудниках, как это делает вижуал студия на с сишарпом? о_О фуууу
[22:30:00] <Kemet> динамическая типизация это когда переменная может менять тип, в обероне тип переменной фиксирован на всем протяжении жизненного цикла
[22:30:05] <Kemet> кам
[22:31:04] <Kemet> касты и прочи5 преобразования к динтиеизации не имеют отноше6ия
[22:33:11] <geniepro> динамическая типизация -- это плоиморфизм языков со слабой системой типов
[22:33:15] <vlad2> Да не меняет она тип, это распространонное заблуждение. И звучит страшно, да. На самом деле в переменную можно положить объекты любых типов. Это полный аналог Object или void*.
[22:34:05] <vlad2> У тебя в обероне "VAR p: POINTER TO Object" не меняет тип.
[22:34:51] <vlad2> Но может использоваться для работы с объектами любого типа.
[22:35:54] <Kemet> нет в обероне в пер5менную низяположить объекты разных типов
[22:36:12] <vlad2> Я тебе пример привел выше :)
[22:36:26] <geniepro> https://habr.com/post/161205/
[22:36:35] <Kemet> ткм вс5гда будет обжект
[22:36:59] <vlad2> Ну да. Любого типа.
[22:37:00] <geniepro> все споры из-за разных точек зрения
[22:37:34] <vlad2> Можно и INTEGER обернуть и запихать.
[22:40:56] <Kemet> ты можешь положить толь4о потому что это ресширенный обже4т то есть тип тот ж5 самый. Производны5 типы в обероне рксширяют тип а не наследуют
[22:42:55] <geniepro> Kemet: в чём отличие расширения типа от наследования типа?
[22:45:27] <Kemet> в идеологии)) которая обусловлена устройвтвом расширяемых записей
[22:50:03] <vlad2> Ну вот, вся "динамика" динамических языков только в том, что все переменные это вот такие "POINTER TO Object", которые не надо кастать каждый разу к нужному типу, чтобы умилостивить компилятор. Все. Никакой магии.
[22:51:09] <geniepro> Kemet: значит вместо технологии у вас там на самом деле идеология? ясно, так и запишем
[22:54:53] <Kemet> а что касается приведенного Владом примера, так если есть тип фрукты, его можно расширить до яблок и груш например, и если у тебя есть переменная типа яблоко, то ты туда не можешь положить грушу, это и есть статическая типизация, а в динтипизации ты можешь положить что угодно и тип переменной изменится
[22:55:06] <vlad2> Как только у тебя в обероне появляется такой вот "POINTER TO Object", то у тебя начинаются те же самые проблемы, что и у динамических языков, а статическая типизация тебе никак не помогает, только мешает. Ну может чуть раньше упадает на явном касте к неожиданному типу, но вообще непринципиально.
[22:59:42] <vlad2> Kemet: да, пока есть какая-то классификация (фрукты), то польза от статической типизации остается.
[23:04:23] <geniepro> Kemet: компилируется!!!
MODULE test;
TYPE
PFruit = POINTER TO Fruit; Fruit = RECORD END;
PApple = POINTER TO Apple; Apple = RECORD(Fruit) END;
PPear = POINTER TO Pear; Pear = RECORD(Fruit) END;
VAR fruit: PFruit;
apple: PApple;
pear : PPear;
BEGIN
fruit := apple;
pear := fruit(PPear);
END test.
[23:12:55] <Kemet> geniepro, а не должно? Ты ссылочную переменную базового типа - супертипа, приводишь к расширенному. На этапе компиляции экзе пляр ссылочного типа не создан, расш ренный тип будет проверен на этапе выполнения, да. Это хороший баланс - статическаяая типизация и проверки ссылочных типов в рантайме
[23:13:32] <geniepro> Kemet: ну ты же заявил, что яблоко в грушу не положишь, а я взял и положил!!! мухаха!
[23:13:56] <Kemet> Если бы ко пиля ор был поумней он бы ударил по рукам
[23:14:21] <geniepro> Kemet: а разве должен? разве рапортом на язык такое запрещено?
[23:14:25] <Kemet> Ты не положил
[23:15:08] <vlad2> Это как раз "те же самые проблемы" про которые я говорил - т.е. ошибка в рантайме.
[23:15:11] <Kemet> geniepro, да, фрут э о супертип
[23:15:47] <vlad2> И решаются они теми же самыми способами - тестами.
[23:18:42] <Kemet> Статическая типизация определяет и миним з рует критические точки и количество всяких проблем сулественно сн жается
[23:20:13] <vlad2> Это зависит от ситуации. Как я говорил, в какой-то момент она может тупо мешать.
[23:21:40] <Kemet> Там где ты испол.зуешь супертип обрати внимание, зачем он тебе. В обероне была пробле а с with ко орый использовалс для полиморфизма но в текущем варианте он заменен на case а в обертнах где есть методы проблема суперт па вообще минимиз руется - зачем пр водить, исполтзуй метод
[23:22:36] <vlad2> Например, если ты пишешь библиотеку контейнеров/алгоритмов, то у тебя там нет "фруктов", у тебя везде ходят эти дурацкие POINTER TO Object. И чистая динамика + тесты окажется намного проще/надежнее, чем мильен кастов на каждый чих.
[23:23:56] <Kemet> Ж
[23:24:06] <Kemet> Касты вред
[23:27:40] <Kemet> [geniepro 03:09]
» Kemet: а разве должен? разве рапортом на язык такое запрещено?
---
Когда ты apple поместил в fruit, то у. Ебя нет яблока, есть только фрукт и именно его — супертип ' ты пы аешься к нуть в пере енную типа груша, ко орая, несомненно, оже фрукт
[23:28:50] <geniepro> Kemet: ну и какая разница? я же поместил содержимое яблока в грушу
[23:30:43] <Kemet> geniepro, нет, ты попытался поместить некий фрукт в корзину с грушей
[23:30:45] <geniepro> vlad2: а чо твой компилер ругается на строку
TYPE
PFruit = POINTER TO Fruit; Fruit = RECORD WhoAmI: PROCEDURE; END;
line 5: END expected (MODULE)
?