Труд вопреки насмешкам
|
|||||||||||||||||
1 | |||||||||||||||||
Действительно ли высокоуровневые языки программирования не позволяют определенных действий умышленно?12.01.2021, 18:09. Показов 7047. Ответов 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
Высокоуровневые методы информатики и программирования Создание условия: при определенных значениях переменной выполнения определенных арифметических действий Есть ли вообще аналогичные языки программирования только с уровнем изучения легкий чем язык программирования С языки программирования |
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 15:50 | 41 | |||||
Etyuhibosecyu,
Действительно, забавно. Зато можно так:
1
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|
13.01.2021, 15:52 | 42 |
Неявное преобразование типов - это зло. А универсального преобразования не существует. С помощью каких инструкций процессора Вы преобразуете тип А в тип Б для любых А и Б?
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 16:02 [ТС] | 43 |
Аргументировать можете?
Я имею в виду не преобразование между абсолютно любыми типами, а единый оператор, такой как (T)a .
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|
13.01.2021, 16:30 | 44 |
Нет универсального алгоритма преобразования одного типа в другой. Но есть универсальные алгоритмы по преобразованию типа в object и обратно.
Теоретически, можно было написать оператор (T)a = (T)(object)a. Плюсы - в тех случаях, когда это требуется, писать чуть меньше. Минусы - в тех случаях, когда программист написал "(T)a" или (MyType1)myType2 по ошибке (или забыл добавить в MyType1 оператор преобразования из типа MyType2), компилятор не ругнётся. Видимо, создатели C# решили, что в данном случае минусы перевешивают плюсы. Да. Аж на несколько экранов. Перемежая аргументы с нецензурной лексикой.
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 16:31 [ТС] | 45 |
А серьезно? Неужели модератор будет опускаться до нецензурной лексики? Что плохого, например, в таких командах (в стиле C#):
Код
int n = "5"; string s = 3.14; List<string> list = "ABC"; //Преобразуется в список с единственным элементом string s2 = new List<List<int>> { new() { 1, 2, 3 }, new() { 4, 5, 6 }, new() { 7, 8, 9 } }; //Преобразуется в "{ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }" double n2 = null;
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 16:35 | 46 | |||||
Если кратко, то очень сложно искать ошибку/опечатку.
Например, вот две одинаковые функции, которые на самом деле совсем разные:
Вы опечатались/ошиблись в одном месте, а ошибка будет происходить в другом. Либо ошибки вообще не будет, но ответ будет неправильный.
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 16:43 | 48 | |||||
Вместо "5" - 5. Или вместо x - y.
Вот ещё пример:
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 16:56 | 50 | |||||
Конечно.
Вызвал по ошибке не тот метод (или просто по названию неправильно понял, что делает метод) - а оно работает. В смысле - не падает. Но делает что-то не то. И хорошо, если сразу можно будет заметить, что не то. Добавлено через 2 минуты
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 17:00 [ТС] | 51 |
Спасибо, я подумаю над вашими словами. Но думаю, расширяющие преобразования, такие как T в List<T>, а также преобразования в строку могут быть и неявными, так как если в таком случае вызвать не тот метод, не пройдет обратное преобразование.
0
|
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
|
||||||
13.01.2021, 17:49 | 52 | |||||
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
||||||
13.01.2021, 18:08 | 53 | |||||
Ради чего? И какой ценой?
Не по теме: Случай из жизни. Прапорщик послал солдата (водителя грузовика) на другой конец города купить мешок цемента, так там на 50 рублей дешеле. Солдат купил цемент дороже, но рядом. Сэкономленный бензин слил и продал - покрыл разницу в цене и еще на пиво осталось.
0
|
Труд вопреки насмешкам
|
|
13.01.2021, 18:14 [ТС] | 54 |
Shamil1, а такое в Шарпе возможно? Чтобы уже полный комплект?
Код
private static typename F(string basic_type) { ... } typename T = F("int"); T a = (T)(object)5;
0
|
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
|
||||||
13.01.2021, 18:48 | 55 | |||||
Etyuhibosecyu, вам такое нужно?
0
|
958 / 576 / 268
Регистрация: 20.12.2016
Сообщений: 1,506
|
||||||
13.01.2021, 19:02 | 57 | |||||
Etyuhibosecyu,
0
|
12512 / 8698 / 1311
Регистрация: 21.01.2016
Сообщений: 32,672
|
|
14.01.2021, 06:35 | 58 |
0
|
Модератор
3077 / 2226 / 462
Регистрация: 26.03.2015
Сообщений: 8,626
|
|
14.01.2021, 09:15 | 59 |
Если строка известна на момент компиляции, то проще явно написать нужный тип. Если строка не известна на момент компиляции, то это уже динамическая типизация получается. При этом теряется основной смысл статической типизации - проверка корректности программы на этапе компиляции.
Зачем вообще может понадобится преобразование типов? По моему опыту, очень редко возникает такая необходимость (тем более, в небезопасных преобразованиях).
0
|
269 / 452 / 12
Регистрация: 21.06.2019
Сообщений: 2,797
|
|
14.01.2021, 09:20 | 60 |
Etyuhibosecyu, возьмите уже жабаскрипт, шпарьте везде eval и не мучайтесь
0
|
14.01.2021, 09:20 | |
14.01.2021, 09:20 | |
Помогаю со студенческими работами здесь
60
Языки программирования Языки программирования Языки программирования Языки программирования Языки программирования Языки программирования Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |