Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14

C#.NStar

22.11.2020, 01:26. Показов 38365. Ответов 523
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С чего всё началось
Мой язык программирования развивается, в очередной раз меняя название. Пятое название после C↑ᶜC, C#++, C with stations и временного Unnamed2 имеет вид "C# .NStar". Это название не вызывает никаких ассоциаций со стрелками, с "симбиозом плюсов и шарпа", со "станционным программированием", а вызывает единственную - то, что этот язык - прямое продолжение C#. Теперь вы убедились, что этот язык - не пустая болтовня, одна версия уже увидела свет, поэтому надеюсь, что очередная презентация возможностей C# .NStar хоть и подвергнется критике, но не приведет ни к чему плохому. Вот что уже работает:
1. Пространства имен.
2. Ошибки списком строк - теперь отображение n ошибок не займет время, пропорциональное n2, и вообще я по максимуму убрал конкатенацию строк в цикле, что является экстремально важным признаком качества языка.
3. Списки - не только возврат списка, но и переменные списочных типов.
4. Индексы - последний и самый сложный из перечисленных пунктов. Такой код успешно работает:
Code
1
2
list(3) int a = (((1, 2, 3), (4, 5, 6), (7, 8, 9)), ((10, 11, 12), (13, 14, 15), (16, 17, 18)), ((19, 20, 21), (22, 23, 24), (25, 26, 27)));
return a[1, 2, 3];
Но для того, чтобы выложить версию, этого мало. Это просто презентация.
А вот несколько будущих возможностей:
1. Оператор switch с лямбда-выражением. Это невероятно мощная конструкция! Позволит убрать очень много дублирования в условиях. Вот два примера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (task.StartsWith("Class "))
{
    return Action1(task.Substring("Class ".Length));
}
else if (task.StartsWith("Interface "))
{
    return Action2(task.Substring("Interface ".Length));
}
else if (task.StartsWith("Function "))
{
    return Action3(task.Substring("Function ".Length));
}
else if (task.StartsWith("Extent "))
{
    return Action4(task.Substring("Extent ".Length));
}
...
Code
1
2
3
4
5
6
7
8
return x => task == x + string s switch
{
    "Class " => Action1(s);
    "Interface " => Action2(s);
    "Function " => Action3(s);
    "Extent " => Action4(s);
    ...
};
Прошу обратить особое внимание на огромную мощь этой конструкции и написать, хотели бы вы ею воспользоваться или нет, и если нет, то почему.
2. Способ задания словаря будет отличаться от способа задания двумерного списка: ключ и значение будут разделяться оператором ":", а если словарь состоит из единственного элемента, доступного по всем ключам - достаточно указать один этот элемент. Пример:
Code
1
2
Dictionary[string, int] dic1 = ("Съешь": 1, "же": 2, "ещё": 3, "этих": 4, "мягких": 5, "французских": 6, "булок": 7, "да": 8, "выпей": 9, "чаю": 10, _: 0);
Dictionary[string, int] dic2 = -12345;
3. Оператор ![], позволяющий сменить внутренний тип коллекции без смены внешнего типа. Это позволит создать аналог LINQ нового поколения - Jaretorant, в котором не надо завершать каждое выражение функциями ToArray() или ToList(). Только посмотрите:
Code
1
2
3
4
() int oldList;
() real newList = oldList.TransformEach(x => 1r / x);
LinkedList[int] oldList2;
LinkedList[real] newList2 = oldList2.TransformEach(x => 1r / x);
А сама конструкция TransformEach записывается таким способом:
Code
1
2
3
4
5
6
7
8
9
10
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;
}
P. S. Недавно я наткнулся на список торговых знаков Microsoft. Оказывается, там написано, что нельзя искажать, модифицировать или комбинировать с любыми словами, символами, изображениями или другими видами информации любые из этих торговых знаков. Но самих знаков немного: само слово "Microsoft", Windows, MSN, Bing, Skype, Microsoft Edge и еще один или два. C# там нет! Поэтому создать язык с названием C# .NStar мне ничего не мешает.


 Комментарий модератора 
Update от 09.02.2026


