Труд вопреки насмешкам
|
|||||||||||||||||
1 | |||||||||||||||||
Действительно ли высокоуровневые языки программирования не позволяют определенных действий умышленно?12.01.2021, 18:09. Показов 7048. Ответов 94
Метки нет (Все метки)
Речь идет не о низкоуровневых действиях, таких как прямое управление памятью, а наоборот, об ультра-высокоуровневых конструкциях. В этой теме я наткнулся на реальную ограниченность самого мощного языка современности - C# - далеко не в низкоуровневых действиях. И господин uzhsoft написал:
Как написано на другом форуме по поводу выражения "выстрелить себе в ногу": Код
closed static [(typename T1, typename T2), null Function((() T1, () T2) list1, (() T1, () T2) list2, [typename TInner, Action[() TInner, () TInner]] inner_func)] MyFunc = { (() T1 left_list1, () T2 right_list1) = list1; (() T1 left_list2, () T2 right_list2) = list2; inner_func(left_list1, left_list2); inner_func(right_list1, right_list2); }; (() int, () string) list1 = ((1, 2, 3), ("A", "B", "C")), list2 = ((5, 10, 15), ("X", "Y", "Z")); MyFunc(list1, list2, (x, y) => x.Add(y));
Я понимаю, что какое-то явное издевательство над программированием - нужно запрещать. Но в данном коде я не вижу ничего такого, что нарушает принципы высокоуровневого языка (как, например, goto, подстановка абсолютно любого кода в макрос с любым алфавитно-цифровым именем (таким, как if) или уже упомянутое прямое управление памятью), даже наоборот - это является не просто высокоуровневой, а ультра-высокоуровневой возможностью. Но почему же тогда эта возможность запрещена? И это в Шарпе, который должен давать другим языкам пример для подражания в плане высокоуровневости! Или, может, такая могучая корпорация Microsoft по какой-то причине не может сделать то, что, скорее всего, может любой быдлокодер, нужно только время? Или там сидят такие лентяи, которые не делают себе труда реализовать это? Или такие бездарные люди, которые не представляют себе, что так можно сделать, зато умеют воровать идеи, и пройдет пара лет после того, как я это здесь написал - и эта возможность появится? Или вы хотите сказать, что это по каким-то объективным причинам, которых я не знаю, не получится ни у кого, в том числе и у меня? Нет, мне кажется, что это ограничение было введено умышленно. Но для чего? Прошу ответить.
0
|
12.01.2021, 18:09 | |
Ответы с готовыми решениями:
94
Высокоуровневые методы информатики и программирования Создание условия: при определенных значениях переменной выполнения определенных арифметических действий Есть ли вообще аналогичные языки программирования только с уровнем изучения легкий чем язык программирования С языки программирования |
Труд вопреки насмешкам
|
||||||
13.01.2021, 13:14 [ТС] | 21 | |||||
Пример использования такой:
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|
13.01.2021, 13:18 | 22 |
Условно, можно считать, что мощность языка складывается из трёх факторов:
1. Гибкость (универсальность, расширяемость) языка 2. Лаконичность языка (хотя тут ещё зависит от компилятора) 3. Мощность системы типов Далее субъективно (мало знаю): 1. Lisp, Fort 2. Haskel, J, K 3. ??? Coq ... в каких языках на данный момент, например, исчисление конструкций реализовано?
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 13:31 | 24 | |||||
Без проблем:
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 13:39 [ТС] | 25 |
Я получил, наверное, уже под десяток решений с помощью убогих костылей. Но факт то, что все эти решения являются "одноразовыми", конкретно для данной постановки, а нужного уровня универсальности для всех возможных случаев в C# нет.
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
|
13.01.2021, 14:37 | 26 |
В таких случаях нужно создавать интерфейс с методом Add, вашим х и у имплементировать этот интерфейс, а делегат параметризовать интерфейсом. По крайней мере, так можно было бы сделать в java, думаю и в сишарпе тоже. И сделано это было намеренно, для строгости проверки типов.
В плюсах с их "утиной" типизацией шаблонов вроде можно было бы сделать так, как вы хотите. Так что учите плюсы, может это и есть бесконечно гибкий язык в ваших терминах? Проверяли?
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 14:41 [ТС] | 27 |
Плюсы я учил раньше, но 1 - они тоже не бесконечно гибкие, а 2 - это язык хоть и более гибкий, но сам себя позиционирует как язык "среднего" уровня, а Шарп - ультра-высокоуровневый.
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
|
13.01.2021, 14:46 | 28 |
Вы так и не ответили, что вы считаете "бесконечно гибким" языком? Какой такой гибкости вам в плюсах может не хватать
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|||||||||||
13.01.2021, 14:52 | 29 | ||||||||||
Кажется, я понял, что Вы хотите. Что-то типа:
з.ы. Это возможно в языках с утиной типизацией.
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|
13.01.2021, 15:01 | 31 |
Скорее всего, не получится.
Пусть у нас есть функция "MyClass f(MyClass x) { return x; } ". Эту функцию нельзя использовать для наследников MyClass, так как возвращаемое значение нельзя преобразовать от MyClass к классу наследнику. Эту функцию нельзя использовать для предков MyClass, так как аргумент нельзя преобразовать от класса предка к классу MyClass. То есть, в одном случае нам требуется ковариантность, а в другом - инвариантность. Возможно, с использованием новых модификаторов in out можно придумать какую-нибудь громоздкую конструкцию.
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
|
13.01.2021, 15:01 | 32 |
Вообще то, даже в шарпе такое можно - с помощью typeof https://docs.microsoft.com/ru-... f-operator
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|||||||||||
13.01.2021, 15:05 | 33 | ||||||||||
Это синтаксис:
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 15:08 [ТС] | 34 |
А если так:
Код
private static T F<T>(MyClass obj) { if (T == int) { return obj.Number; } else if (T == string) { return obj.String; } ... }
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
|
13.01.2021, 15:09 | 35 |
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
||||||
13.01.2021, 15:21 | 37 | |||||
Получится вот так
0
|
Труд вопреки насмешкам
|
||||||
13.01.2021, 15:22 [ТС] | 38 | |||||
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|||||||||||
13.01.2021, 15:38 | 39 | ||||||||||
Это не то. Вы написали:
В функцию передаётся ссылка на код, который работает либо с типом a, либо с типом c. Нельзя преобразовать Func<T1,T1> в Func<T2,T2>, как нельзя преобразовать List<T1> в List<T2>. Например, List<string> нельзя преобразовать в List<object>, так как мы не можем доставать строки из списка объектов (будет исключение, если объект не строка). И наоборот нельзя, так как мы не можем положить объекты в список строк.
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 15:43 [ТС] | 40 |
Shamil1, возможно, немного оффтоп, но не болтовня, надеюсь, вы не удалите. Является ли преимуществом или недостатком языка отсутствие универсального оператора явного преобразования? То есть, например, можно преобразовать целое число в действительное с помощью суффикса, в редких случаях можно преобразовать с помощью функции, а 95% преобразований неявные. Есть какие-то серьезные недостатки у такого подхода?
0
|
13.01.2021, 15:43 | |
13.01.2021, 15:43 | |
Помогаю со студенческими работами здесь
40
Языки программирования Языки программирования Языки программирования Языки программирования Языки программирования Языки программирования Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |