17.12.2015, 15:47 | #21 |
Участник
|
F# - шутку заценил )
убедил. да, я имел в виду что нет синтаксического сахара, который автоматически вместо наименования поля вызывает геттер или сеттер. Цитата:
Ты будешь смеяться. Но семантически ни val, ни var ничего не значат. просто val говорит компилятору автоматически сформировать геттер для данного свойства. а var - автоматически сформировать геттер и сеттер для свойства. и все. дальнейший анализ и поведение определяется не ключевыми словами val, var, а наличием геттера-сеттера. и как раз котлин показывает что этот подход отлично работает. специальные ключевые слова со специальной семантикой не нужны! со всеми вытекающими последствиями для тех, кто пишет, и тех, кто читает. Цитата:
угу. геттер и сеттер выполняют те же функции. плюс кучу других обязанностей. а код проще для понимания. если говорить про Аксапту, то примерно так произошло с наследованием таблиц. ввели фичу. а можно было сделать намного проще. )))) я собственно об этом и говорю - можно подсмотреть как выглядит уже реализованная идея и подсмотреть на последствия. Последний раз редактировалось mazzy; 17.12.2015 в 15:54. |
|
17.12.2015, 16:41 | #22 |
Участник
|
Расшифруй.
Цитата:
Ты будешь смеяться. Но семантически ни val, ни var ничего не значат.
Classes in Kotlin can have properties. These can be declared as mutable, using the var keyword or read-only using the val keyword Цитата:
просто val говорит компилятору автоматически сформировать геттер для данного свойства.
а var - автоматически сформировать геттер и сеттер для свойства. и все. Да и для переменных тоже самое. Просто полей нет и все унифицированно чисто синтаксически. Цитата:
бгггг.
угу. геттер и сеттер выполняют те же функции. плюс кучу других обязанностей. а код проще для понимания. |
|
17.12.2015, 17:08 | #23 |
Участник
|
ты назвал F# практическим )
Конечно же нет. Рассказывай. Цитата:
И обрати внимание, здесь не сказано, что это единственный способ "объявить" )))) а является mutable, если есть сеттер. заданный любым образом. хоть через var, хоть вручную написанный сеттер. Отсутствие метода - семантическая разница. Но не отсутствие ключевого слова. Если ключевое слово отсутствует, но сеттер задан вручную, то свойство является mutable. Если сеттер отсутствует, но есть геттер, то свойство является readonly. Если и сеттер, и геттер отсутствуют, то свойство является private для класса. макс, ну ощути жеж разницу. познай Еще раз: = ключевое слово не имеет значения (семантики) = ключевое слово всего-лишь заставляет компилятор объявить дефолтный геттер и/или сеттер. (синтаксический сахар) = значение имеет лишь наличие или отсутствие геттера или сеттера. Важно: геттер или сеттер можно объявлять вручную и без ключевого слова. Цитата:
Когда-нибудь... мы вместе с улыбкой будем вспоминать... Последний раз редактировалось mazzy; 17.12.2015 в 17:26. |
|
17.12.2015, 18:19 | #24 |
Участник
|
Для определенных применений вполне. type providers, декларация и вывод единиц измерения.
Цитата:
Конечно же нет. Рассказывай.
Цитата:
= ключевое слово не имеет значения (семантики)
= ключевое слово всего-лишь заставляет компилятор объявить дефолтный геттер и/или сеттер. (синтаксический сахар) |
|
17.12.2015, 19:13 | #25 |
Участник
|
Ещё пару слов про сахар. На Хабре была интересная статья Назад в будущее, или Hello World сегодня и тридцать лет назад. В ней приведена реализация одного и того же приложения (Hello, World!) для Windows 1 и для Windows 10. Первая реализация написана на С++, а вторая на JavaScript. Мне очень интересно, и я думал сделать опрос, в котором хотел спросить какая реализация интуитивно понятнее: на C++ или JS + UWP. Для меня, несмотря на то, что я уже довольно долго пишу на AngularJS, а также для других разработчиков, выразивших своё мнение в комментариях, интуитивно понятнее оказалась реализация на C++. Вот полностью моё мнение:
Цитата:
но самое главное… – это сильно возросшая выразительность API.
возможности использовать promise сильно облегчают написание кода и его читаемость var promise = new WinJS.Promise.join([ WinJS.Resources.processAll(), WinJS.UI.processAll() // Add basic logic ]).then(function () { // Update window title Да тут читаемость вообще зашкаливает. Я в 1997 году в Delphi бы форму с кнопкой About которая вызывает диалоговое окно сделал бы в общей сложности написав одну строку «Form2.ShowModal()». |
|
|
За это сообщение автора поблагодарили: Lemming (3). |
17.12.2015, 19:32 | #26 |
Участник
|
Поэтому, я думаю, что всё хорошо в меру и не стоит вводить более сложные и менее очевидные вещи туда, где это явно будет лишним. И ERP вот точно не то место, где нужно всеми силами стремиться к чистоте кода, математическим абстракциям, анонимным функциям и прочему.
|
|
17.12.2015, 19:54 | #27 |
Участник
|
Разве не видно, что язык тут не причем a а виновата тотальная асинхронность введенная для поддержки мобильных дивайсов?\
UPD сравните с версией на C# + XAML Последний раз редактировалось belugin; 17.12.2015 в 20:12. |
|
17.12.2015, 20:09 | #28 |
Участник
|
Цитата:
например какой код более очевиден: X++: int I; for (I=1; I<=conLen(items); I++) { if (conPeek(items, I) > 10) { print conPeek(items, I); } } X++: foreach(var item in items.Where(x => x>10)) { print item; } |
|
17.12.2015, 20:45 | #29 |
Участник
|
Цитата:
Сообщение от belugin
Разве не видно, что язык тут не причем a а виновата тотальная асинхронность введенная для поддержки мобильных дивайсов?\
UPD сравните с версией на C# + XAML |
|
|
За это сообщение автора поблагодарили: belugin (4). |
17.12.2015, 20:58 | #30 |
Участник
|
Цитата:
Сообщение от belugin
Мне кажется тут все скопом, про неочевидность согласен, про остальное непонятно. Как вы, например, понимаете чистоту кода, к которой надо стремиться?
например какой код более очевиден: X++: int I; for (I=1; I<=conLen(items); I++) { if (conPeek(items, I) > 10) { print conPeek(items, I); } } X++: foreach(var item in items.Where(x => x>10)) { print item; } Второй код мне, разумеется, тоже понятен. Он более чище чем первый. Но что будет если нужно будет реализовать несколько более сложное условие? Красота в одну строку пропадёт. Про красоту и чистоту кода можно говорить и спорить долго и тут у каждого своя правда, мораль, вкус. Кстати, посмотрите ещё одну статью на Хабре про толстые стрелочные функции, и подумайте о коде в конце. Он чист? Да! Прост? Очевиднее? Вопрос,,, А ведь эти люди пишут на JavaScript. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
17.12.2015, 21:33 | #31 |
Участник
|
Не знал. Чт просто знаю, что в winphone все API переданы на асинхронныет чтобы меньше нагружали и были responsive.
А это именно свойство языка? Т.е. Где то в языке есть такая семантика, что нельзя много потоков или просто текущий рантайм такой? |
|
17.12.2015, 21:43 | #32 |
Участник
|
Цитата:
И меньше возможности ошибся. С многострочностью можно бороться также как вы делаете в x++ SQL - при помощи отступов. А еще условия в функции и константы. Просто есть некая привычка. |
|
18.12.2015, 01:54 | #33 |
Участник
|
Цитата:
а на контроль над многопоточным приложением, на параллельные вычисления. вот хорошая лекция "про это" Зачем писать в стиле LINQ, Java Stream параллельная обработка - ой как нужна в ERP распараллелить расчет зарплаты, расчет налоговых регистров, расчет себестоимости. и ведь в Аксапту все равно приходится вводить параллельную обработку (см. расчет себестоимости). Тот проект, где я сейчас работаю, без параллельных вычислений давно сдох бы. На этом проекте почти все выполняется в многопоточном фреймворке. Последний раз редактировалось mazzy; 18.12.2015 в 02:08. |
|
18.12.2015, 03:20 | #34 |
Участник
|
Цитата:
ну, как же? а макросы? макросы не имеют семантики, но имеют синтаксис. var/val в Котлине не имеет семантики, а просто заставляет компилятор сделать некие действия за программиста (некие суперинтеллектуальные макросы, которые позволяют объявить методы - геттеры и сеттеры). var/val в Котлине ничего не значат, если эти некие действия программист уже сделал вручную. Поэтому в Котлине семантику имеют только методы. Или отсутствие методов. Так работают соглашения. про семантику: почитай, например, про const у Страустрапа. Еще со второго издания const имеет семантику в C++. Особенно меняется смысл у функций с const-аргументами и const-результатами. Код: const char* pc = "asdf"; // указатель на константу pc[3] = 'a'; // ошибка pc = "ghjk"; // нормально char *const cp = "asdf"; // указатель-константа cp[3] = 'a'; // нормально cp = "ghjk"; // ошибка const char *const cpc = "asdf"; // указатель-константа на const cpc[3] = 'a'; // ошибка cpc = "ghjk"; // ошибка pc = cp; // ошибка? cp = pc; // ошибка? cpc = pc; // ошибка? pc = cpc; // ошибка? cpc = cp; // ошибка? cp = cpc; // ошибка? // 4 разные сигнатуры! char* strcpy(char* p, const char* q); // не может изменять *q const char* strcpy(char* p, const char* q); // не может изменять *q, возвращает указатель на константу char*const strcpy(char* p, const char* q); // не может изменять *q, возвращает указатель-константу const char*const strcpy(char* p, const char* q); // не может изменять *q, возвращает указатель-константу на const кстати, const в ax7 похоже не имеет семантики, а только синтаксис ) mfp: X++ in AX7: Const keyword надо будет проверить конструкцию X++: const List myList1;
const List myList2 = new List(); Последний раз редактировалось mazzy; 18.12.2015 в 03:32. |
|
18.12.2015, 07:50 | #35 |
Участник
|
Цитата:
Сообщение от mazzy
дело в том, что современный вектор развития направлен не на математические абстракции,
а на контроль над многопоточным приложением, на параллельные вычисления. вот хорошая лекция "про это" Зачем писать в стиле LINQ, Java Stream параллельная обработка - ой как нужна в ERP распараллелить расчет зарплаты, расчет налоговых регистров, расчет себестоимости. и ведь в Аксапту все равно приходится вводить параллельную обработку (см. расчет себестоимости). Тот проект, где я сейчас работаю, без параллельных вычислений давно сдох бы. На этом проекте почти все выполняется в многопоточном фреймворке. Для параллельного программирования можно использовать более подходящие средства. Например, в СУБД для реализации параллельных запросов используют массивно-параллельную архитектуру (MPP). А в C++ есть замечательная библиотека MPI без всякого функционального программирования и прочих абстракций и парадигм. А Linq2SQL это для достаточно простых запросов и небольших данных. Как только появляются более сложные запросы или большие данные возвращаются к обычному SQL. |
|
18.12.2015, 08:02 | #36 |
Участник
|
Цитата:
Сообщение от AP-1055D
Первый код мне более понятен интуитивно, и, главное, я знаю как его расширять, вводить дополнительные условия при необходимости.
Второй код мне, разумеется, тоже понятен. Он более чище чем первый. Но что будет если нужно будет реализовать несколько более сложное условие? Красота в одну строку пропадёт. |
|
18.12.2015, 08:04 | #37 |
Участник
|
Цитата:
Pure functional programming completely prevents side-effects and provides referential transparency, which makes it easier to verify, optimize, and parallelize programs, and easier to write automated tools to perform those tasks. См также plinq |
|
|
За это сообщение автора поблагодарили: AP-1055D (1). |
18.12.2015, 08:13 | #38 |
Участник
|
Цитата:
Сообщение от AP-1055D
На самом деле современный вектор развития направлен именно на математические абстракции, более чистое, функциональное программирование. Во-первых, в основу LINQ положено понятие лямбда-исчисления. Это математическая абстракция, введённая математиком Алонзо Чёрчем. Во-вторых, LINQ разрабатывалась как абстракция доступа к данным. Мы хотим получать результат на разных типах данных, используя один язык, способ. Это абстракция, направленная на унификацию работы с данными, не имеющая ничего общего с параллельными вычислениями. В третьих, как уже говорил, сейчас наблюдается введение элементов функционального программирования. Однако, функциональное программирование не ставит цели распараллеливание кода.
|
|
18.12.2015, 08:14 | #39 |
Участник
|
Цитата:
Но развитие - в сторону параллельности. Особенно в массовых языках. В лекции об этом и говорилось. Цитата:
Сообщение от AP-1055D
Во-первых, в основу LINQ положено понятие лямбда-исчисления. Это математическая абстракция, введённая математиком Алонзо Чёрчем.
Цитата:
Они сами по себе нах никому не сдались. Цитата:
но тот вариант функционального программирования, который появляется в массовых языках, появляется именно из-за возможности распараллелить. сравни хаскель и монадами и та куцая часть функционального программирования, которая попала хотя бы в скалу. не говоря уж об ошметках "функции высшего порядка" в C# и Java... у меня такое ощущение, что вы лекцию не посмотрели. докладчик так усилено напирал на ответы на ваши вопросы. Цитата:
а почему только SQL? это ж реляционные данные. вон, даже в аксапту вводят совершенно нереляционную entity. |
|
18.12.2015, 08:47 | #40 |
Участник
|
Цитата:
Мы по разному понимаем выражение "имеет семантику", вернемся к аналогиям с С# X++: fun main(args: Array<String>) { var a = "1"; a = "2"; } Будет то же самое, как в C# приписать const к переменной. Т.е. условно говоря, можно переписать то же самое на с# c чуть большим или чуть меньшим количеством ключевых слов. Разница непринципиальна. Само понятие свойств в C# есть. |
|
Теги |
f#, kotlin |
|
|