Вход | Регистрация
    1  2  3   

Лямбда функции

Лямбда функции
Я
   Почему 1С
 
12.02.21 - 14:20
Может вопрос не по профилю форума, но видел подобные вопросы по compscience.
В общем вопрос такой, кто посоветует материал (курсы , книги), чтобы освоить лямбда функции, сами то они просты, но видимо требуют особого понимания как научится мыслить ими.
Я могу читать и понимать код состоящий из каскада лямбда функций, но вот сам так писать не могу (всегда скатываюсь классический код без функциональщины), а хочу практики чтобы набить руку и при этом делать это правильно.
Если кто имеет опыт буду благодарен если поделитесь.
   Serginio1
 
1 - 12.02.21 - 14:40
Широко используется Linq
https://metanit.com/sharp/tutorial/15.1.php
   Почему 1С
 
2 - 12.02.21 - 14:50
(1) Так же очень активное применяются в Kotlin который я сейчас осваиваю, и вот прохожу курсы где можно смотреть решения других участников и 90% этих решений на лямбда функциях в несколько строк и очень красивые. Мои же решения выглядят неуклюже по сравнению с ними, но все мои попытки писать в таком стиле вызывают затруднения, вот и хотелось материал на котором можно натаскаться подобному подходу, поиски по интернету как правило приводят к простому объяснению как работает каждая функция.
   pavig
 
3 - 12.02.21 - 14:57
(2) Приведи пример?
   Serginio1
 
4 - 12.02.21 - 14:59
(2) Посмотри статьи по Linq
Суть  лямба функций в замыкании. Создается анонимный класс где свойствами являются используемые переменные и свойтва
https://itvdn.com/ru/blog/article/closing-in-csharp
   Serginio1
 
5 - 12.02.21 - 15:00
Так же были подводные камни в старых версиях при замыкании переменных цикла
https://habr.com/ru/post/141270/
   Asmody
 
6 - 12.02.21 - 15:05
(4) как же у вас забиты мозги!
Анонимный класс - это способ реализации, своего рода - костыль.
Лямбда-функции и замыкания - это разные, хоть и тесно связанные вещи!
   Asmody
 
7 - 12.02.21 - 15:09
Лямбда-функция - это просто анонимная, т.е. неименованная функция. Всё!
Сила лямбда-функций может проявиться только в языках, где функции являются объектами первого класса. (Изначально в java/c# таковыми не являлись, откуда и появился этот костыль  анонимными классами)
   Asmody
 
8 - 12.02.21 - 15:09
вот https://www.ohaskell.guide/lambda-function.html - просто и понятно
   Провинциальный 1сник
 
9 - 12.02.21 - 15:11
(8) Ключевой вопрос "зачем?". Там на него не дается ответа..
   Почему 1С
 
10 - 12.02.21 - 15:15
(3)
package tictactoe

fun main() {
    println("Enter cells:")
    val inp = readLine()!!.toCharArray()
    val b: Array<Array<Char>> = Array(3) { Array(3) { '_' } }
    for (i in 0..8) b[i / 3][i % 3] = inp[i]
    println("---------")
    for (i in b.indices) { println(b[i].joinToString(prefix = "| ", postfix = " |", separator = " ")) }
    println("---------")

    var wincnt = 0
    var winner = ' '
    for (i in 0..2) { if (b[0][i] == b[1][i] && b[1][i] == b[2][i]) { wincnt += 1; winner = b[0][i] } }
    for (i in 0..2) { if (b[i][0] == b[i][1] && b[i][1] == b[i][2]) { wincnt += 1; winner = b[i][0] } }
    if (b[1][1] == b[0][0] && b[1][1] == b[2][2]) { wincnt += 1; winner = b[1][1] }
    if (b[1][1] == b[0][2] && b[1][1] == b[2][0]) { wincnt += 1; winner = b[1][1] }

    when {
        inp.count { it == 'X' } > inp.count { it == 'O' } + 1 || inp.count { it == 'O' } > inp.count { it == 'X' } + 1 -> {
            println("Impossible")
        }
        wincnt > 1 -> println("Impossible")
        wincnt == 1 -> println("$winner wins")
        wincnt == 0 && inp.contains('_') -> println("Game not finished")
        else -> println("Draw")
    }
}

Вот решение задачи крестики нолики, на входе расположение крестиков и нодликов на выходе анализ на победу 0 или x
   Serginio1
 
11 - 12.02.21 - 15:16
(7) >>Лямбда-функция - это просто анонимная, т.е. неименованная функция. Всё!
То есть она не может быть замыканием?
А вот организация замыкания в C# это анонимный класс
   Почему 1С
 
12 - 12.02.21 - 15:16
Свой код не привожу он в 5 раз длинее
   Serginio1
 
13 - 12.02.21 - 15:19
(7) >> (Изначально в java/c# таковыми не являлись, откуда и появился этот костыль  анонимными классами)
Суть в том, что нужно отдельно хранить замыкаемые переменные ибо лямбды могут передаваться куда угодно и изменяться.
Проще все это организовывать через классы.
   Asmody
 
14 - 12.02.21 - 15:33
(11) Замыкание - "это другое". Замыкание - это сохранение в контексте функции ссылок на внешние переменные. Замыканию не обязательно быть лямбдой. И наоборот - лямбда не обязательно замыкание
   Почему 1С
 
15 - 12.02.21 - 15:45
(10) кстати плохой пример, а хороший найду вернусь к этой теме. Почему то не могу по решенным задачам нормально посмотреть историю на  hyperskill.org где с этим и столкнулся
   Asmody
 
16 - 12.02.21 - 15:52
(10) Это раст что ли? А  when {} это там что?
   Вафель
 
17 - 12.02.21 - 15:54
как можно не понимать лямбда функции?
это же классическое у => х * х
   Вафель
 
18 - 12.02.21 - 15:55
хитрые трюки с замыканиями. это да...
   GANR
 
19 - 12.02.21 - 15:56
А что там понимать? Берём на JavaScript и пишем механизм, который в каждый тег <P> (абзац) в HTML-страничке добавляет атрибуты обнуляющие отступ сверху и снизу. Узнаете 2 вещи - регулярные выражения и лямбды - без этого, если не применять XSLT и работать с HTML-страницей как со строкой просто никак.
   Serginio1
 
20 - 12.02.21 - 15:57
(14) Так в чем разница?
Лямбда может быть замыканием, а может и не быть
Замыкание это лямбда выражение!
   Почему 1С
 
21 - 12.02.21 - 15:58
(17) kotlin, но пример плохой, просто короткий, но сути моего вопроса не раскрывает фигурные скобки это тело
   Asmody
 
22 - 12.02.21 - 15:59
(20) "Замыкание это лямбда выражение" - нет!
   Почему 1С
 
23 - 12.02.21 - 15:59
when это  switch
   Вафель
 
24 - 12.02.21 - 16:00
(19) такое лучше через жквери или дом делать, зачем строки?
   GANR
 
25 - 12.02.21 - 16:02
(24) Была у меня одна задачка специфическая, что вот JavaScript, RichText как строка и ничего вот больше - была печатная форма на BIRT, к которой так просто эти DOM и прочие специализированные инструменты не очень-то и применишь.
   Serginio1
 
26 - 12.02.21 - 17:09
(22) А что?

var i=1;
Func<int> замыкание = () => i + 1;
   Uberschall
 
27 - 12.02.21 - 17:10
(6) (7) один из способов реализации, хотя, да, в Java меньше возможностей для функционального программирования. минус в том, что нельзя сделать inline функцию (минус производительность) или замыкание на нефинальные переменные, но зато можно использовать ФП вместо императивного стиля.
(2) а на каком уровне у Вас java? Мне кажется, без неё в Kotlin делать нечего.
(10) inp.count { it == 'X' }  - это по сути аналог stream'ов для коллекций пошел (встроенная либа для котлин) и т.д.
   Uberschall
 
28 - 12.02.21 - 17:15
(26) замыкание - это способ захвата переменных для использования их в контексте, когда будет выполняться собственно лямбда (контекст её выполнения может не совпадать с контекстов, в котором находится захватываемая переменная). он-захват может происходить, а может и не происходить.
   Доктор Манхэттен
 
29 - 12.02.21 - 17:50
(0) Понять легко. Главное принять что функция - это такой же объект как и любой другой. Как объект-массив или как объект класса или как объект-строка. У которого так же есть ссылка, и который можно передать куда угодно в качестве параметра, по ссылке.
   Serginio1
 
30 - 12.02.21 - 18:01
(28) Читаем внимательно (20)
Я говорю, что замыкание это лямбда выражение;
Лямбда выражение может быть замыканием, а может и нет
Ты с этим не согласен?
 
 Рекламное место пустует
   Почему 1С
 
31 - 12.02.21 - 18:42
(27) Java на уровне университетского курса, Kotlin же это почти та же самая Java, только изящнее
(29) Понимание есть, нет навыка их использования для решения задач и хочется хорошей практики.  Я про использование вида strings.filter { it.length == 5 }.sortedBy { it }.map { it.toUpperCase() }.zip...
Вот таких цепочек. Если тут вроде как это элементарно, то решая обычные задачи я как правило их использую на уровне sort filter map по прямому назначению, народ же оперирует ими уже для цепочки решения.  задачи в целом. Я так чувствую чтобы освоить такой ход мышления нужно сначала освоится в чистофункциональных языках как иной парадигме программирования.

val arr = readLine()!!.toInt().downTo(1).map { readLine()!!.toInt() } - считать с командной строки количество элементов массива и потом считать сами эти элементы в массив
я же пишу
val size = scanner.nextInt()
val array = IntArray(size)
for (i in 0..array.lastIndex) {
    array[i] = scanner.nextInt()
}
   Почему 1С
 
32 - 12.02.21 - 18:48
val arr = IntArray(scanner.nextInt()) { scanner.nextInt() }
или вот тоже самое
   Asmody
 
33 - 12.02.21 - 18:58
(31) самое сложное в этих цепочках - левый и правый reduce. остальное очевидно
   Провинциальный 1сник
 
34 - 12.02.21 - 19:00
Нихрена не понима... Нас такому не учили(
   Asmody
 
35 - 12.02.21 - 19:03
и вот в таких штуках
val arr = readLine()!!.toInt().downTo(1).map { readLine()!!.toInt() }
надо очень осторожно с !! - если я правильно понимаю, то это реализация nullsafe. Ну, т.е. если там null, то выполнение цепочки остановится и все выражение вернет null
особенно, когда оно внутри map - могут получиться элементы null
   Почему 1С
 
36 - 12.02.21 - 19:11
(35) Котлин вообще на уровне компиляции запрещает обращение к null, а вот эта !! штука это подстройка под Java (readline - это Java метод) и значит она что мы гарантируем что функция java с !! никогда не возращает null
   Доктор Манхэттен
 
37 - 12.02.21 - 19:28
(31) Ты неправильно пишешь, потому что объявляешь массив в одном месте, а инициализируешь в другом, еще и в цикле его модифицируешь много раз. Это антипаттерн. Нужно инициализировать массив только один раз, через val arr = ..., и больше его не модифицировать, как будто это константа. Тогда научишься писать в правильном стиле.
   Доктор Манхэттен
 
38 - 12.02.21 - 19:30
(35) Если приходится использовать nullsafe, значит решение изначально спроектировано не верно. Нужно искать ошибку где-то выше.
   Почему 1С
 
39 - 12.02.21 - 19:40
(37) Тут задача заполнить массив определенным количеством элементов из ввода, покажи как сделать тоже самое не инициализируя массив и не модифицируя затем его элементы?
Напоминаю сами элементы это последовательный ввод с stdin
   Доктор Манхэттен
 
40 - 12.02.21 - 19:48
(39) val arr = readLine()!!.toInt().downTo(1).map { readLine()!!.toInt() }
   Почему 1С
 
41 - 12.02.21 - 20:01
toInt().downTo(1) - определение ренджа
map { readLine()!!.toInt() } - формирование list по ренджу
List можно заранее не инициализировать, как не инициализировать заранее Array
   Serginio1
 
42 - 12.02.21 - 20:54
(14) Кстати в .Net есть такое понятие как деревья выражений
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/expression-trees/

Выглядит как лямда функции но ими не являются Expression<Func<int, bool>> lambda = num => num < 5;

Широко применяются в Linq для IQueryable
https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/expression-trees/how-to-use-expression-trees-to-build-dynamic-queries
   Ненавижу 1С
 
43 - 12.02.21 - 21:40
(42) прикольная вещь кстати
Но что-то там не до крутили раз приходится так выкручиваться https://m.habr.com/ru/company/jugru/blog/423891/
   Asmody
 
44 - 12.02.21 - 21:56
(38) не, ну как? там же внешний мир. в теории может случиться так, что readLine() вообще неоткуда будет читать. что тогда оно вернет?
   Asmody
 
45 - 12.02.21 - 21:57
Таки вывалится:

"Для любителей NPE существует ещё один способ. Мы можем написать b!! и это вернёт нам либо non-null значение b (в нашем примере вернётся String), либо выкинет NPE"
https://kotlinlang.ru/docs/reference/null-safety.html
   Доктор Манхэттен
 
46 - 12.02.21 - 22:44
(44) По хорошему нужно написать свою функцию вместо readLine(), которая все проверки делает внутри себя, а не снаружи костылями, и не возвращает ничего кроме числа. Если не ввели ничего, то возвращает 0, если ввели какие-то цифры, то возвращает это число. Если ввели неправильный текст, то выбрасывает исключение, но не возвращает никаких null. Это же основы чтобы не говнокодить.
   Asmody
 
47 - 12.02.21 - 22:55
(46) Зачем изобретать велосипед? readLine() - функция JVM. ниже падать некуда особо
   ДедМорроз
 
48 - 12.02.21 - 23:26
Лямбда функция это не совсем анонимная функция,это фактически загрузка программного кода в интерпретатор.
На компиллируемых языках смысла в анонимных функциях нет,в принципе,т.к.компиллятор все равно будет создавать код,который будет иметь место и адрес,а есть ли у нее имя или нет,это внутри исполняемого кода будет не видно.
А вот загрузить в интерпретатор только что созданный код-это один из способов программного изменения кода программы.
Почему-то,этого все бояться,но за этим будущее.
   Ненавижу 1С
 
49 - 12.02.21 - 23:44
(48) анонимные функции в компилириуемых языках это синтаксический сахар. Позволяет описывать функцию в точке создания ссылки на неё. А раз так, то можно применить и замыкание, но не обязательно.
Кстати, в компилириуемых языках в точке вызова может и не известен быть адрес функции. Например, если она передается параметром в другую функцию.
   Доктор Манхэттен
 
50 - 12.02.21 - 23:49
(47) Ниже не нужно. Нужно выше
   Доктор Манхэттен
 
51 - 12.02.21 - 23:55
(48) Ты все перепутал. Лямбда функция вовсе не создается при выполнении программы, она задается на этапе программирования, и ее код нельзя менять во время выполнения.
Это только синтаксис, и ничего более. С тем же успехом в той же точке можно было бы объявить обычную функцию, и ничего бы не изменилось.
   sitex
 
52 - 12.02.21 - 23:56
(42) Субъективное мнение. не соглашусь
   Ненавижу 1С
 
53 - 13.02.21 - 00:04
(52) с чем конкретно не согласен?
   Доктор Манхэттен
 
54 - 13.02.21 - 02:56
(53) Пока еще не понял с чем не согласен.
   Почему 1С
 
55 - 13.02.21 - 07:01
(37) Я так и не понял антипатеррна с с инициализацией массива и заполнением его в цикле, дай ссылку на сам антипаттерн?
   Доктор Манхэттен
 
56 - 13.02.21 - 08:08
(55) Даже не знаю как еще проще объяснить. Но попробую:
Представь что массив - это константа после того, как он объявлен. И его значения тоже константы. Их нельзя второй раз перезаписывать. Создал один раз массив, и все. Больше его нельзя менять. Так понятно?
   Почему 1С
 
57 - 13.02.21 - 08:39
(57) ссылку на антипаттерн дай я там почитаю, пойму, можно на английском.
   ДедМорроз
 
58 - 13.02.21 - 09:43
(51) как бы,в javascript мы при определении описываем тело функции строкой,и можем ее собрать так,как нам нужно.
В компиллируемых языках для некоторого изменения кода используются указатели на функции. Собственно,любой код имеет адрес точки входа,то,что ее ни программист ни интерпретатор явно не видят,не говорит,что ее нет.
   ДедМорроз
 
59 - 13.02.21 - 10:05
И потом,в любом языке мы можем определить сложное выражение из арифметических операций,типа sin(x*0.85)*(y+(2*x))+28.5*exp(x+y), чем вам не лямбда-функция.
   Кирпич
 
60 - 13.02.21 - 10:08
Херня это всё. Куда снег девать? Через забор уже переметает.
 
 Рекламное место пустует
   Вафель
 
61 - 13.02.21 - 12:26
(56) если важна скорость работы, то каждый раз пересоздавать массив - некомильфо
   Serginio1
 
62 - 13.02.21 - 12:42
(43) На то они и деревья выражений. С одной стороны они были придуманы как дерево для разбора и при этом еще могут компилироваться в рантайме.
Круть. Но не без наворотов. Кстати нет родного сериализатор десериализатора

(59) Можем. Только в замыкании
x может быть свойством объекта
y локальной переменной метода да еще внутри yield.

При этом эти значения могут меняться после передачи этой лямбды в другой объект.
   ДедМорроз
 
63 - 13.02.21 - 12:53
Это называется передача по ссылке.
Смысл передачи функции вместо результата только в том,что значение функции будет вычислено тогда,когда нужно,в случае многопоточности и возможного изменения начальных параметров это очень важно.
В остальных случаях,в принципе,все на усмотрение транслятора.
   Злопчинский
 
64 - 13.02.21 - 12:53
(10) какято хрень полная а не решение задачи. хотя перебор - тоже решение. или я ничего не понял
   Serginio1
 
65 - 13.02.21 - 13:30
(63) В любом случае лямбда выражение это функция. Просто в .Net создается анономный класс во время компиляции, в рантайме создается объект этого класса и передается метод этого класса.
Когда в .Net еще не было лямбд были анонимные методы
https://github.com/dotnet/csharplang/issues/1239

И было очень не удобно. Но с приходом Linq появились и лямбды которые могли быть замыканием.
Да и что касается ссылок на свойства класса в .Net до до недавнего времени их и не было.
А что касается переменной метода, то как быть с этой ссылкой если ссылка на лямбду осталась уже после того, как покинули метод?

В .Net есть очень удобная конструкция yield для посироения итераторов (в том числе и для рекурсивного обхода)
Там как раз и начали генерить классы для построения итераторов. В том числе и для async await
   ДедМорроз
 
66 - 13.02.21 - 13:42
Ссылка на контекст-это вообще проблема всех языков.
Если у нас контекст функции живёт в стеке,то сделать на него ссылку можно,пока мы не вышли из функции,а после выхода он разрушается.
Соответственно,мечтая о ссылках,приходится контекст куда-то прятать из стека.
С одной стороны,это очень удобно,т.к. позволяет делать несколько функций с одним контекстом,ну то есть объект в понимании объектно ориентированного языка.
С другой стороны,для контекстов также начинает работать сборка мусора,и программист может "потерять" в контексте большой и ненужный объект.
Опять же,без фильтрации контекста тоже сложно,некую фильтрацию обеспечивает наследование классов,но не до конца,иногда хочется явно указать,что должно быть в контексте. Ну то есть передавать все в параметрах функции,что опять же,приводит к расходу памяти,так как при вложенных вызовах один и тот же параметр просто перелетает из контекста в контекст.
Что касается отложенного исполнения,то это изобретение геморроя на пустом месте. Функции обратного вызова реализуют отложенное исполнение на порядок лучше,так как все системные вызовы,приводящие к отложенному исполнению,как раз работают на прерываниях и обратном вызове.
С учётом возможности передачи контекста в обратный вызов про остальные реализации можно забыть.
   ДедМорроз
 
67 - 13.02.21 - 13:48
Собственно,передача контекста важна в следующем случае.
Допустим из-вне вызывается экспортная функция или метод объекта с двумя параметрами A и B.
Мы хотим,чтобы одному ввзывателю была передана одна функция,а другому - другая,так как обработка зависит от ввзывателя. Простое решение-создание двух заглушке,которые вызывают функцию с третьим параметром,описывающим вызывателя.
Для объекта существует возможность или создания двух объектов или создание объектов-заглушек.
Когда же есть контекст,то мы просто передаём дополнительную информацию в нем.На самом деле,транслятор также создаёт несколько функций,но программист этого не видит и об этом не задумывается.
   Serginio1
 
68 - 13.02.21 - 14:42
(66,67) Это все лирика. Понимаешь замыкания и удобны тем, что вся магия делается компилятором.
Простейшее решение просто создаешь лямбду функцию и передаешь куда угодно и не задумываешься, что и как и когда её будут использовать.
Вот в 1С нет замыканий и этот очень обедняет язык.
   Asmody
 
69 - 13.02.21 - 14:46
"и не задумываешься" - вот это особенно заметно
   Ненавижу 1С
 
70 - 13.02.21 - 15:04
(69) это к чему?
   Asmody
 
71 - 13.02.21 - 15:36
(70) это к слову
   Serginio1
 
72 - 13.02.21 - 17:17
(69) А можно поподробнее про особенно заметно? Что именно меня так выдало?
Про "не задумываешься" приведу конструкции для async await для TypeScript когда JS их не поддерживал
https://stackoverflow.com/questions/42412145/what-is-a-state-machine-in-terms-of-javascript-promises-and-c-sharp-asyc-await

Мне не интересно как раскручивают деревья выражений провайдеры Linq запросов в SQL запросы.
Там реально конструкции могут быть сильно навороченные. Я голову лучше забью другими вещами. Но суть, что и как я знаю.
И если скорость не соответствует критериям, тогда только и ищу узкие места и занимаюсь оптимизацией
   Asmody
 
73 - 13.02.21 - 18:51
Если ты пишешь цепочку типа list.filter(fn1).map(fn2).foldr(fn3), сколько в результате будет циклов по побору данных? а если вспомнить про иммутабельность, сколько памяти потребует такой фокус?
так что писать в функциональном стиле очень приятно, но "не задумываясь" может привести к нехорошим последствиям
   Asmody
 
74 - 13.02.21 - 18:52
"побору данных" => "набору данных"
   Serginio1
 
75 - 13.02.21 - 19:18
(73) Ты пропустил про yield про который я писал. Это ленивые итераторы.
Здесь про оптимизаторы и сравнение yield с массивом
https://mattwarren.org/2016/09/29/Optimising-LINQ/

Даже без оптимизаторов Where склеиваются.
https://docs.microsoft.com/ru-ru/dotnet/standard/linq/performance-chained-queries

Ну и еще раз про оптимизаторы Linq
https://github.com/antiufo/roslyn-linq-rewrite

Кроме того есть Parallel LINQ
https://docs.microsoft.com/ru-ru/dotnet/standard/parallel-programming/introduction-to-plinq

Оптимизациями нужно заниматься тогда, когда это приносит ощутимый прирост в скорости.
От того что ты будешь заниматься излишней оптимизацией ты потратишь время на ускорение, которое не заметно пользователю, но заметно твое время потраченное на излишнюю задумчивость, ты потратишь лишние ресурсы работодателя или свои.

Вот в 1С нет ни замыканий ни Linq от этого больше времени тратится на циклы, структуры. Отсутствие интеллисенса при запросах к базам итд.
Поверь производительность труда на C# на порядки выше чем на 1С
   ДедМорроз
 
76 - 13.02.21 - 19:20
Так все современные языки сделаны,чтобы не задумываясь,а потом обычный код на Си,который делает примерно то же самое кроет эту всю чудо-реализацию скоростью в десять,а то и сто раз быстрее,не расходуя память.
Фильтраторы и итераторы хороши там,где без них сложно,и время на написание кода сравнимо со временем его исполнения(другими словами,если код исполняется несколько раз,если не вообще единожды)
   Serginio1
 
77 - 13.02.21 - 19:42
(76) Угу. С развитием .Net Core разница между С++ сокращается. Вводятся новые типы данных, оптимизируются компиляторы итд.
Ни о каких десятках раз даже на Simd операциях нет.
Старая песня. Нужно писать код быстро, без ошибок используя эффективные алгоритмы. А не выискивать экономию пару тактов.
Тот же Linq как раз это все и дает.
Ты же не пишешь пргграммы на Си, хоть он по твоим словам и дает огромный прирост в скорости, а используешь тормозной интерпретатор 1С
   Провинциальный 1сник
 
78 - 13.02.21 - 20:59
(77) Код в 1с принято писать "для читателя". Чтобы потом ты через пару лет или твой преемник мог легко в нём разобраться. А все эти "синтаксические сахары" провоцируют писать нечитаемый код. Как всякие гики в Си писали в своё время с кучей ++ в одном выражении, превращая выражение в головоломку..
   Serginio1
 
79 - 13.02.21 - 21:14
(78) Как раз разбираться с Linq намного проще чем в лапша коде принятого в 1С.
И поверь разбираться в коде C# намного проще чем в 1С. И поверь мною прочитаны десятки мегабайтов кода. И у меня есть огромнейший опыт
Не надо сравнивать C# и С++. C# на порядки высокоуровнее
   Asmody
 
80 - 13.02.21 - 21:24
(75) видал я такое "не занимайтесь оптимизацией", когда внутрь filter() закинули функцию, которая из БД читает. за запросы в цикле в 1С принято бить линейкой по рукам. а тут нормально "не задумываясь" же
   Serginio1
 
81 - 13.02.21 - 21:45
(80) Еще раз в Linq to EF не закинешь функцию только Expression
Почитай на досуге
http://catalog.mista.ru/1c/articles/402433/

Если в некоторых языках нет Linq то это проблемы языка.
А вот в 1С запросы в цикле достаточно частое явление.

И ты правда считаешь что я такие вещи делаю не задумываясь? Почему ты так решил?
Или покажи мой код. Его очень много http://catalog.mista.ru/profile/82159/objects/

Про "незадумываясь" я писал про внутреннюю реализацию Linq запроса, замыкания.
А выстрелить себе в ногу можно и без замыканий итд. Для этого есть профайлеры и неоптимальный код быстро находится.
   Serginio1
 
82 - 13.02.21 - 21:48
81 Я так скажу, все разговоры про тормознутость Linq, не экономии памяти замыканий проходили этак лет 10 назад.
В итоге подавляющее большинство используют Linq замыкания и не парят себе мозги от излишней оптимизации.
Их скорость устраивает
   Asmody
 
83 - 13.02.21 - 21:52
(81) мир не ограничивается Linq и Net. но из твоих речей уже понятно, что на Net можно писать и без мозгов, "не задумываясь"
   Ненавижу 1С
 
84 - 13.02.21 - 22:22
(73) один же цикл и память под один экземпляр данных одна будет
а вот объектов-оберток для ленивых вычислений будет несколько
   Доктор Манхэттен
 
85 - 13.02.21 - 22:46
(57) Более простого объяснения чем уже написано я не нашел для тебя, сорян.
   Доктор Манхэттен
 
86 - 13.02.21 - 22:47
(58) Покажи как ты собираешь тело функции строкой? Это делается во время написания программы, или на этапе выполнения?
   Serginio1
 
87 - 13.02.21 - 22:48
(83) Да не ожидал от тебя. И главное почему ты так считаешь так и не объяснил.
Ты же не задумываешь как компилятор оптитмизирует твой код.
Откуда такие выводы?
Программистский мир вбирает в себя все лучшее, что есть в различных языках. Тот же JS подтянулся к TS. TS берет лучшее из других языков. Развивается котлин.
И развиваются в сторону функциональщины и оптимизации структур приближая скорость работы к C++ компиляторам.
Просто в твоем мире нет Linq. Но я то в этом не виноват.
А ты меня обзываешь безмозглым. Обидно, да!
   Asmody
 
88 - 13.02.21 - 23:24
(87) что ты прицепился к своему linq? нельзя программировать "не задумываясь". применяя какие-то конструкции и паттерны, даже если они "общеупотребительны", надо отдавать себе отчет что ты делаешь и зачем.
   ДедМорроз
 
89 - 13.02.21 - 23:35
1с процедурный язык.
Понятно,что разбираемость кода на 1с всегда хуже,чем у объектно ориентированных языков.
Опять же,на Си++,как и на Си можно сделать все,особенно всякие фокусы с указателями и структурами,которые в .Net,в принципе,невозможны из-за метода исполнения.
Опять же,если говорить о Си++,то уже у него есть проблемы со скоростью,не говоря уже об всем остальном.
А читаемость,скажем у ассемблера или Си,на самом деле,хуже чем у многих других языков из-за макросов препроцессора,когда написано одно,а после трансляции получается совершенно другое.
Ну и когда вместо цикла используется рекурсия.
В Си++ и без плюсов можно сделать такое,что сразу не разберёшь,особенно учитывая переопределение операторов и проведение классов при сложном наследовании.
   ДедМорроз
 
90 - 13.02.21 - 23:43
Что же касается запросов выбора,то системе нужно указать источник,критерии отбора и она уже сама должна анализировать что и как будет преобразовано в код.
На выходе же мы должны получить множество. Проблема в том,что понятия множества в программировании,в принципе,нет,есть массивы,есть последовательности,а чтобы сделать множество,для него нужно представление.
На языке множеств и соответствий описать многие алгоритмы вообще можно одной строкой.
   Asmody
 
91 - 14.02.21 - 00:25
"Что же касается запросов выбора,то системе нужно указать источник,критерии отбора и она уже сама должна анализировать что и как будет преобразовано в код." - это сейчас было описание любого декларативного языка. От пролога до SQL.
   Ненавижу 1С
 
92 - 14.02.21 - 00:47
(90) "чтобы сделать множество,для него нужно представление"
какая-то непонятная мне мысль
   Asmody
 
93 - 14.02.21 - 00:53
(92) он говорит о том, что множество в математическом смысле на компьютере не реализовать. компьютер оперирует линейными упорядоченными структурами - списками. а множество мы можем только смоделировать.
   Asmody
 
94 - 14.02.21 - 00:55
хотя тот же haskell с его классами типов позволяет абстрагироваться на уровне множеств
   Ненавижу 1С
 
95 - 14.02.21 - 01:12
(93) ну это всего лишь расположение в памяти, как и пишешь в (94) от этого можно абстрагироваться
я что-то последнее время считаю, что народ пишет много воды на пустом месте, наверное просто старею
   Доктор Манхэттен
 
96 - 14.02.21 - 02:46
(89) Процедурные языки хуже объектно-ориентированных, а объектно-ориентированные хуже функциональных.
   ДенисЧ
 
97 - 14.02.21 - 05:27
(96) Чем хуже?
   ДенисЧ
 
98 - 14.02.21 - 05:27
(89) "на Си++,как и на Си можно сделать всякие фокусы с указателями"

Если в языке нужны фокусы, то это явно плохой, слабовыразительный язык.
   Доктор Манхэттен
 
99 - 14.02.21 - 05:50
(97) Чем объектно-ориентированные
   ДенисЧ
 
100 - 14.02.21 - 05:56
(99) Не убедил.
  1  2  3   

Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь во втором сообщении вам дадут решение, а в двадцатом дадут правильное решение. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.