Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.22.119.251] |
|
Сообщ.
#1
,
|
|
|
Если кто не в теме: http://confluence.jetbrains.net/display/Kotlin/Welcome
Как считаете, взлетит/не взлетит?? ИМХО - шансы есть, ЗА: нормальный язык с тучей приятных плюшек + наличие хорошей IDE + достаточно известная компания за спиной. ПРОТИВ: достаточно инертные потребители (java - это всякие консерватиные банки и тд) Чесно говоря - очень хочется, чтоб взлетел. |
Сообщ.
#2
,
|
|
|
Почему не Scala vs Kotlin? Сами JetBrains именно с ней соревнуются.
|
Сообщ.
#3
,
|
|
|
Guderian потому что если Kotlin станет на один уровень со Scala - значит он проиграл ;-) не выстрелила скала. только для гиков подходит, собственно потому jetbrains и упрощают Kotlin
Цитата Guderian @ Сами JetBrains именно с ней соревнуются. ну там есть еще ссылка http://confluence.jetbrains.net/display/Kotlin/Comparison+to+Java - значит соревнуются и с Java -) Ну а вообще можно переименовать тему в: "Kotlin vs other JVM languages" |
Сообщ.
#5
,
|
|
|
Питон все равно всех порвет
|
Сообщ.
#6
,
|
|
|
Не понял, зачем это.
Цитата make it safer than Java, i.e. statically check for common pitfalls such as null pointer dereference, make it more concise than Java by supporting variable type inference, higher-order functions (closures), extension functions, mixins and first-class delegation, etc; Ну и что, чтобы не было нульпойнтеров, переходить на новый язык? Остальных новшеств не понял, поясните плз. |
Сообщ.
#7
,
|
|
|
Цитата Машина @ Остальных новшеств не понял, поясните плз. что конкретно непонятно?? Зачем замыкания нужны??? |
Сообщ.
#8
,
|
|
|
Ага, вторая строчка из цитаты - все не понятно. В том числе, что за замыкания
|
Сообщ.
#10
,
|
|
|
Цитата Основной упор будет сделан на уменьшение размера исходного кода, которым сопровождается создание анонимных классов. Охренеть пользы А вообще, не понял. Значит, это что-то сложное, и все непонятно, что это дает. Пока только лишний гемор |
Сообщ.
#11
,
|
|
|
Цитата Машина @ А вообще, не понял. Значит, это что-то сложное, и все непонятно, что это дает. Пока только лишний гемор вообще, скажем, я над такими сложностями и не задумываюсь конкретно groovy дает возможность очень просто решить некоторые тонкости, которые на java я бы и решать не стал. |
Сообщ.
#12
,
|
|
|
Цитата Машина @ А вообще, не понял. Значит, это что-то сложное, и все непонятно, что это дает. Пока только лишний гемор Ну бывает. Не каждый программист поймет что такое "функция".. |
Сообщ.
#13
,
|
|
|
Цитата Romkin @ Если авторы решат проблемы несовместимости версий. Учитывая, что сейчас они там на каждой минорной версии название главной dll-ки меняют, на нем серьезные программы не очень-то попишешь. Питон все равно всех порвет |
Сообщ.
#14
,
|
|
|
Цитата amk @ Если авторы решат проблемы несовместимости версий. Учитывая, что сейчас они там на каждой минорной версии название главной dll-ки меняют, на нем серьезные программы не очень-то попишешь. и доведут производительность до уровня джавы... |
Сообщ.
#15
,
|
|
|
Ну, интерпретатор обязан уступать в производительности. Вот с VBS (VBA) или JS он мог бы потягаться.
Решение проблемы совместимости обеспечило бы сопровождение многоязычных программ (где критичные части написаны на C, например). Сейчас с изменением версии интерпретатора нужно пересобирать C-часть. |
Сообщ.
#16
,
|
|
|
Цитата amk @ Ну, интерпретатор обязан уступать в производительности. ну питон щас как бы компилируется в байт-код, как и джава. насчет JIT-компиляции байткода в нейтив не знаю |
Сообщ.
#17
,
|
|
|
динамика идет лесом.
|
Сообщ.
#18
,
|
|
|
Цитата amk @ Если авторы решат проблемы несовместимости версий. Учитывая, что сейчас они там на каждой минорной версии название главной dll-ки меняют, на нем серьезные программы не очень-то попишешь. Это да, жесть. Но вроде в 3.3 обещаются сделать универсально. |
Сообщ.
#19
,
|
|
|
Цитата jack128 @ динамика идет лесом. да ну? статика уже научилась определять типы произвольным предикатом? |
Сообщ.
#20
,
|
|
|
Цитата korvin @ Цитата jack128 @ динамика идет лесом. да ну? статика уже научилась определять типы произвольным предикатом? определение типов в рантайме идёт лесом. |
Сообщ.
#21
,
|
|
|
Цитата Повстанець @ определение типов в рантайме идёт лесом. дык я и спрашиваю статика уже научилась определять такие типы? в компайл-тайме? а раз нет -- то она идет лесом =) |
Сообщ.
#22
,
|
|
|
Цитата korvin @ Как ты себе представляешь определение типа в компил-тайме? Если зависимость поведения от типа -- то научилась. дык я и спрашиваю статика уже научилась определять такие типы? в компайл-тайме? |
Сообщ.
#23
,
|
|
|
ИМХО, особых преимуществ перед scala нет. Зачем тогда оно? Добавлено Цитата Romkin @ Питон все равно всех порвет У них обоих динамическая типизация. ИМХО, но "должен" быть некий "стэк языков" - язык для системной части(на случай низкоуровневых взаимодействий, оптимизация и т.п.), язык для прикладных задач(статическая строгая типизация, мощная система типов, богатые средства построения абстракций и т.п.), "скриптовый" язык(динамичный, гибкий, простой, лаконичный и т.п.). |
Сообщ.
#24
,
|
|
|
Цитата jack128 @ Guderian потому что если Kotlin станет на один уровень со Scala - значит он проиграл ;-) не выстрелила скала. только для гиков подходит, собственно потому jetbrains и упрощают Kotlin И на какой рынок они тогда метят? PHP? Цитата korvin @ да ну? статика уже научилась определять типы произвольным предикатом? Кто-то уже научился это использовать в практических целях? Цитата D_KEY @ ИМХО, но "должен" быть некий "стэк языков" - язык для системной части(на случай низкоуровневых взаимодействий, оптимизация и т.п.), язык для прикладных задач(статическая строгая типизация, мощная система типов, богатые средства построения абстракций и т.п.), "скриптовый" язык(динамичный, гибкий, простой, лаконичный и т.п.). Я ж говорю, .NET рулит)) Для второго есть вагон CLR-языков, для третьего - DLR (втч IronPython). |
Сообщ.
#25
,
|
|
|
Цитата Guderian @ Кто-то уже научился это использовать в практических целях? в Racket довольно широко используется |
Сообщ.
#26
,
|
|
|
Цитата korvin @ определять типы произвольным предикатом А что имеется в виду ? |
Сообщ.
#27
,
|
|
|
Цитата IL_Agent @ Цитата korvin @ определять типы произвольным предикатом А что имеется в виду ? (define (natural? x) (and (integer? x) (positive? x))) (define (make-vector size item-generator) ...) (provide/contract (natural? (any? . -> . boolean?)) (make-vector (natural? procedure? . -> . vector?))) |
Сообщ.
#28
,
|
|
|
Объяснил
|
Сообщ.
#29
,
|
|
|
Цитата Romkin @ Объяснил используем предикат natural? для определения типа |
Сообщ.
#30
,
|
|
|
Как я понял. Пишем предикат natural?, который определяет, является ли объект неизвестного типа натуральным числом. И теперь у нас natural? какгбэ тоже тип. Можем объявлять контракт, который требует соответствия параметров этому типу. Так что ли ?
Добавлено Цитата korvin @ используем предикат natural? для определения типа ну, значит так Добавлено Написать предикат, который проверяет тип аргумента, во многих языках можно. Вызывай его вначале любой функции для проверки аргументов - вот тебе и контракт |
Сообщ.
#31
,
|
|
|
Цитата korvin @ в Racket довольно широко используется А сам Racket уже научились использовать в практических целях? |
Сообщ.
#32
,
|
|
|
Цитата korvin @ используем предикат natural? для определения типа А почему все время спрашиваешь, не уверен? |
Сообщ.
#33
,
|
|
|
Цитата IL_Agent @ Написать предикат, который проверяет тип аргумента, во многих языках можно. Вызывай его вначале любой функции для проверки аргументов - вот тебе и контракт дык это динамическая типизация =) когда такое будет в статике? =) |
Сообщ.
#34
,
|
|
|
http://antilamer.livejournal.com/366341.html?thread=3307013#t3307013
|
Сообщ.
#35
,
|
|
|
Ну, там правильно пишут: непонятно на кой он.
Добавлено korvin, а в статике нельзя определить тип во время исполнения что ли? |
Сообщ.
#36
,
|
|
|
Цитата MyNameIsIgor @ korvin, а в статике нельзя определить тип во время исполнения что ли? можно, только это не статика будет =) |
Сообщ.
#37
,
|
|
|
Цитата korvin @ можно, только это не статика будет =) Нуууу... Имелась то ввиду, так скажем, типизация по умолчанию. А так и в сисярпе есть dynamic |
Сообщ.
#38
,
|
|
|
Цитата korvin @ дык это динамическая типизация =) когда такое будет в статике? =) Динамическая типизация - это когда тип переменной определяется во время выполнения, а не задаётся при написании или выводится при компиляции. Так ? А проверить тип, а затем выполнить определённые действия в зависимости от него, можно и при статической типизации. См. dynamic_cast, например. |
Сообщ.
#39
,
|
|
|
Цитата korvin @ Блин, есть уже. Хз сколько раз показывал.дык это динамическая типизация =) когда такое будет в статике? =) template<typename T> void fun(T p); template<> void fun<int>(int p) { std::cout << "реализация для int" << std::endl; } template<> void fun<float>(float p) { std::cout << "реализация для float" << std::endl; } template<> void fun<std::string>(std::string p) { static_assert(true, "реализация для строк запрещена");//ошибка на этапе компиляции } template<typename T> void fun(T p) { std::cout << "реализация для всего остального" << std::endl; } |
Сообщ.
#40
,
|
|
|
Цитата Повстанець @ Блин, есть уже. Хз сколько раз показывал. А для int, который > 0 ? |
Сообщ.
#41
,
|
|
|
Цитата IL_Agent @ А для int, который > 0 ? template<int i> void fun() { static_assert(i > 0, "только больше нуля");//скомпилится только при i>0 } |
Сообщ.
#42
,
|
|
|
Цитата Повстанець @ Цитата IL_Agent @ А для int, который > 0 ? template<int i> void fun() { static_assert(i > 0, "только больше нуля");//скомпилится только при i>0 } и где здесь выделение типа? =) #include <iostream> template<int i> void fun () { static_assert( i > 0, "natural" ); std::cout << "Natural: " << i << std::endl; } template<int i> void fun () { std::cout << "Integer: " << i << std::endl; } int main () { } фиг с ней с ошибкой про ассерт, но переопределение шаблона -- вот, что важно: [ ~/devel/c++ ] g++ test.cpp test.cpp: В функции «void fun()»: test.cpp:5:34: ошибка: «static_assert» не имеет аргументов, зависящих от параметра-шаблона, поэтому должна быть доступна декларация «static_assert» [-fpermissive] test.cpp:5:34: замечание: (с ключом «-fpermissive», G++ примет данный код, но разрешение использовать недекларированные имена будет отменено в дальнейших версиях) test.cpp: At global scope: test.cpp:10:11: ошибка: redefinition of «template<int i> void fun()» test.cpp:4:11: ошибка: «template<int i> void fun()» previously declared here |
Сообщ.
#43
,
|
|
|
Цитата korvin @ фиг с ней с ошибкой про ассерт, но переопределение шаблона -- вот, что важно: Не, это не важно. Повстанець написал пример просто шаблонной функции, которая компилируется только в случае, если её аргумент больше нуля. Если нужно выбрать реализацию, то можно так. |
Сообщ.
#44
,
|
|
|
Цитата MyNameIsIgor @ Не, это не важно. Повстанець написал пример просто шаблонной функции, которая компилируется только в случае, если её аргумент больше нуля. Если нужно выбрать реализацию, то можно так. ой ли? http://ideone.com/h9xG7 |
Сообщ.
#45
,
|
|
|
Цитата И где тут статика? fun<i>(); |
Сообщ.
#46
,
|
|
|
Цитата Повстанець @ Цитата И где тут статика?fun<i>(); вот я вас и спрашиваю, господа фанатики статики =) |
Сообщ.
#47
,
|
|
|
http://ideone.com/nnlJ7
|
Сообщ.
#48
,
|
|
|
все типы известны на этапе компиляции, так как мне объявить i чисто статично, чтоб шаблон сработал?
Добавлено Цитата Повстанець @ http://ideone.com/nnlJ7 э не, не катит, мне нужна переменная, а не константа |
Сообщ.
#49
,
|
|
|
Цитата korvin @ Про статику спрашивал ты, а сам норовишь передать динамическую переменную. вот я вас и спрашиваю, господа фанатики статики =) Добавлено Цитата korvin @ Зачем тогда спрашивал про статику? мне нужна переменная |
Сообщ.
#50
,
|
|
|
Правильно, как ты в статике проверишь значение переменной, не константы?
Удали 19 строку. Или объяви i константой. |
Сообщ.
#52
,
|
|
|
Цитата amk @ Правильно, как ты в статике проверишь значение переменной, не константы? Удали 19 строку. Или объяви i константой. известно как: определив тип переменной как (int > 0) |
Сообщ.
#53
,
|
|
|
korvin, значение переменной удобнее проверять явно, а не через фокусы с сопоставлением.
|
Сообщ.
#55
,
|
|
|
korvin, теперь так модно троллить? Что-то лоровских аналитегов напоминает... Т.е. сделать if на значение int'а и в зависимости от его результата вызвать нужную функцию - это не судьба?
|
Сообщ.
#56
,
|
|
|
Цитата amk @ korvin, значение переменной удобнее проверять явно, а не через фокусы с сопоставлением. какие еще фокусы сопоставлением? я лишь прошу продемонстрировать, как статически определить тип (int > 0). (это лишь для простоты, не нужно тыкать unsigned'тами =) ) |
Сообщ.
#57
,
|
|
|
Цитата korvin @ Ты говорил про этам компиляции. Теперь говоришь, что не нужна константа. Вдруг откуда ни возьмись появилась другая совершенно задача. см. выше. мне не нужна константа |
Сообщ.
#58
,
|
|
|
Цитата MyNameIsIgor @ korvin, теперь так модно троллить? Что-то лоровских аналитегов напоминает... Т.е. сделать if на значение int'а и в зависимости от его результата вызвать нужную функцию - это не судьба? не я заикнуля, что "динамическая типизация не нужна" Добавлено Цитата Повстанець @ Ты говорил про этам компиляции. Теперь говоришь, что не нужна константа. Вдруг откуда ни возьмись появилась другая совершенно задача. задача изначально была одна: определить тип (int > 0) средствами статической типизации. если ты ее как-то не так понял, не зачем возмущаться =) |
Сообщ.
#59
,
|
|
|
Цитата korvin @ какие еще фокусы сопоставлением? я лишь прошу продемонстрировать, как статически определить тип (int > 0). (это лишь для простоты, не нужно тыкать unsigned'тами =) ) Маразм крепчал. Шиза косила наши ряды. Вот уже статически выбрать реализацию в зависимости от значения в рантайме. И да, не надо говорить, что это динамическая типизация. Это обычный if. Если это - прелести динамики, то мне её искренне жаль: она убога вплоть до обычного if'а. Добавлено Цитата korvin @ не я заикнуля, что "динамическая типизация" не нужна А я здесь типизации не вижу. |
Сообщ.
#60
,
|
|
|
Цитата MyNameIsIgor @ Маразм крепчал. Шиза косила наши ряды. Вот уже статически выбрать реализацию в зависимости от значения в рантайме. ой лол, тебе система типов на что дадена? |
Сообщ.
#61
,
|
|
|
Цитата korvin @ Кинь ка мне ссылочку на изначальное определение задачи. задача изначально была одна: определить тип (int > 0) средствами статической типизации. если ты ее как-то не так понял, не зачем возмущаться =) Добавлено Может я чего упустил. |
Сообщ.
#62
,
|
|
|
Цитата MyNameIsIgor @ А я здесь типизации не вижу. как это нет? integer -- один тип, natural -- другой. у них есть определенные различия Добавлено Цитата Повстанець @ Кинь ка мне ссылочку на изначальное определение задачи. Может я чего упустил. вот основной вопрос: Java vs Kotlin (сообщение #2941949) в качестве примера я выбрал определение типа (int > 0) |
Сообщ.
#63
,
|
|
|
Цитата korvin @ ой лол, тебе система типов на что дадена? Явно не для того, чтобы ветвления устраивать, ага. |
Сообщ.
#64
,
|
|
|
Цитата korvin @ Что выбрал, то и получил. Хотел в статике -- получил в статике. в качестве примера я выбрал определение типа (int > 0) |
Сообщ.
#65
,
|
|
|
Цитата MyNameIsIgor @ Явно не для того, чтобы ветвления устраивать, ага. какие ветвления? о чем ты? я всего лишь хочу тип natural |
Сообщ.
#66
,
|
|
|
Цитата korvin @ Покажешь пример с динамической типизацией, позволяющий объявить такой тип?задача изначально была одна: определить тип (int > 0) средствами статической типизации Просто в статике это можно реализовать через пользовательский тип с проверкой значений во время выполнения. Другого способа нет. Ни в статике, ни в динамике. Поэтому такие типы и не применяются. |
Сообщ.
#67
,
|
|
|
Цитата Повстанець @ Что выбрал, то и получил. Хотел в статике -- получил в статике. нет, не получил |
Сообщ.
#68
,
|
|
|
Цитата korvin @ Да ну... Статика? Статика... Всё что меньше нуля отбрасывает? Отбрасывает. нет, не получил Все дальнейшие условия появились после решения этой задачи. |
Сообщ.
#69
,
|
|
|
Цитата amk @ Покажешь пример с динамической типизацией, позволяющий объявить такой тип? я уже показывал: (define (natural? x) (and (integer? x) (positive? x))) ; или используя контракт and/c: (define natural? (and/c integer? positive?)) все Цитата amk @ Просто в статике это можно реализовать через пользовательский тип с проверкой значений во время выполнения. Другого способа нет. Ни в статике, ни в динамике. Поэтому такие типы и не применяются. я знаю, проверка в конструкторе. только в динамике и так все в динамике, поэтому противоречий с системой типов не происходит. и таки в динамике применяются. Добавлено Цитата Повстанець @ Да ну... Статика? Статика... Всё что меньше нуля отбрасывает? Отбрасывает. пример с переменными, а не константами, будет? или вы всю программу в константах пишете? |
Сообщ.
#70
,
|
|
|
Цитата korvin @ Ты не просил переменных и рантайм. Ты просил статику и этап компиляции. пример с переменными, а не константами, будет? |
Сообщ.
#71
,
|
|
|
korvin, вам бы научиться изъясняться... Желательно по-русски...
Цитата korvin @ я знаю, проверка в конструкторе. Жаждите увидеть такое? Тогда к чему вопросы, если понятно, что это реализуемо? |
Сообщ.
#72
,
|
|
|
Нифига не понял.
template <bool> Bool2Type{}; template <typename T> T f(T t, Bool2Type<false>); template <typename T> T f(T t, Bool2Type<true>); template <typename T> T f(T t) { return f(t, Bool2Type<std::numeric_limits<T>::is_signed>()); } |
Сообщ.
#73
,
|
|
|
Цитата Повстанець @ Ты не просил переменных и рантайм. Ты просил статику и этап компиляции. угу, статику с переменными, или что, статическая типизация этого не позволяет? константы я и в CL/Racket могу в compile-time проверять. Добавлено нет, такой ад не жажду увидеть Добавлено Цитата Qraizer @ Нифига не понял. template <bool> Bool2Type{}; template <typename T> T f(T t, Bool2Type<false>); template <typename T> T f(T t, Bool2Type<true>); template <typename T> T f(T t) { return f(t, Bool2Type<std::numeric_limits<T>::is_signed>()); } аналогично |
Сообщ.
#74
,
|
|
|
Цитата korvin @ нет, такой ад не жажду увидеть Жалкий ниасилятор |
Сообщ.
#75
,
|
|
|
Цитата MyNameIsIgor @ Цитата (korvin @ Вчера, 19:46) нет, такой ад не жажду увидеть Жалкий ниасилятор Пример был реально аццкий)) Недетерминированный тип простым фабричным методом... оригинально. А если условие чуть усложниться? Надо будет, скажем, отдельный тип для простых чисел. На что unsigned заменишь, чтобы контроль не потерять? В этом плане пример korvin'а, конечно, рафинирован гораздо лучше. |
Сообщ.
#76
,
|
|
|
Цитата Guderian @ Пример был реально аццкий)) Кто-то однажды показывал колбасню из тернарных операторов - вот это был пейзаж ада. А здесь всё банально и очень просто. Цитата Guderian @ Недетерминированный тип Какой? Определение недетеминированного типа? Цитата Guderian @ простым фабричным методом... оригинально Именно - простым. Как задача поставлена, так она и сделана. Цитата Guderian @ А если условие чуть усложниться? Надо будет, скажем, отдельный тип для простых чисел. На что unsigned заменишь, чтобы контроль не потерять? Ни на что. Проверка просто будет в конструкторе с выбросом исключения если не пройдёт. Как, кстати, надо было и здесь сделать с проверкой >0 для натуральных чисел, я просто торопился. Цитата Guderian @ В этом плане пример korvin'а, конечно, рафинирован гораздо лучше. А никто и не утверждал обратного. korvin повёлся на банальнейший вброс, но для демонстрации преимуществ динамической типизации выбрал из рук вон плохой пример - вот и всё, что тут было. |
Сообщ.
#77
,
|
|
|
Цитата MyNameIsIgor @ Кто-то однажды показывал колбасню из тернарных операторов - вот это был пейзаж ада. А здесь всё банально и очень просто. Простота разная бывает. Если речь о лаконичности, то это скорее относится к примеру korvin, поскольку с ростом сложности приложения, сложность поддержки его natural типа не меняется. Если же речь идет о простоте, когда сортир - это яма и доска с дырками, то да, на данном этапе все выглядит просто. А стоит заглянуть на несколько ходов вперед - на каждом шагу заботливо положена грабелька)) Цитата MyNameIsIgor @ Какой? Определение недетеминированного типа? Забавный каламбур в форме диалога получается. Учитывая, что детерминированный - суть определенный (даже и в мыслях не было, что этот термин нуждается в трансляции) выходит: Guderian: ...неопределенный тип... MyNameIsIgor: Какой? Определение неопределенного типа? Просто термин динамического типа претерпел уже такую инфляцию, что язык не поворачивается его активно использовать. Взять хотя бы упоминавшийся dynamic из шарпа. Назвали динамическим прокси-тип который транслирует запросы к... опять же "статическим" типам. Цитата MyNameIsIgor @ Именно - простым. Как задача поставлена, так она и сделана. Не простым, а сильно редуцированным. Как только приложение начинает свой рост и возникает необходимость в перегрузке кастингов/операторов, аксессорах и т.п. - начнутся проблемы. If-ами на каждом шагу будешь в землю вгрызаться. Как думаешь, сколько девелоперов из 100 забудут при реализации операции вычитания проконтролировать натуральность ее выхлопа? Цитата MyNameIsIgor @ А никто и не утверждал обратного. korvin повёлся на банальнейший вброс, но для демонстрации преимуществ динамической типизации выбрал из рук вон плохой пример - вот и всё, что тут было. Пока даже на такой плохой пример не нашлось достойной альтернативной реализации. |
Сообщ.
#78
,
|
|
|
Цитата Guderian @ Простота разная бывает. Если речь о лаконичности, то это скорее относится к примеру korvin, поскольку с ростом сложности приложения, сложность поддержки его natural типа не меняется. Глухой write only mode... Цитата MyNameIsIgor @ Цитата Guderian @ А никто и не утверждал обратного.В этом плане пример korvin'а, конечно, рафинирован гораздо лучше. korvin ни словом не обмолвился о лаконичности решения. Он поставил под сомнение саму возможность решения. Цитата korvin @ статика уже научилась определять типы произвольным предикатом? И для тех, кто не читает тему, в которую постит, сообщаю, что вот это Цитата jack128 @ динамика идет лесом. говорил не я. Цитата Guderian @ Забавный каламбур в форме диалога получается. Учитывая, что детерминированный - суть определенный (даже и в мыслях не было, что этот термин нуждается в трансляции) выходит: Guderian: ...неопределенный тип... MyNameIsIgor: Какой? Определение неопределенного типа? Да, забавно. Оказывается, вы неплохо работаете в роли текстового препроцессора - смысла не понимаете, но find & replace работает "на ура". Цитата Guderian @ Просто термин динамического типа претерпел уже такую инфляцию, что язык не поворачивается его активно использовать. Взять хотя бы упоминавшийся dynamic из шарпа. Назвали динамическим прокси-тип который транслирует запросы к... опять же "статическим" типам. Ну, ясно, из пальца был высосан термин и сделано наивнейшее предположение, что уж все то его точно знают. Цитата Guderian @ Не простым, а сильно редуцированным. Как только приложение начинает свой рост и возникает необходимость в перегрузке кастингов/операторов, аксессорах и т.п. - начнутся проблемы. If-ами на каждом шагу будешь в землю вгрызаться. Как думаешь, сколько девелоперов из 100 забудут при реализации операции вычитания проконтролировать натуральность ее выхлопа? Какие сто программистов? Которые будут операторы юзать? А на кой им проверять то? Проверку пишут один раз в реализации оператора и кидают исключение, если она не прошла. А для ста программистов оператор либо выполнился и вернул заведомо валидный результат, либо не выполнился вовсе - никаких проверок. Цитата Guderian @ Пока даже на такой плохой пример не нашлось достойной альтернативной реализации. Возможно, не нашлось реализации, которая удовлетворила бы вас... Но это только ваши проблемы, меня никак не касающиеся. |
Сообщ.
#79
,
|
|
|
Цитата MyNameIsIgor @ Глухой write only mode... Цитата MyNameIsIgor @ И для тех, кто не читает тему, в которую постит Цитата MyNameIsIgor @ вы неплохо работаете в роли текстового препроцессора - смысла не понимаете Опаньки... трололо понеслось)) На что только не пойдут люди для того чтобы защитить свой кусочек кода. Ну и что, что не масштабируется и костылей не огребешь, он же ж свой)) Цитата MyNameIsIgor @ korvin ни словом не обмолвился о лаконичности решения. Он поставил под сомнение саму возможность решения. Единственная цитата korvin, которую я прокомментировал - это: Цитата korvin @ нет, такой ад не жажду увидеть Потому как код… никакой. Но Ваше желание его защитить любой ценой мне вполне понятны и простительны. С нетерпением жду следующего выброса эмоций на вентилятор)) Цитата MyNameIsIgor @ Ну, ясно, из пальца был высосан термин и сделано наивнейшее предположение, что уж все то его точно знают. "Под детерминированностью процессов в мире понимается однозначная предопределённость" (с) Вика. Встает вопрос, почему я не мог использовать этот термин применительно к типу, который не "предопределен однозначно"? Цитата MyNameIsIgor @ Какие сто программистов? Которые будут операторы юзать? А на кой им проверять то? Проверку пишут один раз в реализации оператора и кидают исключение, если она не прошла. А для ста программистов оператор либо выполнился и вернул заведомо валидный результат, либо не выполнился вовсе - никаких проверок. Под "реализацией операции вычитания" подразумевалась именно реализация, а не использование. Сто программистов были упомянуты для статистики, ибо на одном статистику не меряют. Если бы меряли, то она была бы 0% валидного кода, ибо Вы же даже не задумались над тем, чтобы проконтролировать вход конструктора. И так, наверняка, поступило бы больше половины. Доведись мне поддерживать такой класс, писанный другим человеком, и поставь передо мной задачу добавить ему операцию умножения на константу, я бы прошляпил проверки запросто. А если бы не прошляпил , то совершил бы ошибку, поскольку в какой-то момент времени меня подвела память и я было подумал, что натуральные=неотрицательные)) Цитата MyNameIsIgor @ Возможно, не нашлось реализации, которая удовлетворила бы вас... Но это только ваши проблемы, меня никак не касающиеся. Я знаю, что это мои проблемы. Мои и моих заказчиков, которые частенько приходят ко мне с таким кодом, что без слез и не взглянешь. А все потому, что некие кодеры до меня решили, что проблемы, с которыми они не столкнулись сейчас - это проблемы тех разработчиков, что будут потом. И дальше одного хода в это программной партии они не видят. |
Сообщ.
#80
,
|
|
|
Цитата korvin @ Что именно? Тот же "неосилимый" полиморфизм, только в статике. Что пояснить? аналогично |
Сообщ.
#81
,
|
|
|
Цитата Guderian @ Опаньки... трололо понеслось)) Т.е. перевернуть всё с ног на голову и сделать вид невинной овечки "я не понял, что с меня просят определение термина" - это "трололо понеслось))" в вашей терминологии. Продолжайте в том же духе, я начинаю запоминать ваши термины. Цитата Guderian @ На что только не пойдут люди для того чтобы защитить свой кусочек кода. Ну и что, что не масштабируется и костылей не огребешь, он же ж свой)) Цитата Guderian @ Потому как код… никакой. Ах, так вы, оказывается, вовсе не про возможность решения разговариваете, а про мой код? Впрочем, после кухонных терминов я должен был догадаться... Ну, давайте обсудим мой код, но прежде реализуйте заявленный вами функционал (т.е. с операторами) на любом языке программирования, я не настаиваю на статически типизированном. Цитата Guderian @ "Под детерминированностью процессов в мире понимается однозначная предопределённость" (с) Вика. Встает вопрос, почему я не мог использовать этот термин применительно к типу, который не "предопределен однозначно"? Защищать свой родной кухонный термин - ведь так это называется в вашей терминологии. Ну, что же, разжёвываю. Во-первых, термин "недетерминированный тип" не общепринятый, вы его сами придумали, и я не собираюсь предполагать, что именно вы под ним подразумевали. Во-вторых, он вполне определён однозначно, просто проверяется во время исполнения, а не компиляции. Как вам пришла мысль, что динамическая типизация недетерминирована, я даже предположить боюсь. Цитата Guderian @ Под "реализацией операции вычитания" подразумевалась именно реализация, а не использование. Сто программистов были упомянуты для статистики, ибо на одном статистику не меряют. Если бы меряли, то она была бы 0% валидного кода, ибо Вы же даже не задумались над тем, чтобы проконтролировать вход конструктора. И так, наверняка, поступило бы больше половины. Доведись мне поддерживать такой класс, писанный другим человеком, и поставь передо мной задачу добавить ему операцию умножения на константу, я бы прошляпил проверки запросто. А если бы не прошляпил , то совершил бы ошибку, поскольку в какой-то момент времени меня подвела память и я было подумал, что натуральные=неотрицательные)) Об этом мы поговорим после того, как вы покажете свою реализацию как я просил выше. Цитата Guderian @ Я знаю, что это мои проблемы. Мои и моих заказчиков Так вот и идите... решать их. |
Сообщ.
#82
,
|
|
|
Эх, холивары, они такие холивары)) Приступим к утренней разминке)
Цитата MyNameIsIgor @ Т.е. перевернуть всё с ног на голову и сделать вид невинной овечки "я не понял, что с меня просят определение термина" - это "трололо понеслось))" в вашей терминологии. Продолжайте в том же духе, я начинаю запоминать ваши термины. Поделюсь своими наблюдениями. Есть несколько категорий людей. Первые - самые мудрые, они быстро расшифровывают определение термина и дальше рубят по сути вопроса, не останавливаясь на мелочах. Вторым нужно объяснить, но после этого они уже берут быстрый старт. Третьим - сколько не объясняй. Из ваших пяти абзацев три касаются в той или иной степени термина. Это ж какое отсутствие аргументов надо иметь, чтобы так увлечься этим вопросом)) Но коль скоро он так Вас беспокоит, то каюсь. Использовал уродливый неологизм. Видимо, на это повлиял тот факт, что техническую литературу приходиться читать исключительно на англицком, а там фраза "determin{e|ed|ing|etc} type" в порядке вещей. Тот же драфт на C++0x - это ж пытка для моего неопытного ума: Цитата "Some objects are polymorphic (10.3); the implementation generates information associated with each such object that makes it possible to determine that object’s type during program execution. For other objects, the interpretation of the values found therein is determined by the type of the expressions (Clause 5) used to access them." Знакомая ситуация, правда? Кто-то недавно использовал полиморфизм в своем примере, чтобы "determine that object's type". Хотя хотелось бы, чтобы тип "determined by the type" выражения. А уж в разделе declarations/declarators от determine просто спасу нет: Цитата First, the decl-specifier-seq determines a type. In a declaration T D the decl-specifier-seq T determines the type T. [ Example: in the declaration int unsigned i; the type specifiers int unsigned determine the type “unsigned int” (7.1.6.2). —end example ] От такого засилия фраз, что тип детерминирован, я невольно привык его употреблять равно как и термины дефинитивный, декларативный, императивный и еще вагон других. Извиняюсь за свой, как Вы выразились "кухонный термин", навеянный прочтением стандартов и искренне надеюсь, что я был исчерпывающ в своем извинении)) Цитата MyNameIsIgor @ Ах, так вы, оказывается, вовсе не про возможность решения разговариваете, а про мой код? Я искренне полагал, что только я в "глухом write-only", как Вы изволили выразиться... А то, что я Вам адресовал, начиналось с цитаты korvin касающейся конкретного кода и моей фразы "Пример был…". Постараюсь в следующий раз сопровождать дополнительными указателями, подсказками, сигнальными флажками и т.п. Цитата MyNameIsIgor @ Ну, давайте обсудим мой код, но прежде реализуйте заявленный вами функционал (т.е. с операторами) на любом языке программирования, я не настаиваю на статически типизированном. Если я буду реализовывать на привычном мне шарпе, то у меня получится та же херня с теми же проблемами. И как я говорил ранее, не поможет даже dynamic. Так что, как бы это ни было для меня унизительно, я не смогу написать код лучше чем Ваш)) Я бы даже сказал по-другому. Это не столько проблемы того самого кода, поскольку он, по сути, выжимает все возможное из имеющихся средств и попросту аккумулирует классику ООП - полиморфизм + идея паттерна Factory Method. Проблема в самом ооп. А как на ооп-языках со статической типизацией написать лучше - я не знаю. Может быть я и сделал немного по-другому, но это больше нацелено на то, чтобы застелить все соломой и дизайн стал bulletproof. А концептуально - такая же херня)) Цитата MyNameIsIgor @ термин "недетерминированный тип" не общепринятый Не в защиту термина, а просто лингивистических размышлений цепочка: "тип" - общепринятый, "детерминированный" - общепринятый, а "не детерминированный тип" - не общепринятый)) Интересно, является ли общепринятым "синий икосаэдр"... Цитата MyNameIsIgor @ Во-вторых, он вполне определён однозначно, просто проверяется во время исполнения, а не компиляции. Как вам пришла мысль, что динамическая типизация недетерминирована, я даже предположить боюсь. Полиморфный костыль под названием number - это "определен однозначно"? Тогда в шарпе/яве "object x = любая_херня_хоть_число_хоть_строка" - это тоже однозначное определение. Ну и что, что всё есть object, использован тот же принцип. Ввели предка (Ваш класс number), определили его наследников (Ваши же integer, natural) и решили, что тип number, лежащий в корне иерархии наследования (не его ли вычислит auto?) - это однозначное определение. Т.е. неоднозначности integer это, или natural вообще не возникнет? Тогда добавьте, плиз, в natural метод foo и вызовите number->foo(). Посмотрим, так ли се "однозначно". Цитата MyNameIsIgor @ Так вот и идите... решать их. Не бздеть, у меня все под контролем)) А вообще, если отвлечься немного от холивара, то мне кажется имеет смысл говорить не о статическом и динамическом определении типов, а о декларативном и императивном. Если предикат вычислим во время компиляции, то это суть константа и здесь плюсЫ со своими возможностями метапрограммирования будут биться на равных. Значит плавно перетекаем в рантайм, где осуществляется вычисление предиката со всеми сопутствующими механизмами контроля. Но в случае с декларативным определением, транслятор имеет генеративные возможности по самостоятельному формированию необходимого контроля. А императивно мы сами должны его обеспечить, что не есть гут. |
Сообщ.
#83
,
|
|
|
Цитата Guderian @ Видимо, на это повлиял тот факт, что техническую литературу приходиться читать исключительно на англицком, а там фраза "determin{e|ed|ing|etc} type" в порядке вещей. Тот же драфт на C++0x - это ж пытка для моего неопытного ума: <и далее по тексту> Ваш ум действительно неопытный, если вы так и не поняли, что в приведённых цитатах нигде нет термина "детерминированный тип". Там есть только глаголы, относящиеся к прилагательному "тип": "определить тип", "определяется типом", "определяет тип". Надеюсь, вашего опыта использования русского языка хватит, чтобы понять разницу. Цитата Guderian @ Полиморфный костыль под названием number - это "определен однозначно"? А при чём тут моя реализация? Тип вполне однозначно определён и в примере korvin'а. Просто потому, что он однозначно определён уже в задании: это либо натуральные числа (надеюсь, не будете спорить, что это однозначное определение), либо целые (так же искренне надеюсь, что разночтений не возникнет). Цитата Guderian @ Тогда в шарпе/яве "object x = любая_херня_хоть_число_хоть_строка" - это тоже однозначное определение. Ну и что, что всё есть object, использован тот же принцип. Ввели предка (Ваш класс number), определили его наследников (Ваши же integer, natural) и решили, что тип number, лежащий в корне иерархии наследования (не его ли вычислит auto?) - это однозначное определение. Т.е. неоднозначности integer это, или natural вообще не возникнет? Тогда добавьте, плиз, в natural метод foo и вызовите number->foo(). Посмотрим, так ли се "однозначно". Вы в очередной раз путаете Божий дар с яичницей. Вы говорите не об определении типа, а о типизации. Во-первых, динамическая типизация вполне себе детерминирована. Во-вторых, по вашему выходит, что любой класс, который имеет (может иметь) наследников, является неопределённым типом, что есть явная чушь. Цитата Guderian @ Но коль скоро он так Вас беспокоит, то каюсь. Использовал уродливый неологизм. Цитата Guderian @ Извиняюсь за свой, как Вы выразились "кухонный термин", навеянный прочтением стандартов и искренне надеюсь, что я был исчерпывающ в своем извинении)) Я очень рад, что вы искренне раскаялись. Я подумаю над тем, принять ли ваши извинения. Если решение будет положительным, я сообщу вам отдельно. Цитата Guderian @ Третьим - сколько не объясняй. Наконец-то здравая мысль с вашей стороны. Я ею воспользуюсь и перестану вам что либо объяснять. Не обижайтесь, но надоедает даже такое увлекательное занятие, как кидать горох в стену. |
Сообщ.
#84
,
|
|
|
Самое интересное, что спор на самом деле не имеет отношения к статической или динамической типизации.
Ясно, что независимо от вида типизации значение неизвестное во время компиляции, можно проверить только в рантайме. С другой стороны, чтобы выполнить проверку при компиляции транслятор должен поддерживать глубокую интерпретацию константных выражений (в том смысле, что должен уметь вычислять не только простые выражения, но и доступные для интерпретации функции/процедуры). Опять же, независимо от вида типизации язык может при этом иметь или не иметь средства для прерывания компиляции в таком случае. В общем дело упирается в наличие нужных средств управления компиляцией, а не в статическую/динамическую типизацию. |
Сообщ.
#85
,
|
|
|
Цитата MyNameIsIgor @ Ваш ум действительно неопытный, если вы так и не поняли, что в приведённых цитатах нигде нет термина "детерминированный тип". Там есть только глаголы, относящиеся к прилагательному "тип": "определить тип", "определяется типом", "определяет тип". Надеюсь, вашего опыта использования русского языка хватит, чтобы понять разницу. Не знаю, насколько опыт русского языка применим к документации на английском, а вот опыт последнего мне подсказывает, что форма инфинитива, на которую вы ссылаетесь, применительно к той ситуации в которой я этот термин употреблял, находится в форме страдательного залога и звучит как determined (в примерах, что я приводил - "determined by the type of the expressions"). И тут на арену выходят правила русского языка, ибо страдательный залог трансформируется в страдательное причастие, которое в русском языке звучит как "детерминированный". Вот такая адъективация получилась. Надеюсь, я не очень сложно объяснил мыслительные процессы своего неопытного ума?)) Цитата MyNameIsIgor @ А при чём тут моя реализация? Потому что, как я сказал предыдущие пятьдесят четыре раза, я обсуждал именно этот пример реализации. Цитата MyNameIsIgor @ Вы в очередной раз путаете Божий дар с яичницей. Вы говорите не об определении типа, а о типизации. Во-первых, динамическая типизация вполне себе детерминирована. Я всегда думал, что определение типа - это главный инструмент типизации и весь тред с того момента, как забили на Kotlin, строиться вокруг того, что динамическая типизация позволяет использовать предикаты, вычисляемые в рантайм, для определения типа. Динамическая типизация - да, детерминирована. В инструкции по ее использованию. Динамический тип тоже детерминирован. В момент присвоения переменной этого типа значения. Цитата MyNameIsIgor @ Во-вторых, по вашему выходит, что любой класс, который имеет (может иметь) наследников, является неопределённым типом, что есть явная чушь. Согласен. Ваша фраза "класс является неопределенным типом" - полная чушь, ибо класс является вполне определенным типом. Я бы даже сказал, что он и есть тот тип, которым является)) А есть также экземпляр этого класса и он тоже вполне определенного типа. Типа этого же класса. А есть декларация, которая принудительно указывает экземпляру этого класса некий полиморфный тип. Это может быть number, а может вообще абстрактный указатель. Так что вы получите в результате? Определенный тип или декларированный тип с некоторым контрактом number, который вы хотите получить от значения, тип который вам доподлинно неизвестен? Если вы уверены, что тип определен, то вызовите foo() специфицированного в natural, как я предложил. Лисп это может (он, правда, и крякать натуральное число может заставить, но это отдельная тема), а вы без дополнительного определения через кастинг? Я бы все-таки различал определение типа и декларирование. Цитата MyNameIsIgor @ Не обижайтесь, но надоедает даже такое увлекательное занятие, как кидать горох в стену. Какие у вас, однако, странные увлечения)) Может заменить на что-то более полезное для дальнейшего развития и роста?) |
Сообщ.
#86
,
|
|
|
Guderian
Цитата Guderian @ Вообще-то более близкий по смыслу перевод для determine - определять, determined - определенный, определяемый. То есть "determined by the type of the expressions" переводится на русский язык скорее, как "определенный по типу выражения", "определяемый типом выражения" (тип - в смысле тип значения)determined by the type of the expressions Статическая типизация тоже позволяет вычислять предикаты в рантайме. |
Сообщ.
#87
,
|
|
|
KISS
Если считать, как я привык делать, что by обозначает творительный падеж, то... Цитата amk @ "определяемый типом выражения" |
Сообщ.
#88
,
|
|
|
Цитата amk @ determine - определять, determined - определенный Я и сказал, что отсылка шла к форме инфинитива, т.е. determine = определять/детерминировать, а страдательный залог determined становится страдательное формой причастия - определенный/детерминированный. Или речь идет о том, что я использовал англицизм? Так он давно используется. Детерминированные функции, детерминированная машина Тьюринга и т.п. Никто же не говорит "определенная функция", когда подразумевает ее детерминированность. Так и я, стараюсь избегать терминов, которые могут вызвать разночтение. Ибо typedef тоже дает определенный тип, но смысл этой определенности другой. Декларация T D, тоже дает определенный тип, уже третьего смысла. В общем одно наше "определять" с тремя их determine/declare/define не всегда справляется)) Цитата amk @ Статическая типизация тоже позволяет вычислять предикаты в рантайме. Учитывая, что предикат - это функция, было бы удивительно, если бы язык со статической типизацией не умел бы вычислять функций. Другое дело, что когда идет разработка и результат вычисления в рантайм еще не известен, разработчик вынужден довольствоваться общением через контракты. А в языке с динамической типизацией в этом нет необходимости. Но этой дает как плюсы, так и минусы. Цитата amk @ В общем дело упирается в наличие нужных средств управления компиляцией, а не в статическую/динамическую типизацию. Моё имхо, что за управляемой компиляцией будущее. Цитата Qraizer @ Если считать, как я привык делать, что by обозначает творительный падеж, то... Если быть точным, то фраза была "is determined by". Форма глагола "be" + Participle II - это классическое определение passive voice, "by" в passive voice указывает действующее лицо. Сам по себе voice/залог - это форма глагола, поэтому и переводить ее лучше в глагольно/причастной форме. Адъективация же глагола до прилагательного "определяемый" теряет семантику приложения, которое повествует о совершённом действии и низводит его до характеристики объекта. Чтобы не терять смысла, обычно осуществляется трансформация английского страдательного залога в наше страдательное причастие, в нашем случае определять->определен(краткая форма причастия)->определенный(полная форма причастия). |
Сообщ.
#89
,
|
|
|
Цитата Guderian @ В данном случае ты воспользовался неоднозначностью перевода и подменил одно понятие другим. Это позволило тебе сделать пару утверждений, бессмысленных при общепринятом переводе, но утверждающих твою мысль при выбранном тобой.Так и я, стараюсь избегать терминов, которые могут вызвать разночтение. Цитата Guderian @ когда идет разработка и результат вычисления в рантайм еще не известен, разработчик вынужден довольствоваться общением через контракты. А в языке с динамической типизацией в этом нет необходимости Не хочешь же ты сказать, что в языке с динамической типизацией ты можешь проверить значение до рантайма. И в языке с динамической типизацией ты тоже до выполнения общаешься лишь через контракт. Другое дело, что в случае статической типизации ты можешь включить в контракт тип данных, а в случае динамической есть другие возможности, например наличие некоторого метода. Цитата Guderian @ Только вот об такой управляемой компиляции почему-то больше задумываются при статической типизации. А при динамической предпочитают двигаться в сторону "втометапрограммирования" (когда язык является метаязыком для себя же), и оставляя конкретные реализации программисту.за управляемой компиляцией будущее И слово "определяемый" в том контексте - не прилагательное, а причастие - форма страдательного залога настоящего времени. определенный - страдательный залог прошедшего времени определяющий - действительный залог настоящего времени определивший - действительный залог прошедшего времени определявший - несовершенный вид действительного залога прошедшего времени Адъективации причастия (не глагола) в данном случае не происходит. так что с переводами все в порядке. Правда, без учета окружения, возможно, что перевод выпал из контекста. |
Сообщ.
#90
,
|
|
|
Цитата amk @ В данном случае ты воспользовался неоднозначностью перевода и подменил одно понятие другим. Это позволило тебе сделать пару утверждений, бессмысленных при общепринятом переводе, но утверждающих твою мысль при выбранном тобой. Да я уже раз десять сказал, что неудачный для данного высокого общества подобрал термин)) По наивности думал, что у людей, которые с молоком матери (детерминированными алгоритмами, детерминированными машинами Тьюринга, детерминированными функциями и т.п.) должны были впитать принцип детерминированности, не будет проблем даже с такой непривычной формулировкой, которая поголовно встречается в англоязычной литературе. В том же упомянутом драфте я могу спокойной прочитать в разделе declarators про indetermined value и очень четко различается определение с дефинитивной точки зрения, декларативной и определение, как процесс (как дефинитивные, декларативные и оперативные нормы права, например). Читаю про auto - все четко: "determining the type specified for the contained declarator-id by such a declaration". Декларатор - отдельно, дереминирование - отдельно". Так что я, естественно, выбрал неудачные термин, ну а вы можете использовать "определенный" для typedef'ов, деклараторов, функций вычисления и еще чего угодно. Хотите дам вам обоим подсказку, чтобы меня окончательно растоптать в части этого термина и публично выпороть, но математически грамотно?)) Как известно, типизация осуществляется двумя способами - перечислением и предикатом принадлежности. Перечисление детерминировано по определению. Предикат - это функция, для функции определение детерминированности существует, значит детерминированность предиката и логичней рассматривать в первую очередь. А в примере с натуральными числами предикат является детерминированной функцией. Написал и прям сам расстроился, какое фиаско потерпел)) Что за жизнь, вот так и холиварь сам с собой)) Цитата amk @ Не хочешь же ты сказать, что в языке с динамической типизацией ты можешь проверить значение до рантайма. Я хочу сказать то, о чем писал уже пару раз до этого. В языке со статической типизацией я не могу получить доступ к методу foo, специфицированному в natural через контракт number. А в языке с динамической - запросто. Пусть сегодня это будет на Io. // Модифицируем существующий числовой класс Number do ( isNatural := method(if(self > 0, true, false)) // Здесь и будет реализован наш предикат auto := method ( if ( isNatural == false, // Для ненатуральных чисел добавляем специфичный метод self negative := method(self * (-1)) ) return self ) ) x := 2 auto x isNatural println >> true y := (-3) auto y isNatural println >> false // Как бы язык со статической типизацией достучался до negative через полиморфный тип, если он у него не определен? // И где у меня здесь контракт? y negative println >> 3 // А вот и некоторого рода негативная сторона, о которой я говорил x negative println >> Number does not respond to 'negative' Цитата amk @ И слово "определяемый" в том контексте Возможны ты и прав. |
Сообщ.
#91
,
|
|
|
Да тебя в общем-то никто не собирался топтать, я по крайней мере. Дело в том, что слово 'детерминированный' к объектам в программировании почти не применяется. Недетерминированность языковых конструкций (А именно она скрывается за словосочетанием "неопределенное поведение", хотя в оригинале и пишется "Undefined behavior") там считается одним из самых страшных грехов. Даже случайные числа в программировании детерминированные (потому и псевдослучайные). Недетерминированность разрешается только по заказу. Ну и входные данные могут обладать строго дозированной недетерминрованностью. И все.
Согласись, говорить, что сущность, которая просто обязаны быть детерминированной - детерминирована - это то же самое, что говорить, что масло является маслянистым. Кстати тип может изначально обладать полиморфным поведением на основе свойств. Это конечно не то же самое, что полиморфизм потомков, но работает. Именно этот вариант, похоже, ты и реализовал (что это за язык, кстати). И такой полиморфизм динамически реализуем и в языках со статической типизацией (с одной поправкой - в языке со СТ нельзя в динамике проверить существование метода или атрибута, но можно проверить тип объекта). По-моему интереснее был бы пример с фабрикой, на основе свойств создающей объект нужного типа. Этот вариант тоже работает при любом виде типизации. Причем, в случае статической типизации без дополнительных накладных расходов при работе с объектом. Вообще, пример с целыми и натуральными числами выглядит несколько надуманным. Вдобавок ведущим к серьезным ошибкам. В реальной практике эти числа не смешиваются в одном (атрибуте) объекте. То есть если по контракту атрибут должен быть целым числом, то, даже если присвоить ему натуральное значение, он должен принять положительное целое значение, к которому операция смены знака будет применима. А в обсуждаемом примере произойдет исключение. |
Сообщ.
#92
,
|
|
|
Цитата amk @ Вообще, пример с целыми и натуральными числами выглядит несколько надуманным. Вдобавок ведущим к серьезным ошибкам. В реальной практике эти числа не смешиваются в одном (атрибуте) объекте. То есть если по контракту атрибут должен быть целым числом, то, даже если присвоить ему натуральное значение, он должен принять положительное целое значение, к которому операция смены знака будет применима. А в обсуждаемом примере произойдет исключение. никакого исключения: #lang racket (define natural? (and/c integer? positive?)) (define/contract (f x) (-> integer? integer?) (- x)) (define/contract (g) (-> natural?) 1) (define (test) (f (g))) Добро пожаловать в DrRacket, версия 5.1 [3m]. Язык: racket; memory limit: 4096 MB. > (test) -1 > |
Сообщ.
#93
,
|
|
|
korvin
Я так понял, здесь определяется: предикат natural?, проверяющий, что переданное ему для проверки является целым положительным числом потом определяется функция f(x), и проверяющая что переданный ей параметр является целым, и что возвращаемое ей значение тоже целое определяется функция g проверяющая, что возвращаемое ей значение является натуральным числом. и определяется тестовая функция test, которая вызывает функцию f с параметром выданным функцией g. И что мы имеем. Функция g возвращает число один, проверив, что оно является натуральным Функция f проверяет что переданное ей число целое и возвращает его с обратным знаком, проверив, что возвращаемое значение не поменяло тип. А теперь объясни пожалуйста, где тут тип натурального числа, если ты все время работаешь с встроенными в язык целыми? Просто твой пример на уровне процедурного языка года так 70-80, только, благодаря мета-возможностям языка, с встроенной проверкой контракта. В том же C++ три проверки из твоих четырех будут обеспечены статической системой типов, а оставшаяся будет выполнена еще при компиляции. Впрочем при включенной оптимизации и результат будет вычислен еще при компиляции. |
Сообщ.
#94
,
|
|
|
Цитата amk @ А теперь объясни пожалуйста, где тут тип натурального числа, если ты все время работаешь с встроенными в язык целыми? контракт и есть тип Цитата amk @ В том же C++ три проверки из твоих четырех будут обеспечены статической системой типов, а оставшаяся будет выполнена еще при компиляции. Впрочем при включенной оптимизации и результат будет вычислен еще при компиляции. ок, чуть изменим: (define natural? (and/c integer? positive?)) (define/contract (f x) (-> integer? integer?) (- x)) (define/contract (g) (-> natural?) (read)) (define (test) (f (g))) Добро пожаловать в DrRacket, версия 5.1 [3m]. Язык: racket. > (test) 1 -1 > (test) -1 . self-contract violation: expected <(and/c integer? positive?)>, given: -1 contract on g from (function g), blaming (function g) contract: (-> (and/c integer? positive?)) at: unsaved-editor620:9.18 > покажи мне аналог на С++, выполняющий _все_ проверки до рантайма |
Сообщ.
#95
,
|
|
|
Цитата korvin @ ок, чуть изменим: (define natural? (and/c integer? positive?)) (define/contract (f x) (-> integer? integer?) (- x)) (define/contract (g) (-> natural?) (read)) (define (test) (f (g))) Что есть "->"? Цитата покажи мне аналог на С++, выполняющий _все_ проверки до рантайма Каким образом ты собираешься до рантайма проверить значения, получаемые в рантайме? Добавлено Цитата Guderian @ В языке со статической типизацией я не могу получить доступ к методу foo, специфицированному в natural через контракт number. А в языке с динамической - запросто. Ты уверен, что ты получаешь доступ к методу foo, именно через контракт number? Ведь в этом контракте о foo ничего не сказано Получаешь ли ты печеньки на работе согласно своему "контракту" с работодателем? |
Сообщ.
#96
,
|
|
|
Цитата D_KEY @ Что есть "->"? контракт-функция. емнип amk все правильно понял |
Сообщ.
#97
,
|
|
|
Цитата korvin @ Цитата D_KEY @ Что есть "->"? контракт-функция. емнип amk все правильно понял В таком случае твой пример реализуется в С++ через вызов функций проверки, который, например, кидают исключение. Для примитивных типов можно сделать на шаблонах проверку в статике. Но это будут, естественно, константы, которые тебе по какой-то причине не нравятся(что выглядит странно на фоне требования работать исключительно во время компиляции). |
Сообщ.
#98
,
|
|
|
Дело в том, что контракт - это некоторая договоренность между стороной предоставляющей услугу/функционал (вызываемая функция/процедура/метод класса) и стороной запрашивающей услугу/функционал (соответственно вызывающая функция/процедура/класс).
В него входят требования к типу и значению параметров, или к наличию у передаваемого параметра некоторого атрибута/метода, например (ограничимся тем, что можно проверить). В языках со статической типизацией типы данных известны во время компиляции, они описаны в заголовке функции и компилятор проверяет эту часть контракта даже без указаний со стороны программиста. Некоторую сложность представляют возможные преобразования типов, но и с ними можно справиться. В конце концов в таких языках есть перегрузка функций, и можно написать адаптер, проверяющий допустимость преобразования. В языках с динамической типизацией вопрос решается программной проверкой типа переданного значения в рантайме, что надо сказать, здорово напрягает (в питоне, например, предлагают ввести механизм перегрузки функций хотя бы на базе декораторов, чтобы иметь возможность разнести алгоритмы по отдельным функциям и убрать из текста явные проверки) Проверить значение можно только в рантайме. И если это недостаток языков со статической типизацией, то что говорить о типизации динамической, в которой даже тип приходится проверять в рантайме. При этом необходимо еще учесть, что "статические" языки часто работают с встраиваемыми функциями, и в случае константных параметров могут проверку тоже провести во время компиляции. Проверка атрибутов/методов, в связи со статичностью типов, в "статических" языках не требуется. При использовании типов в шаблонах проверяется при компиляции. В случае если приспичит динамически добавлять/удалять атрибуты элементарно моделируется посредством отображений (map), как это делается и в языках с динамической типизацией и в общем-то с той же эффективностью. Единственно, не будет синтаксического сахара, вместо var.someattribute придется писать var.attr("someattribute") var["someattribute"] или что-то подобное Думается, можно даже исхитриться и получить указатель на такой атрибут/метод класса, который будет вести себя подобно настоящему атрибуту/методу, |
Сообщ.
#99
,
|
|
|
Цитата amk @ что надо сказать, здорово напрягает (в питоне, например, предлагают ввести механизм перегрузки функций хотя бы на базе декораторов, чтобы иметь возможность разнести алгоритмы по отдельным функциям и убрать из текста явные проверки) это потому что питон -- убогий недоязычек =) |
Сообщ.
#100
,
|
|
|
Зато концепция у него интересная - объекты и ничего кроме объектов. На поверку почти все они оказываются словарями, но словари опять же содержат объекты.
Цитата korvin @ Ну твои примеры (кстати, что за язык) тоже показывают не бог весть какой крутой язык. Что-то вроде LISP'а, которым никто кроме тебя похоже и не пользуется. питон -- убогий недоязычек |
Сообщ.
#101
,
|
|
|
Цитата amk @ Зато концепция у него интересная - объекты и ничего кроме объектов. На поверку почти все они оказываются словарями, но словари опять же содержат объекты. ничего интересного, довольно избито и примитивно |
Сообщ.
#102
,
|
|
|
Что мне в питоне понравилось, так это его итераторы и генераторы. А что не понравилось - авторы слишком долго шли к идее стабильного API. И хотя они вроде решили наконец его закрепить, подозреваю еще пара версий выйдет, пока они смогут это толком реализовать, а до тех пор серьезную библиотеку для него не напишешь, а значит и программы будут подтормаживать.
|
Сообщ.
#103
,
|
|
|
Цитата amk @ Ну твои примеры (кстати, что за язык) тоже показывают не бог весть какой крутой язык. (Racket, "подмножество" Scheme) мы ведь и не о бог весть каких крутых вещах разговариваем. Добавлено Цитата amk @ Что-то вроде LISP'а, которым никто кроме тебя похоже и не пользуется. Franz.com, ITA Software, Lispworks.com, правда это CL, про Scheme была статья в журнале FP. Контора, в которой работает тов. mv с LOR'а, активно юзает CL, тов. Archimag (Lisper.ru) юзает CL в своей работе. вообще на LOR периодически всплывают темы поиска примеров практического использования CL Добавлено Цитата amk @ Что мне в питоне понравилось, так это его итераторы и генераторы. что же в них крутого? в любом нормальном языке их можно реализовать также, а то и лучше Добавлено Цитата amk @ а значит и программы будут подтормаживать. требующие производительности модули пишут для питона на Си так-то... |
Сообщ.
#104
,
|
|
|
Цитата korvin @ Franz.com, ITA Software, Lispworks.com, правда это CL, про Scheme была статья в журнале FP. Контора, в которой работает тов. mv с LOR'а, активно юзает CL, тов. Archimag (Lisper.ru) юзает CL в своей работе. вообще на LOR периодически всплывают темы поиска примеров практического использования CL Просто глаза разбегаются от обилия вакансий Добавлено Скрытый текст Кстати, господа, а встречал ли кто-то из вас книжку по Scala на великом и могучем? Про басурманские говорить не надо, я про них знаю |
Сообщ.
#105
,
|
|
|
Цитата MyNameIsIgor @ Просто глаза разбегаются от обилия вакансий тебя туда никто не возьмет, не парься =) |
Сообщ.
#106
,
|
|
|
Цитата korvin @ тебя туда никто не возьмет Ещё бы! Нельзя взять того, кто не пойдёт. Цитата korvin @ не парься А если я люблю баню? |
Сообщ.
#107
,
|
|
|
Цитата MyNameIsIgor @ А если я люблю баню? так баня и парилка -- не одно и то же вроде, не? |
Сообщ.
#108
,
|
|
|
Цитата amk @ Дело в том, что слово 'детерминированный' к объектам в программировании почти не применяется. Что подразумевается под объектами? Инстансы? Так это экземпляры конкретных классов с конкретным же способом инициализации. С какой стороны термин применить? А вот к типам, переменным - почему нет. В том же драфте индекс четко содержит variable indeterminate и активно оперирует термином (не)детерминированности как к процессу вычисления типов, так и к процессу инициализации переменных. Цитата amk @ Даже случайные числа в программировании детерминированные (потому и псевдослучайные). А текущая дата - у вас псевдотекущая и пользовательский ввод - псевдопользовательский? Цитата amk @ Согласись, говорить, что сущность, которая просто обязаны быть детерминированной - детерминирована - это то же самое, что говорить, что масло является маслянистым. Если этот паттерн переложить на то, о чем я говорил, то number является integer'истым, number является natural'истым и т.п. Является полиморфный тип тем, чем он является? Или мы не можем определить наверняка, что он в данный момент представляет и смотрим сквозь замочную скважину контракта? А если я использую в качестве предиката недетерминированную функцию? Полиморфный тип все равно всех детерминирует не смотря ни на что? Цитата amk @ Именно этот вариант, похоже, ты и реализовал (что это за язык, кстати). Это Io, как я и писал. Цитата amk @ И такой полиморфизм динамически реализуем и в языках со статической типизацией (с одной поправкой - в языке со СТ нельзя в динамике проверить существование метода или атрибута, но можно проверить тип объекта). Можешь показать на примере первой же строчки, которая модифицирует штатный тип Number и модифицировать похожим образом int? Цитата amk @ По-моему интереснее был бы пример с фабрикой, на основе свойств создающей объект нужного типа. Этот вариант тоже работает при любом виде типизации. Причем, в случае статической типизации без дополнительных накладных расходов при работе с объектом. Фабрика - это один из самых скучных паттернов, как она может быть интересней динамического изменения (не вычисления) типа переменной в момент ее инициализации. Цитата amk @ Вообще, пример с целыми и натуральными числами выглядит несколько надуманным. Угумс, но приходиться работать с тем, что дали Я спросил в самом начале про практичные примеры, но ответа пока не дадено. Цитата D_KEY @ Ты уверен, что ты получаешь доступ к методу foo, именно через контракт number? Ведь в этом контракте о foo ничего не сказано Я как раз уверен, что не получу Цитата D_KEY @ Получаешь ли ты печеньки на работе согласно своему "контракту" с работодателем? С точностью до наоборот. Я хочу печеньки, а мне дают контракт с работодателем, который решил полиморфно эти печеньки у меня спереть и выдавать в конвертах, которые мне надо раскрывать, то бишь кастить, чтобы наконец насладиться кондитерским изделием. Цитата amk @ В случае если приспичит динамически добавлять/удалять атрибуты элементарно моделируется посредством отображений (map), как это делается и в языках с динамической типизацией и в общем-то с той же эффективностью. Динамика - это тебе не ассоциативные массивы прикрутить Как методы вместе с их телами будешь конструировать? Как новые типы создавать? А способом неизвестным на этапе компиляции? Цитата amk @ Зато концепция у него интересная - объекты и ничего кроме объектов. На поверку почти все они оказываются словарями, но словари опять же содержат объекты. Тогда тебе прямая дорога в Smalltalk, Self, вышеупомянутый Io. Вот там воистину все объекты. |
Сообщ.
#109
,
|
|
|
Цитата Guderian @ Цитата D_KEY @ Ты уверен, что ты получаешь доступ к методу foo, именно через контракт number? Ведь в этом контракте о foo ничего не сказано Я как раз уверен, что не получу Так в том и дело, что в случае динамики у тебя вообще нет этого контракта. На мой взгляд, статическую и динамическую типизацию можно свести грамотно в одном языке, как раз через систему контрактов(пред- и пост- условий, а также инвариантов), которая позволит в одних случаях что-то требовать, в других, что-то гарантировать, в остальных же - не препятствовать. Цитата Цитата amk @ Зато концепция у него интересная - объекты и ничего кроме объектов. На поверку почти все они оказываются словарями, но словари опять же содержат объекты. Тогда тебе прямая дорога в Smalltalk, Self, вышеупомянутый Io. Вот там воистину все объекты. А с Ruby что не так? Мне smalltalk понравился(правда опыта мало), но вот синтаксис просто ужасный. |
Сообщ.
#110
,
|
|
|
Цитата D_KEY @ Так в том и дело, что в случае динамики у тебя вообще нет этого контракта. А кто сказал, что он мне нужен? Разные парадигмы - разные подходы. ООП: 1. Копать умеешь? 2. Тогда переоденься в спецодежду. 3. Копай. Динамика: 1. Копай. 2. Не умеешь - не копай. Как-то так Цитата D_KEY @ На мой взгляд, статическую и динамическую типизацию можно свести грамотно в одном языке, как раз через систему контрактов(пред- и пост- условий, а также инвариантов), которая позволит в одних случаях что-то требовать, в других, что-то гарантировать, в остальных же - не препятствовать. На мой взгляд, их не надо сводить вместе. Да и не получится. Статика опять же захочет иметь "пред- и пост- условия" загодя, а динамика "да ну их, потом разберемся" Цитата D_KEY @ А с Ruby что не так? Попробуй определи на нем новый метод в классе, потом его переопредели, а потом удали. У меня не получилось. В расово чистых языках, где все есть объект, это естественные операции, ибо класс - есть тоже объект. В Руби же, даже возможность добавления нового метода объясняется тем, что якобы определение класса просто не закрыто. Цитата D_KEY @ Мне smalltalk понравился(правда опыта мало), но вот синтаксис просто ужасный. Попробуй Io/Ioke. Из Smalltalk'а он взял, пожалуй, больше всех, но при этом подмешано функциональное, которое в большей степени "подсластило" синтаксис и он уже не такой зубодробительный. |
Сообщ.
#111
,
|
|
|
Цитата Guderian @ Цитата D_KEY @ На мой взгляд, статическую и динамическую типизацию можно свести грамотно в одном языке, как раз через систему контрактов(пред- и пост- условий, а также инвариантов), которая позволит в одних случаях что-то требовать, в других, что-то гарантировать, в остальных же - не препятствовать. На мой взгляд, их не надо сводить вместе. Да и не получится. Статика опять же захочет иметь "пред- и пост- условия" загодя, а динамика "да ну их, потом разберемся" Думаю, что это возможно разрулить. Цитата Цитата D_KEY @ Мне smalltalk понравился(правда опыта мало), но вот синтаксис просто ужасный. Попробуй Io/Ioke. Из Smalltalk'а он взял, пожалуй, больше всех, но при этом подмешано функциональное, которое в большей степени "подсластило" синтаксис и он уже не такой зубодробительный. Спасибо за совет Вроде не пробовал. |
Сообщ.
#112
,
|
|
|
Ну как, кто-нибудь попробовал kotlin в реальной жизни и может поделиться впечатлениями?
|
Сообщ.
#113
,
|
|
|
Цитата D_KEY @ Ну как, кто-нибудь попробовал kotlin в реальной жизни и может поделиться впечатлениями? А уже вышла реализация? Я бы попробовал, хотя пока не в "продакшене", а то мало ли чего там недопричесали =) |
Сообщ.
#114
,
|
|
|
А между тем, он действительно вышел, хотя и пока не «production-ready» версия.
http://www.youtube.com/watch?v=BhCDeCKdsGU...be_gdata_player |
Сообщ.
#115
,
|
|
|
а котлин for javascript там работает??
|
Сообщ.
#116
,
|
|
|
Цитата jack128 @ а котлин for javascript там работает?? Вот не пробовал, т.к. было уже поздно, да и JS мне не интересен. =) Может сегодня позже гляну. Вообще у них есть Web demo, где можно попробовать компиляцию в JS. |
Сообщ.
#117
,
|
|
|
Цитата korvin @ JS мне не интересен эх-хе-хех... Если бы мне был бы интересен js, я б kotlin for js и не не смотрел :-( |
Сообщ.
#118
,
|
|
|
Цитата jack128 @ Цитата korvin @ JS мне не интересен эх-хе-хех... Если бы мне был бы интересен js, я б kotlin for js и не не смотрел :-( А, ну я имею в виду, что он мне не интересен как целевая платформа в данном контексте. Хотя теперь можно писать веб-сервер и серверное ПО под Node.JS на Kotlin. |
Сообщ.
#119
,
|
|
|
Цитата jack128 @ Как считаете, взлетит/не взлетит?? Таки взлетел |
Сообщ.
#120
,
|
|
|
Ещё и Ceylon похоронил
|