tag:blogger.com,1999:blog-654279083390275842.post2926648965443394160..comments2024-03-19T12:22:43.654+03:00Comments on Размышлизмы eao197: [prog.flame] Ceylon, Kotlin и теперь вот Xtend – кто-нибудь выживет?eao197http://www.blogger.com/profile/17283739752119445290noreply@blogger.comBlogger30125tag:blogger.com,1999:blog-654279083390275842.post-61188559224168432562011-11-09T12:36:24.061+03:002011-11-09T12:36:24.061+03:00@имя:
Попытался поиграться с Хаскелевым вариантом...@имя:<br /><br />Попытался поиграться с Хаскелевым вариантом. Поскольку Хаскеля я не знаю, то сломать его так просто не удается. Похоже, он работает за счет фокуса с выводом типов для main'. Там получается что в варианте с n!=0 аргументы для нового вызова main' должны быть одинакового типа. Что возможно только, если они конструируются одинаковым способом (т.е. либо Cons(_ Nil), либо Cons(_ a)). Если конструировать их по-разному, то Haskell считает, что у агументов as и bs типы получаются разными. Потому и ошибка компиляции.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-24839754827924174372011-11-08T17:10:53.306+03:002011-11-08T17:10:53.306+03:00@имя:
>пусть написана целая ява-библиотека при...@имя:<br /><br /><i>>пусть написана целая ява-библиотека примерно в таком стиле для парсинга в стиле boost::spirit<br /><br />подозреваю, что ты от нее откажешься, как и от плюсовой</i><br /><br />Намного важнее, что ее не будут использовать миллионы других Java программистов ;)<br />Ведь феномен Java как раз еще и в хорошей инертности пользователей этого языка.<br /><br /><i>но все же надо признать, что дженерики выглядят более управляемо, чем шаблоны</i><br /><br />Честно скажу, что Java-вские дженерики никогда не мог вкурить. После беглого взгляда на C#-ные дженерики я понял больше, чем от тчательного выкуривания мануала по дженерикам Java. Правда давно это было. Году в 2004.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-4472174165549025982011-11-08T17:07:38.081+03:002011-11-08T17:07:38.081+03:00@имя:
>ну вот, пришел поручик ржевский и все о...@имя:<br /><br /><i>>ну вот, пришел поручик ржевский и все опошлил :-)</i><br /><br />Ну а то! :)<br />Там изначально было видно, что заявленные цели не достигаются. Только у меня C#-компилятора нет. А на Java сразу стало возможно было проверить.<br /><br /><i>>этот код написан, кстати, по мотивам хаскеля, а в хаскеле нет null-а -- но зато там есть жопа _|_ так что надо подумать, не поломает ли она всю конструкцию там</i><br /><br />Я думаю, что и с Хаскелем там не все однозначно. Срача там на пять страниц, читать все влом. Но, надеюсь, и в Хаскелевом варианте должны были найти грабли. Поскольку я не представляю себе как на уровне системы типов с заранее неизвестным n доказать, что A[n] != A[m]. Где m так же неизвестна на этапе компиляции.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-5040372120842408382011-11-08T14:10:40.032+03:002011-11-08T14:10:40.032+03:00null, кстати, должен рассматриваться именно как об...null, кстати, должен рассматриваться именно как объект класса, производного по отношению ко всем классам явыимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-75083291237526874352011-11-08T14:03:00.686+03:002011-11-08T14:03:00.686+03:00> Возможна, но до плюсовых высот ей далеко ;)
...> Возможна, но до плюсовых высот ей далеко ;)<br /><br />пусть написана целая ява-библиотека примерно в таком стиле для парсинга в стиле boost::spirit<br /><br />подозреваю, что ты от нее откажешься, как и от плюсовой<br /><br />но все же надо признать, что дженерики выглядят более управляемо, чем шаблоныимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-49488171759498202232011-11-08T14:01:49.691+03:002011-11-08T14:01:49.691+03:00ну вот, пришел поручик ржевский и все опошлил :-)
...ну вот, пришел поручик ржевский и все опошлил :-)<br /><br />этот код написан, кстати, по мотивам хаскеля, а в хаскеле нет null-а -- но зато там есть жопа _|_ так что надо подумать, не поломает ли она всю конструкцию тамимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-32825894963687933312011-11-08T13:35:13.800+03:002011-11-08T13:35:13.800+03:00@имя:
>да, напоминаю -- я тут доказываю, что в...@имя:<br /><br /><i>>да, напоминаю -- я тут доказываю, что в жабке акробатика с дженериками вполне возможна и вполне может манить к себе как способ достить вроде как благородной цели :-)</i><br /><br />Возможна, но до плюсовых высот ей далеко ;)<br /><br />Возвращаясь к обсуждавшимся на LOR-е примерам. Херня это все, а не гарантии со стороны компилятора. Например, меняем закомментированную строку на<br /><br />return _main(n-1, i+1, new Cons<A>(0, null), new Cons<A>(i*i, second));<br /><br />И получаем удачную компиляцию.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-53379753324176448582011-11-08T13:17:42.467+03:002011-11-08T13:17:42.467+03:00да, напоминаю -- я тут доказываю, что в жабке акро...да, напоминаю -- я тут доказываю, что в жабке акробатика с дженериками вполне возможна и вполне может манить к себе как способ достить вроде как благородной цели :-)имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-91414266863943709862011-11-08T13:15:35.671+03:002011-11-08T13:15:35.671+03:00вот на жабке http://www.linux.org.ru/forum/develop...вот на жабке <a href="http://www.linux.org.ru/forum/development/4300872?cid=4305706" rel="nofollow">http://www.linux.org.ru/forum/development/4300872?cid=4305706</a><br /><br />сам компилятор гарантии не дает, а вот акробатика похоже дает<br /><br />т.е. если не менять код ScalarProduct, Cons и Nil (и не делать от них производных классов), то компилятор будет бить по рукам (см. например закоменченную строку, где пытаются сделать разную длину)<br /><br />если делать производные классы, то мне кажется можно поломать, но х.з.; в жабке нет нужного модификатораимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-37318286458535848732011-11-08T12:54:45.131+03:002011-11-08T12:54:45.131+03:00@имя:
>конечно же неизвестна (и более того -- ...@имя:<br /><br /><i>>конечно же неизвестна (и более того -- лучше всего, чтобы читалась из stdin), иначе задача просто решается на с++</i><br /><br />Тогда я не понимаю, как это гарантируется в упоминавшихся примерах на Haskell и на C# (фиг с ним, с Haskell-ем, я его не знаю), но в C# откуда гарантии компилятора?eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-5264253330323044292011-11-08T12:05:31.257+03:002011-11-08T12:05:31.257+03:00> Мне это не очень нравится тем, что глядя на и...> Мне это не очень нравится тем, что глядя на исходный прикладной код можно не видеть важных деталей работы программы. Которые как раз будут скрыты в коде, который работает через рефлексию.<br /><br />да<br /><br />например, если у нас что-то зависит от *названия* метода (которое доступно через рефлексию), то при невинном его переименовании мы можем нафиг порушить программу<br /><br />но если через рефлексию спрашивать только "есть ли у метода аннотации? и какие?", то вроде как все хорошоимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-31467643028772132112011-11-08T12:01:20.108+03:002011-11-08T12:01:20.108+03:00насчет равных длин векторов я оказывается недодал ...насчет равных длин векторов я оказывается недодал еще одну ссылку:<br /><br />http://www.linux.org.ru/forum/development/4300872<br /><br />> Есть два вектора, длина которых на этапе компиляции не известна.<br /><br />конечно же неизвестна (и более того -- лучше всего, чтобы читалась из stdin), иначе задача просто решается на с++имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-90302086894184465212011-11-08T11:52:43.598+03:002011-11-08T11:52:43.598+03:00@имя:
>понятно, что если рефлексия была бы там...@имя:<br /><br /><i>>понятно, что если рефлексия была бы там обернута еще в какие-то промежуточные слои абстракции, придуманные программистом, то я бы побоялся, но мы вроде говорим о рефлексии в чистом виде</i><br /><br />Не совсем. Как раз на практике рефлексию используют для того, чтобы ввести некий уровень абстракции, который другими средствами не получается.<br /><br />Мне это не очень нравится тем, что глядя на исходный прикладной код можно не видеть важных деталей работы программы. Которые как раз будут скрыты в коде, который работает через рефлексию.<br /><br />Но как подход, когда других механизмов в языке нет, он вполне жизнеспособен. Тем более, что за время существования Java уже выработались, полагаю, некоторые best practicies для использования рефлексии.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-75872606175255088852011-11-08T11:48:35.124+03:002011-11-08T11:48:35.124+03:00@имя:
Правильно ли я понимаю вот это:
нам нужно ...@имя:<br /><br />Правильно ли я понимаю вот это:<br /><br /><i>нам нужно статически гарантировать, что два вектора имеют ОДИНАКОВУЮ длину</i><br /><br />Есть два вектора, длина которых на этапе компиляции не известна. Нужно через систему типов гарантировать, что их длина одинакова.<br /><br />Или же длина векторов на этапе компиляции известна?eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-27129859341574569832011-11-08T11:42:58.012+03:002011-11-08T11:42:58.012+03:00тема насчет векторов равной длины достаточно больш...тема насчет векторов равной длины достаточно большая и интересная, и я подозреваю, что ты выкатишь свое решение (а может и не одно)<br /><br />а здесь я предлагаю дообсудить ограничение программистов... ну и насчет явы -- по-моему, аннотации + рефлексия, но без байткода отличный способ расширения языка -- отличный по твоему критерию "разные программисты сделают это одинаково и без извращений"имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-86394484706403815302011-11-08T11:26:47.288+03:002011-11-08T11:26:47.288+03:00я неточно выразился;
"покопаться в кишках&qu...я неточно выразился;<br /><br />"покопаться в кишках" тут означает "быстро *самому* пофиксить обнаруженный баг или хотя бы быстро самому сделать workaround"<br /><br />понятно, что если рефлексия была бы там обернута еще в какие-то промежуточные слои абстракции, придуманные программистом, то я бы побоялся, но мы вроде говорим о рефлексии в чистом видеимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-44819730697098703292011-11-08T11:21:18.976+03:002011-11-08T11:21:18.976+03:00> А еще в Java можно извращаться с анотациями. ...> А еще в Java можно извращаться с анотациями. И с рефлекшеном. И даже с манипуляциями над байт-кодом<br /><br />мне че-то не известны примеры именно извращений<br /><br />т.е. к рефлексии есть у меня претензии -- она не статическая<br /><br />но с точки зрения "вот кто-то наваял некое расширение явы как языка, используя рефлексию и аннотаци; как ты, не побоишься покопаться в кишках этого расширения?" -- я бы скорее всего не побоялся<br /><br />т.к. рефлексия -- это как раз прямой доступ к полям, и там извращения/акробатика *в принципе*, похоже, невозможна; вот с аннотациями я уже так уверенно не скажу, а байткод... байткод вообще вещь по-моему сложная, я бы поэтому его побоялся, но относить к акробатике все равно не стал былимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-24395575244684397722011-11-08T11:12:26.226+03:002011-11-08T11:12:26.226+03:00если бы в убогом блогстоппере был кат, то я бы спр...если бы в убогом блогстоппере был кат, то я бы спрятал это под кат, а так уж извините -- использую что естьимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-23075640533383371992011-11-08T11:10:19.198+03:002011-11-08T11:10:19.198+03:00> Куча строк с двоеточиями в начале, которые не...> Куча строк с двоеточиями в начале, которые не несут никакого смысла.<br /><br />ыыы!<br /><br />смысл их в том, чтобы сразу не было видно то, что написано в конце -- т.е. если кому вдруг захотелось самому подумать, а не читать подсказку, то он не пролистывает страницы, а останавливается, а кто хочет читать подсказку -- листает страницы<br /><br />это и называется спойлеримяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-32019919181768944432011-11-08T11:05:25.406+03:002011-11-08T11:05:25.406+03:00нам нужно статически гарантировать, что два вектор...нам нужно статически гарантировать, что два вектора имеют ОДИНАКОВУЮ длину<br /><br />понятно, что некоторые случаи, когда они и правда имеют одинаковую длину, будут системой типов не пропускаться, но обязательно, чтобы система типов *всегда* ловила случаи разной длины<br /><br />начало этого всего вот здесь http://www.linux.org.ru/news/opensource/4276462?cid=4295720 (правда там разговор идет в основном про зависимые типы)имяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-11042037735182266322011-11-08T10:59:21.529+03:002011-11-08T10:59:21.529+03:00@имя:
За комментарий со спойлером вообще руки отр...@имя:<br /><br />За комментарий со спойлером вообще руки отрывать нужно. Куча строк с двоеточиями в начале, которые не несут никакого смысла.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-84330394051067237832011-11-08T10:44:23.004+03:002011-11-08T10:44:23.004+03:00блогспот сожрал < Type2 > и < Type4 > ...блогспот сожрал < Type2 > и < Type4 > в спойлере из-за угловых скобочек, а я это не заметил; переписывать спойлер мне лень, так что пусть так и будетимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-80979802749776282872011-11-08T10:42:30.341+03:002011-11-08T10:42:30.341+03:00@имя:
>кстати, компилятор с++ такого не знает,...@имя:<br /><br /><i>>кстати, компилятор с++ такого не знает, почему и повторение такого шаблона на плюсах не получается; чтобы обучить компилятор с++ такому, требуется потрудиться</i><br /><br />Что-то я не могу понять _условие исходно задачи_ из указанного C#-ного кода. Есть впечатление, что на C++ все это без проблем выражается, разве что чуть иначе.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-11806413207542136682011-11-08T10:41:08.568+03:002011-11-08T10:41:08.568+03:00@имя:
>дженерики в яве дают прекрасную возможн...@имя:<br /><br /><i>>дженерики в яве дают прекрасную возможность "самовыражения", точнее, мутной акробатики (трудно понимаемой другими)</i><br /><br />А еще в Java можно извращаться с анотациями. И с рефлекшеном. И даже с манипуляциями над байт-кодом (чем, вроде, всякие AspectJ и занимаются). Так что путей запутать разработчика в Jave всегда было достаточно.<br /><br />Дело, вероятно, в другом. Java все-таки достаточно нишевая штука. Сильно прижившаяся в разного рода энтерпрайзе, где не требуется больших возможностей от языка. Там сложности другого рода, для решения которых достаточно простых языковых средств. И Java такие средства дает уже давно. И их достаточно.<br /><br />Там где Java-возможностей не хватает, уже давно используются ее конкуренты (включая C++).<br /><br />Поэтому-то и бесполезно создавать более навороченные замены Java. На тех прикладных областях, где Java применяется, выигрыша от этого может и не быть вовсе.eao197https://www.blogger.com/profile/17283739752119445290noreply@blogger.comtag:blogger.com,1999:blog-654279083390275842.post-16672822088579568012011-11-08T10:33:01.140+03:002011-11-08T10:33:01.140+03:00собственно, это прекрасный пример акробатики -- на...собственно, это прекрасный пример акробатики -- насколько просто то, чего мы хотим добиться от компилятора (или добиться, чтобы компилятор это знал), и насколько сложно это выполняется -- навроде того анекдота про оклеивание комнаты обоями через замочную скважинуимяhttps://www.blogger.com/profile/17115793398497396330noreply@blogger.com