Почему мы все еще программируем на древних языках?

Неужели вы всерьез думаете, что это говно стоит упоминания?

Я много раз писал, что хотел бы видеть в C# .NStar.

Серьезно? Ну назовите хоть кратко термин, который я должен изучить, чтобы почувствовать, что C++ и C# - супер-языки, а C# .NStar - квадратное колесо.

Да, потому что текущее направление развития этих языков - тупиковое. Если мне в руки дать язык, похожий как минимум на 99% на C# .NStar, этого не будет.

Ага, и на Windows XP тоже можно продуктивно и качественно работать. И некоторые это делают. Но почему-то

большинство

пользуется современными ОС. А плюсы и Жаба еще старше, чем Windows XP.

Ну, например, McEliece - это было бы функционально новое.

Еще один верящий в светлое будущее искусственного интеллекта!

Ну ладно, я в очередной раз повторю, как я себе представляю НОВЫЙ язык. Хотя уже много раз писал это в темах про C# .NStar. Вот:

1. Рекурсия типов:

typename Function F() {
	if (TextBox.Text == "A") {
		return int;
	}
	else if (TextBox.Text == "B") {
		return real;
	}
	else if (TextBox.Text == "C") {
		return string;
	}
	else {
		return null;
	}
}
typename T = F();
T var;
if (T != null) {
	list() T list;
}
T Function G(T p1) {}

2. Любой тип, в том числе число, строка, логический или рекурсивный тип, может иметь значение null. Также есть тип null, для которого null является единственным значением (вместо используемого в C++ и C# void).

3. Следующие числовые типы: short int (2 байта со знаком), int (4 байта со знаком), long int (8 байт со знаком), byte (1 байт без знака), unsigned short int (2 байта без знака), unsigned int (4 байта без знака), unsigned long int (8 байт без знака), real (8 байт с плавающей точкой), long real (10 байт с плавающей точкой) (причем этот тип должен вмещать число Грэма!), complex (комплексное, по 8 байт для действительной и мнимой части), long complex (комплексное, по 10 байт для действительной и мнимой части), short char (символ ANSI, 1 байт), char (символ Юникода, 2 байта), long char (символ UTF32, 4 байта). Тип, содержащий 4 байта с плавающей точкой, упразднен.

4. Возможность объявить переменную прямо в выражении:

complex c = real r = int a = int b = 0;

5. Вместо массивов используются списки и кортежи:

list() int list = (2, 4, 6, 8, 10);
list(list[1]) real list2 = ((3.14159, 2.71828), (0.101001, 365.2425), (1E+100, null));
(typename, string[3], complex) tuple = (unsigned long int, "AAA", "BBB", "CCC", 2 * I + 3);
string[3] tuple2 = (tuple[3], tuple[4], "DDD");

Причем string[3] - это не массив, а кортеж или часть кортежа!

6. Большинство типов (включая списки, кортежи и классы) являются типами значений, но присутствуют ссылки (как ref в C#) и управляемые ссылки (как ссылочные типы в C#). При этом управляемые ссылки должны сочетаться с другими категориями

с легкостью

, а не как в C++/CLI.

7. Следующие циклы:

loop {}
repeat (n) {}
while (n <= 10) {}
for (var value in list) {}
loop {} while (n <= 10);
for (var value in list while value <= 10) {}
repeat (n while list.Length != 0) {}

8. В объявлении функции в явном виде присутствует слово Function.

9. Циклические побитовые сдвиги.

10. Тернарные операторы в стиле "если a равно / не равно / больше / меньше / ... b, вернуть a, иначе c".

11. Можно написать

() T

или

(n) T

, что равносильно

list() T

или

list(n) T

.

12. Escape-последовательность "\!" для обратного слэша и "\q" для кавычки.

13. Оператор is, проверяющий преобразование не только всей переменной к какому-либо типу, но и части этой переменной. Пример:

s is "Function " + string name

,

number is 1 << int exp

(проверяет, является ли number степенью 2),

myString is string x + "o" + x

.

14. Оператор / выражение switch с лямбда-выражением

в заголовке

:

return x => task is x + string s switch
{
	"Class " => Action1(s);
	"Interface " => Action2(s);
	"Function " => Action3(s);
	"Extent " => Action4(s);
	...
};

15. Оператор ![], позволяющий сменить внутренний тип коллекции без смены внешнего типа:

() int oldList;
() real newList = oldList.TransformEach(x => 1r / x);
LinkedList[int] oldList2;
LinkedList[real] newList2 = oldList2.TransformEach(x => 1r / x);

//Реализация TransformEach
Dictionary[(typename TSource, typename TCollection : IEnumerable[TSource], typename TDest), TCollection![TDest] Extent(TCollection source, Func[TDest, TSource] Transformator)] =
{
	TCollection![TDest] output = new TDest[source.Count()];
	int i = 0;
	for (TSource elem in source)
	{
		output[i++] = Transformator(elem);
	}
	return output;
}

16. Отказ от оператора goto с одновременным добавлением возможности выйти из вложенных циклов (как в Жабе).

17. Возможность наследовать перечисления не только от byte, short int, unsigned short int, int, unsigned int, long int и unsined long int, а от любого незапечатанного и неабстрактного типа, реализующего интерфейс IIntegerNumber (можно самому определять такие типы).

18. Возможность на уровне

стандартной

библиотеки (а не такой, которую нужно скачивать бог знает где) производить генерацию ключей, шифрование и расшифровку методом McEliece, причем с умножением не за

, а как максимум за

и с быстрым возведением в степень (это название алгоритма).

19. Индексы в списках, кортежах и других коллекциях должны начинаться с 1, а не с 0.

20. Возможность расширять язык настолько, насколько позволяет архитектура компьютера, или создавать любые новые языки, описывая это в виде LALR(1)-грамматики. Опять же, это должно быть функцией

стандартной

библиотеки.

21. А также все преимущества C#, такие как индексы с конца, диапазоны, определение членов в интерфейсе (и их не нужно переопределять во всех реализующих его классах), new() и прочие.

Назовите мне язык, в котором присутствуют как минимум 97% из этих возможностей (а это невероятно мало - под это определение будет попадать язык, где отсутствует целый не самый большой пункт из перечисленных, или серьезно исковерканы 3-5 пунктов) (строго обязателен только пункт 20) - и я прекращу засорять форум жалобами на язык. Это серьезно!