ПОБЕДА!!! C#.NStar достиг версии (Alpha RC) 0.9! Это первое приложение от Red-Star-Soft, когда-либо достигавшее подобной версии! (Фреймворк - это не приложение.) Теперь, надеюсь, я перестал быть "профессиональным недоделывателем"? И, надеюсь, я получу тест?
1. Работа с файлами.
2. При техническом крахе сохраняется лог во временную папку.
3. Потоки. Причем нет этого ужасного разбиения на две воюющих стороны - синхронные и асинхронные - переключение контекста происходит автоматически.
4. "Швейцарский нож" (оператор is, сопоставление шаблонов). Пока что реализованы семь шаблонов: константа, тип, тип с объявлением переменной, var с объявлением переменной, шаблон сравнения (больше/меньше), пустой шаблон (_) и составной шаблон - несколько шаблонов, объединенных операторами and, or, not. Есть одна замеченная, но не исправленная ошибка, что попытка применить шаблон сравнения не к числу вызывает технический крах. Возможно, в будущем исправлю.
5. Сокращенный оператор for - можно написать так:
Code
1
2
3
4
for (i in collection)
{
    ...
}
- или так:
Code
1
2
3
4
for (i in a..b)
{
    ...
}
6. Сокращенные константы - если есть ключевое слово const, необзательно писать var или тем более полный тип.
7. Записи (Record - с прописной буквы). В отличие от C#.NET, это по терминологии Мартина чистые структуры данных, имеющие свойства, совпадащие по именам и типам с параметрами, конструктор из эих параметров и стандартные методы Equals и GetHashCode и неспособные иметь другие методы и свойства.
8. Структуры (Struct - с прописной буквы).
9. Прототип полиморфизма в виде словарей от рекурсивного типа к классу, одним из следующих способов (ключевое слово Class в случае полиморфизма обязтельно брать в скобки):
Code
1
2
3
4
const [typename T, (Class)] ClassName = new(
{
    ...
});
Code
1
2
3
4
const ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const var ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const [typename T, (Class)] ClassName = new [typename T, (Class)](
{
    ...
});
Code
1
2
3
4
const [typename T : BaseType, (Class : BaseType2)] ClassName = new(
{
    ...
});
Code
1
2
3
4
const ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Code
1
2
3
4
const var ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Code
1
2
3
4
const [typename T : BaseType, (Class : BaseType2)] ClassName = new [typename T : BaseType, (Class : BaseType2)](
{
    ...
});
Словари от чисел, строк или других типов, кроме typename, пока лучше даже не пытаться создавать - они не работают!
10. Обработка исключений:
Code
1
2
3
4
5
6
7
8
try
{
    ...
}
catch (ExceptionType var) if (condition) // if, а не when
{
    ...
}
В текущей версии доступен базовый набор исключений: Exception, ArgumentException (включает в себя ArgumentNullException и ArgumentOutOfRangeException, хотя явно указать их нельзя), IndexOutOfRangeException, InvalidOperationException, NullReferenceException и IOException.
11. И самое невероятное - ПАКЕТНЫЙ МЕНЕДЖЕР!!! Вы можете подключить любой пакет, доступный в публичном репозитории NuGet - достаточно зайти в настройки и указать его имя.
Рабочие примеры кода на C#.NStar, в дополнение к предыдущим версиям:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Threading;
Class MyClass
{
    Constructor()
    {
    }
    int Function Sync()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async1()
    {
        var x = MyClass2.MyFunc(5);
        return x;
    }
    Task[int] Function Async2(int n)
    {
        return n * n;
    }
}
 
static Class MyClass2
{
    Func[Task[int], int] MyFunc = new MyClass().Async2;
}
 
return new MyClass().Async1();
Code
1
2
3
object item = "Welcome!";
if (item is string text)
    return text;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
abstract Class BaseStack
{
    required typename T { get, init };
    
    abstract T Function Peek();
    abstract T Function Pop();
    abstract null Function Push(T item);
}
 
const [typename T, (Class : BaseStack[T])] Stack = new(
{
    private () T list = new(32);
 
    T Function Peek()
    {
        return list[^1];
    }
 
    T Function Pop
    {
        return list.GetAndRemove(list.Length - 1);
    }
 
    null Function Push(T item)
    {
        list.Add(item);
    }
});
 
BaseStack[int] intStack = new Stack[int]();
intStack.Push(5);
intStack.Push(10);
var x = (intStack.Pop(), intStack.Peek());
BaseStack[string] stringStack = new Stack[string]();
stringStack.Push("A");
stringStack.Push("B");
var y = (stringStack.Pop(), stringStack.Peek());
return (x, y);
Code
1
2
3
4
5
6
() int list = new();
for (i in Chain(0, 10)) while (i * i % 20 < 10)
{
    list.Add(i);
}
return list;
Code
1
2
3
4
5
6
int n = 0;
for (i in 1..1000)
{
    n++;
}
return n;
Code
1
2
3
Record Pair(string Name, int Value);
Pair pair = new("Status", 100);
return pair;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const [typename T : IComparable[T], (Class)] Repository = new(
{
    private () T items = new();
 
    null Function Add(T item)
    {
        items.Add(item);
    }
 
    T Function GetMax()
    {
        if (items.Length == 0)
            return null;
        return Max(items);
    }
});
 
Class Product : IComparable[Product]
{
    int Id;
    int Function CompareTo(Product product)
    {
        return Id.CompareTo(product.Id);
    }
}
 
var repo = new Repository[Product]();
repo.Add(new Product[1]());
repo.Add(new Product[5]());
return repo.GetMax().Id;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.IO;
try
{
    () int list = (1, 2, 3);
    return list.IndexOf(1, 5);
}
catch (ex) if (ex is not ArgumentException)
{
    return 1;
}
catch (ex)
{
    return "" + ex.Message;
}
return 2;
P. S. Можно также скачать из облаков, ссылка на странице версии.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.11.2020, 01:26
Ответы с готовыми решениями:

Мелкомягкие мыслят местами точно как и я или следят за моим компьютером и крадут идеи, записанные на нем для C# .NStar?
Кто знает? Вот неполная цитата из файла, созданного в феврале этого года: А тут оказывается, что...

Стал ли .NStar в меньшей степени "сборной солянкой"?
sau, это тема для вас! Хотя обоснованные, не содержащие трёпа и троллинга мнения других...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
523
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,698
Записей в блоге: 29
26.06.2025, 11:42
Студворк — интернет-сервис помощи студентам
Etyuhibosecyu, пример использования моего любимого ListHashSet[string] дай, а то никак не пашет
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.06.2025, 11:43  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
пример использования моего любимого ListHashSet[string] дай, а то никак не пашет
Такой не подходит?
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Collections;
Class MyClass : ListHashSet[string]
{
}
Class MyClass2 : MyClass
{
}
MyClass2 Function F()
{
    var hs = new MyClass2();
    hs.Add("1");
    hs.Add("2");
    hs.Add("3");
    hs.Add("2");
    return hs;
}
return F().RemoveAt(2);
Вы System.Collections подключили?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,698
Записей в блоге: 29
26.06.2025, 11:45
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Такой не подходит?
нет, мне нужно использование егго самого без наследования, чтоыб ты не начал говорить что дело в нем
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.06.2025, 12:00  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
нет, мне нужно использование егго самого без наследования
Code
1
2
3
4
5
6
7
8
9
10
11
using System.Collections;
ListHashSet[string] Function F()
{
    var hs = new ListHashSet[string]();
    hs.Add("1");
    hs.Add("2");
    hs.Add("3");
    hs.Add("2");
    return hs;
}
return F().RemoveAt(2);
Добавлено через 1 минуту
Цитата Сообщение от Welemir1 Посмотреть сообщение
чтоыб ты не начал говорить что дело в нем
К слову, наследование тоже необходимо протестировать. Но без полиморфизма, его в языке пока нет.

Добавлено через 11 минут
Welemir1, еще я заметил, что вы уже не первый раз подаете неявное преобразование числа в строку как баг, а я пишу, что не баг. Вам такое поведение языка просто не нравится? Что плохого в том, что строка - более "широкий" тип, чем число? Вы же не ругаетесь на неявное преобразование int в double?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,698
Записей в блоге: 29
26.06.2025, 12:47
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Вы же не ругаетесь на неявное преобразование int в double?
ругаюсь. Но как я понял у тебя язык со слабой типизацией, в таком случае ты должен явно и громко об этом заявлять, четко описав когда в каких случаях и какие типы приводятся друг к другу. У тебя например и число со строкой можно сложить. Такое поведение допустимо (привет жаваскрипту) но должно быть где то зафиксировано
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.06.2025, 12:51  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
Такое поведение допустимо (привет жаваскрипту) но должно быть где то зафиксировано
Вот здесь создать раздел "преобразования типов" подойдет?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,698
Записей в блоге: 29
26.06.2025, 12:58
Code
1
2
3
4
5
6
var hs = new ListHashSet[string]();
    hs.Add("1");
    hs.Add("2");
    hs.Add("3");
    hs.Add("2");
return hs;
вернуло ("1", "2", "3") это разве не кортеж?
почему нельзя добавить пустую строку?
hs[3]; вызывает какое то то падение, а должно сообщить что нет такого индекса
hs.remove("2"); не вызвало никакой реакции, содержимое не изменилось

Добавлено через 1 минуту
hs.Remove("1"); не работает, просит инт, hs.Remove(1); вызывает падение
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.06.2025, 13:00  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
hs.Remove("1"); не работает, просит инт, hs.Remove(1); вызывает падение
Не Remove, а RemoveAt или RemoveValue. Но согласен, что падение - баг.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,698
Записей в блоге: 29
26.06.2025, 13:02
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
создать раздел "преобразования типов" подойдет?
не только,надо на главной написать что язык со слабой типизацией, показать примеры и описать их логику. Можно ли строку сложить с булин? булин с интом? нулл с числом?
А С# же с сильной типизацией кажется, ты зачем ее ослабил?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
26.06.2025, 13:29  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
надо на главной написать что язык со слабой типизацией, показать примеры и описать их логику.
Не слишком ли это раздует "главную", каждую особенность языка там описывать? Мне кажется, для этого и существует документация, а не "главная".

Добавлено через 5 минут
Welemir1, к слову:
Цитата Сообщение от Welemir1 Посмотреть сообщение
написать что язык со слабой типизацией
Слабая типизация - неоднозначное понятие. Как минимум, четыре значения: динамическая, неявная, небезопасная по памяти и еще сходу не вспомнил какое, где-то видел таблицу. (Для модераторов: я не подаю это как истину в последней инстанции, это предположение.) А писать, сильная или слабая типизация по каждому критерию, на "главной" - не перебор ли?

Добавлено через 4 минуты
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
где-то видел таблицу
Вот близкая по смыслу статья, там два вида явной/неявной, но не упоминается безопасность по памяти.

Добавлено через 14 минут
Вот точно та статья с четырьмя критериями силы типизации.
0
Модератор
Эксперт Java
 Аватар для alecss131
2896 / 1402 / 412
Регистрация: 11.08.2017
Сообщений: 4,489
Записей в блоге: 2
26.06.2025, 21:24
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Слабая типизация - неоднозначное понятие.
Очень даже однозначное понятие и не надо мешать все в кучу, теплое, мягкое, жирное, соленое...
Есть слабая и сильная, еще называется строгая и нестрогая. Другие виды по типу динамической/статической и явной/неявной тут к теме не относятся.
Под понятиями слабая/нестрогая тут понимается про приведение типов, то есть например сложение разных типов в языках с сильной типизацией это ошибка, а в слабой нет.
Цитата Сообщение от Welemir1 Посмотреть сообщение
А С# же с сильной типизацией кажется
С языком особо не знаком, но там она вроде слабая была всегда. Я определяю это по получению строк, сложение строк с не строковыми типами данных, например числами. В C++/Swift это будет ошибкой, точнее в С++ будет не ожидаемый результат, а в свифте ошибка компиляции, тогда как в джаве и шарпе все будет ожидаемо.
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,864
27.06.2025, 03:30
Цитата Сообщение от alecss131 Посмотреть сообщение
но там она вроде слабая была всегда
Строгая статическая.

Цитата Сообщение от alecss131 Посмотреть сообщение
сложение строк с не строковыми типами данных
Это синтаксический сахар. Там для всего нестрокового ToString() вызывается. А дальше обычная конкатенация.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
27.06.2025, 13:03

Не по теме:

Цитата Сообщение от Usaga Посмотреть сообщение
Там для всего нестрокового ToString() вызывается.
Разрешите прикопаться: сначала пытается кастануть в string, и если нет явного переопределения преобразования -- то по сути вызовет ToString

C#
1
2
3
4
5
6
7
8
9
10
11
var nya = new Nya();
var result = "check: " + nya;
;
 
class Nya 
{
    public static implicit operator string(Nya nya) => "Nya-ha-ha-ha!";
    public static explicit operator Nya(string s) => new Nya();
 
    public override string ToString() => "Nya!";
}
P.S. из разряда "топ 10 бесполезных вопросов, которые могут задать на собеседовании".



Добавлено через 4 минуты

Не по теме:

Чуть поправлю уже себя любимого:
- если нет возможность кастануть к string, то вызовется оператор сложения для string, который принимает также object.
- если может кастануть -- собственно вызывается сложение строк.

Т.е. технически это даже не сахар.

0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
24.08.2025, 01:57  [ТС]
Ловите C#.NStar Pre-Pre-I-2o2! Предыдущая версия была "чугунным" юбилеем, а я этого даже не заметил. Текущая уже шестая. Надеюсь, не последняя.
- Ломающие изменения: NList[T] упразднен, примеры кода с ним больше не работают. Используйте list() T - транспайлер сам определит, конвертировать его в List<T>, NList<T> или BitList.
- Все ошибки, предупреждения и прочие сообщения транспайлера были пронумерованы шестнадцатеричными числами от 0000 до FFFF. Полный список (возможно, на момент вашего чтения устаревший) можно просмотреть здесь.
- Типизация в языке была существенно усилена, в основном по критерию строгости: большинство предупреждений при некорректных преобразованиях заменены на ошибки, можно неявно преобразовать с потерями только при возврате из функции. Подробнее здесь.
- Число тестов выросло в геометрической прогрессии и уже превысило 200. Возможно, скоро превысит 500?
- Сделан первый шаг к полиморфизму - добавлен полиморфизм встроенных методов. К сожалению, на этом движение по этому пути и застопорилось.
- Добавлены тернарные операторы. Причем не только x ? y : z, но и x ?= y : z, x ?>= y : z, x ?<= y : z, x ?> y : z, x ?< y : z и x ?!= y : z, что эквивалентно x == y ? x : z, x >= y ? x : z и т. д. Результат вычисления x кэшируется.
- Добавлены ЛЯМБДА-ВЫРАЖЕНИЯ! Серьезно. Причем не только в виде одного выражения, но и с фигурными скобками. Я сам не ожидал, что мы реализуем их так быстро, они планировались на одну из ревизий Pre-Pre-I-3. Но тем не менее, они уже тут.
- А вот от операторов switch, которые планировались на одну из ближайших версий, мы решили отказаться совсем. Они признаны нежелательной конструкцией, так как нарушают логику всех нормальных операторов с отступами: операторы классов, функций (и лямбда-выражений, если они имеют фигурные скобки), условий, циклов и другие по стандарту добавляют к коду, находящемуся внутри, один отступ по отношению к заголовку. А сколько отступов добавляет оператор switch? Никто не знает, каждый думает, как хочет, стандарта нет. Взамен мы планируем уже в одной из ревизий Pre-Pre-I-3 реализовать новые, перспективные выражения switch (раньше планировались на Pre-I).
- Добавлены индексы с конца и диапазоны - еще одна новая, перспективная возможность. Не уверен, работают ли многомерные диапазоны (к сожалению, как правило бывает, что если я не уверен, работает ли что-то, то, скорее всего, не работает), но одномерные проверены и работают.
- Исправлены ошибки, обнаруженные в предыдущей ревизии.

Рабочие примеры кода на C#.NStar, кроме перечисленных в прошлых темах:
Code
1
2
3
4
5
6
7
using System.Collections;
var hs = new ListHashSet[string]();
hs.Add("1");
hs.Add("2");
hs.Add(""); // Можно добавить пустую строку
hs.Add("2");
return hs;
Code
1
return DateTime.IsLeapYear(2025) ? -1234567890 : 2345678901;
Code
1
2
var a = 1 ?> 2 : 3 ?> 2 : 1;
return a;
Code
1
2
3
using System;
Func[real, real] f = x => x * x;
return f(100);
Code
1
2
3
using System;
list() Func[real, real] list = (x => x * x, x => 1 / x, x => E pow x);
return (list[1](3.14), list[2](3.14), list[3](3.14), list[1](-5), list[2](-5), list[3](-5));
Code
1
2
3
4
5
6
7
8
9
using System;
Func[real, real] f = x =>
{
    if (x >= 0)
        return x * x;
    else
        return -x * x;
};
return (f(100), f(-5));
Code
1
2
list() int list = (1, 2, 3, 4, 5);
return list[^1];
Code
1
2
list() int list = (1, 2, 3, 4, 5, 6, 7);
return list[3..^2];
Code
1
2
3
4
5
list() int list = (1, 2, 3, 4, 5, 6, 7);
index start = 3;
index end = 5;
var range = start..end;
return list[range];
Code
1
2
3
list() int list = (1, 2, 3, 4, 5);
var range = ..;
return list[range];
Code
1
2
3
4
5
6
7
using System.Collections;
var hs = new ListHashSet[string]();
hs.Add("1");
hs.Add("2");
hs.Add("3");
hs.Add("2");
return hs.RemoveValue("2");
Code
1
2
3
4
5
6
7
using System.Collections;
var hs = new ListHashSet[string]();
hs.Add("1");
hs.Add("2");
hs.Add("3");
hs.Add("2");
return hs.Remove(2..);
0
59 / 71 / 2
Регистрация: 04.12.2014
Сообщений: 176
24.08.2025, 19:09
т.е. другими словами - это обертка над C#, в которой нет поддержки функциональности родительского ЯП?
без метрик производительности/надежности, без информации о покрытии тестами (количество юнит-тестов - это не процент покрытия), без примеров реальных приложений (хотя бы простых апишек).
вообще язык предназначен для каких целей? что на нем лучше всего писать?
на сайте заявлено, что язык должен якобы привлечь новичков, не знакомых с программированием - чем привлечь?
почему новичок должен выбрать этот язык, а не сам c#, по которому написан миллион книг и есть уверенность в том, что не придется ломать голову на каждом шагу?
почему автор, позиционирующий себя как профессионала, ведет разработку языка в одной ветке и у него не настроены процессы CI/CD?
почему за годы разработки к проекту никто не присоединился и в репозитории нет ни одного PR/Issue?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
04.11.2025, 00:32  [ТС]

C#.NStar Pre-Pre-I-3


Ловите новую минорную версию - C#.NStar Pre-Pre-I-3! Количество тестов снова выросло в геометрической прогрессии и превысило 500! Интересно, в следующей версии превысит 1000?
Что уже проверено и работает в дополнение к версии Pre-Pre-I-2o2:
1. Именованные константы.
2. Тип typename, значениями которого являются типы. Возможны ошибки, прошу протестировать.
3. new() - конструктор с автоматическим определением конструируемого типа.
4. Перегрузка функций, иногда позволяющая даже то, что в C#.NET не позволяется.
5. Как и обещал, выражения switch. Их синтаксис такой же, как в C#.NET, за двумя исключениями: 1 - если выражение многострочное (если от источника до закрывающей фигурной скобки есть хоть один перевод строки, это уже многострочное выражение), запятая перед закрывающей фигурной скобкой обязательна; 2 - вместо when используется if. Также, транспайлер может упасть, если не указать опцию по умолчанию (_).
Welemir1, протестируете хотя бы эту версию (или, может, кто-то другой), или мне нет смысла разрабатывать?

Рабочие примеры кода на C#.NStar (включая выдающие корректные ошибки):
Code
1
2
3
4
5
6
7
8
9
10
static Class MyClass
{
    closed const string A1000000 = A100000 + A100000 + A100000 + A100000 + A100000 + A100000 + A100000 + A100000 + A100000 + A100000;
    closed const string A100000 = A10000 + A10000 + A10000 + A10000 + A10000 + A10000 + A10000 + A10000 + A10000 + A10000;
    closed const string A10000 = A1000 + A1000 + A1000 + A1000 + A1000 + A1000 + A1000 + A1000 + A1000 + A1000;
    closed const string A1000 = A100 + A100 + A100 + A100 + A100 + A100 + A100 + A100 + A100 + A100;
    closed const string A100 = A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10;
    closed const string A10 = "AAAAAAAAAA";
}
return MyClass.A1000000;
Code
1
2
3
4
5
6
static Class MyClass
{
    closed const string A100 = A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10 + A10;
    closed string A10 = "AAAAAAAAAA";
}
return MyClass.A100;
Code
1
2
3
4
const int n = 3;
list(n) int list = 8;
list = 123;
return list;
Code
1
2
3
4
5
6
7
8
9
10
11
const int n = 2;
(int, int)[n] Function F()
{
    Class MyClass
    {
        int a = 0;
    }
    MyClass b = new MyClass(5);
    return ((b.a, new MyClass(8).a), (b.a, new MyClass(8).a));
}
return F();
Code
1
2
3
4
5
using System;
using System.Collections;
const typename real = ListHashSet[int];
typename T = Func[real];
return T;
Code
1
2
3
4
5
6
7
typename real = int;
repeat (1)
{
    real = System.Collections.Buffer[real];
}
real x = new(1, 123);
return x;
Code
1
2
3
4
5
6
7
8
9
null Function F()
{
}
int Function F(int x)
{
    return x * x;
}
F();
return F(5);
Code
1
2
3
4
5
6
7
8
9
10
11
{
    F(5);
    null Function F(int x)
    {
    }
}
int Function F(int x)
{
    return x * x;
}
return F(5);
Code
1
2
3
4
5
6
7
8
return 5 switch
{
    0 => 0,
    1 => 2,
    2 => 4,
    3 => 6,
    _ => 16,
};
Code
1
2
3
4
5
6
7
8
return "5" switch
{
    "0" => "0",
    "1" => "2",
    "2" => "4",
    "3" => "6",
    _ => "16"
};
0
Эксперт .NET
 Аватар для Usaga
14733 / 9507 / 1363
Регистрация: 21.01.2016
Сообщений: 35,864
04.11.2025, 06:23
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
или мне нет смысла разрабатывать?
Смысла нет. Но ты всё равно будешь дальше "разрабатывать". Так зачем спрашивать?
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,603
04.11.2025, 12:13
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
и еще, что значит обертка? Любая высокоуровневая конструкция - это обертка над инструкциями процессора, разве нет? Или где граница новых функций и обертки?
Я не поленился и скачал C#.NStar. Вообще-то, я был не прав - там даже обёртки нет, не то чтобы нового языка. И что же я увидел? Формошлепная программа, написанная на Avalonia UI и C#.

Ты спросил, а что для меня было бы новым языком? Хорошо, отвечаю: если ты утверждаешь, что ты создал новый язык из семейства .Net, то я ожидал бы увидеть, как минимум, твой собственный (написанный тобой) компилятор, который переводил бы код C#.NStar в CIL (Common Intermediate Language), а потом уже для меня без разницы, можешь компилировать в файлы, а можешь CIL держать в памяти и использовать JIT компиляцию. И тогда я бы сказал: молодец Etyuhibosecyu, поздравляю ты создал новый язык (как вот, например, F#).
Но я твоего собственного компилятора в CIL не вижу. Вместо этого, есть формошлепная прога на Avalonia UI, которая принимает текст, парсит по определенным правилам и выдает новый текст. И она написана на уже существующем языке C#.
И по скорости она будет намного медленнее C#.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
04.11.2025, 12:16  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
твой собственный (написанный тобой) компилятор, который переводил бы код C#.NStar в CIL (Common Intermediate Language)
Вообще-то у меня не компилятор, а транспайлер.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
6318 / 3043 / 1054
Регистрация: 01.06.2021
Сообщений: 11,603
04.11.2025, 12:22
Etyuhibosecyu, транспайлер тоже можно назвать компилятором. Все что "компилирует" можно назвать компилятором. Но я ожидал увидеть компилятор в CIL, а у тебя действительно транспайлер из одного языка в другой, который для меня не является полноценным новым языком. Нет, он язык и, разумеется, новый в том плане, что до того, как ты придумал его синтаксис, такого языка нигде не существовало. Но его нельзя ставить наряду с другими полноценными языками.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru