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

C#.NStar

22.11.2020, 01:26. Показов 36076. Ответов 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
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.11.2025, 17:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alecss131 Посмотреть сообщение
В некоторых языках это сделано и все ОК. Например в Swift нету обычного for, а так же инкремента/декремента.
Хз, мне C подобный for выглядит более практичным и лаконичным. Может конечно дело привычки, но гораздо проще когда сразу видишь условие выхода из цикла и шаг итерации. Ну и конкретно у ТСа мне не нравится не сколько синтаксис, сколько необходимость в in указывать какой-то метод. Выглядит не очень. Если уже чесалось сделать удобное перечисление простых чисел, то стоило давать возможность прям в цикле указывать диапазон.

Ну и основной бугурт что for вообще-то крайне практичная штука, без которой будет не так весело. Да, можно обойтись тем же while, но я манал каждый раз прописывать выше int i, а через пару правок ловить ошибку "не/уже объявленная переменная".

Мой язык и есть улучшенная версия C#...
ИМХО, пока выглядит обратно.

И глядя на ваш код и ваши ответы.... я даже не знаю как выразится. Как будто вы всю жизнь кодили куда-то в пустоту, лишь бы собиралось и что-то выводило. Такое ожидаешь от первокурсника, который не понимает зачем текстовые константы вместо фактических значений строк и почему стоит дробить код на логические блоки (те же методы).
0
282 / 485 / 12
Регистрация: 21.06.2019
Сообщений: 3,020
07.11.2025, 18:03
Цитата Сообщение от gogolik Посмотреть сообщение
Etyuhibosecyu, мне кажется, что вам нужно присвоить звание "профессиональный недоделыватель". Одни заготовки, альфы, пре альфы и прочая шелуха, которая не несёт смысловой нагрузки и пользы. ИМХО, если и показывать "продукт", то уже относительно готовый, а не оправдываться на любой чих "ну это же заготовка/альфа".
Ну за все годы что он тут живет на форуме уже понятно, что ничего доделать он не в состоянии. Ещё ни один его проект даже до беты не дожил. И с его подходом к разработке и обучению, вполне понятно, почему так.
0
Software Engineer
 Аватар для Custos
336 / 340 / 55
Регистрация: 23.09.2014
Сообщений: 1,047
07.11.2025, 18:07
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Мой язык и есть улучшенная версия C#...
Как здорово жить в своей параллельной вселенной
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
18.11.2025, 22:47  [ТС]

C#.NStar Pre-Pre-I-4


Ловите C#.NStar Pre-Pre-I-4! C#.NStar стал первым проектом компании Red-Star-Soft, у которого была выпущена, а не опущена, четвертая подверсия Pre-Pre-Alpha. К сожалению, экспоненциальный рост количества тестов прекратился, это число не дотянуло даже до 750. Также эта версия не содержит полиморфизм, хотя я уже вплотную подошел к нему. Зато вот что эта версия содержит:
1. Ломающие изменения: ключевое слово closed упразднено, примеры кода с ним больше не работают. Используйте private.
2. Добавлены краткие записи типов list() T и Dictionary[K, V] - () T и [K, V].
3. Добавлен тип object, являющийся базовым для всех остальных типов, включая примитивные. В отличие от C#.NET, в нашем языке он является абстрактным.
4. Добавлены свойства с ограничением присваивания - теперь вместо { get, set } можно писать { get, private set }, { get, init }, { get, private init } и просто { get }. Слово get обязательно. Точка с запятой после названия метода доступа не ставится, зато ставится в конце строки со свойством, даже если в ней нет знака "=". Также можно перед типом свойства указывать ключевое слово required, вследствие чего транслятор выдаст ошибку, если при конструировании не присвоить значение этому свойству. А значение присваивается так: var x = new MyClass[a, b, c, ...](...). Или так: MyClass[a, b, c, ...] x = new(...). Да, очень похоже на полиморфизм, но это не он. Свойства перечисляются так: сначала required с однократной установкой в порядке присваивания, затем остальные в порядке присваивания.
5. Добавлена возможность сохранения написанной программы в автономный EXE. К сожалению, рядом с EXE находится еще несколько файлов, убрать их без превращения EXE в самораспаковывающийся архив не представляется возможным. Для создания приложения из одного файла используйте либо "нормальный" архив (распаковываемый архиватором или самораспаковывающийся), либо программы в стиле Inno Setup.
6. Добавлены циклы loop { ... } while (condition);, начинающийся как loop, но заканчивающийся, когда условие станет равным false (но хотя бы раз обязательно выполнится, в то время как обычный while может не выполниться ни разу), и repeat (n) while (condition) и for (type var in collection) while (condition), заканчивающиеся или после n раз / при достижении конца коллекции, или когда условие станет равным false.
7. Добавлена краткая запись пар "ключ/значение" - (key1: value1, key2: value2, key3: value3, ...), с использованием одного уровня скобок, а не трех.
8. Добавлены типы long long, представляющий длинную целочисленную арифметику (но не unsigned long long - он в разработке!), и complex, представляющий комплексное число с действительной и мнимой частями типа real (со строчной буквы). Присутствуют литералы этих типов - 5LL (прописными буквами), 5c (преобразование целого или действительного числа в комплексное) (строчной буквой) и 5I - мнимое число с указанным количеством мнимых единиц, а также просто I (в отличие от математики, I - прописная).
9. Добавлен оператор беззнакового сдвига вправо >>>, заполняющий левые биты нулями, а не единицами даже для отрицательных чисел.
И как обычно, рабочие примеры кода:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class Account
{
    string Username { get, private set };
    real Balance { get, init };
    bool IsLocked { get, set }; // публичный set
}
var acc = new Account["user1", 100.0]();
return acc;
 
Class Config
{
    int Timeout { get, init };
}
var c = new Config[100]();
return c;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Class Secret
{
    bool IsActive { get, init };
    string Code { get, private init };
 
    Constructor(string code)
    {
        Code = code;
        IsActive = true;
    }
}
var s1 = new Secret("123");
var s2 = new Secret[true, "789"]("456");
var s3 = new Secret[false]("abc");
return (s1, s2, s3);
Code
1
2
3
4
5
6
() int list = new();
for (int i in Chain(0, 10)) while (i * i < 10)
{
    list.Add(i);
}
return list;
Code
1
2
3
4
5
6
() int list = new();
for (int i in Chain(0, 10)) while! (i * i % 20 >= 10)
{
    list.Add(i);
}
return list;
Code
1
2
3
using System.Collections;
[string, int] dic = ("0": 0, "1": 1, "2": 2, "3": 3);
return (dic, dic["1"]);
Code
1
return Sqrt(I);
Code
1
2
var x = ln (-5c);
return x;
Code
1
2
var x = 1LL;
return x << 100;
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
long long a = 123456789012345678901234567890;
long long b = 1000;
long long c = a + b;
long long d = a * b;
long long e = a - b;
long long f = a / b; // целочисленное деление
long long g = a % b; // остаток
bool isGreater = a > b;
bool isEqual = a == b;
long long abs = Abs(a);
long long pow_ = a pow 3;
int sign = a.Sign; // -1, 0, 1
int sign2 = (-a).Sign; // -1, 0, 1
int x = a % 2147483648;
string s = "" + a;
return (a, b, c, d, e, f, g, isGreater, isEqual, abs, pow_, sign, sign2, x, s);
Code
1
2
3
long int x = -281470681808896;
var y = x >>> 16;
return y;
Code
1
2
3
4
object obj1 = new System.Collections.Buffer[int](10);
object obj2 = "AAA";
object obj3 = 123;
return (obj1, obj2, obj3, typeof(obj1), typeof(obj2), typeof(obj3));
Если лень, боитесь или что-то еще мешает тестировать, прошу хотя бы написать примеры на C# или псевдо-C# с указанными как рабочие конструкциями, чтобы я сам перевел и протестировал.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
19.11.2025, 12:36
Code
1
2
3
4
5
6
7
Class Account
{
    string Username { get, private set };
    real Balance { get, init };
    bool IsLocked { get, set }; // публичный set
}
var acc = new Account["user1", 100.0]();
А что тут является указанием последовательности передаваемых значений и их обязательным указанием? Мне кажется это очень нечитаемо, а с каким-нибудь partial ещё и по разному будет работать в зависимости от окружения.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 12:41  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
А что тут является указанием последовательности передаваемых значений и их обязательным указанием?
Не понял вопроса. Свойства указываются в квадратных скобках после имени класса, в порядке их объявления. В чем вопрос заключается?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
19.11.2025, 12:45
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
partial Class Account
{
    string Username { get, set };
}
 
partial Class Account
{
    real Balance { get, set };
}
 
partial Class Account
{
    bool IsLocked { get, set };
}
какая будет тут последовательность? Вы же в курсе что код может быть автогененрируемым, собираемый из частей, и каждый раз это может быть разная последовательность отдельных кусков? Завязываться на то как в текущем куске объявлены свойства -- очень плохая идея.
1
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 12:50  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
какая будет тут последовательность? Вы же в курсе что код может быть автогененрируемым, собираемый из частей, и каждый раз это может быть разная последовательность отдельных кусков? Завязываться на то как в текущем куске объявлены свойства -- очень плохая идея.
Спасибо за наводку. Пока у меня partial в разработке, но подумаю об этом. Один из гипотетических вариантов:
Code
1
var acc = new Account[Username: "user1", Balance: 100.0]();
0
Модератор
Эксперт Java
 Аватар для alecss131
2892 / 1398 / 412
Регистрация: 11.08.2017
Сообщений: 4,479
Записей в блоге: 2
19.11.2025, 12:52
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
в квадратных скобках
Так обычно создаются либо массивы либо словари, ну никак не параметры. Уместнее либо круглые либо фигурные скобки.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 12:56  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Уместнее либо круглые либо фигурные скобки.
Круглые уже есть, а фигурные обычно означают что-то многострочное, а не простой идентификатор класса. К слову, списки и словари у меня создаются в круглых скобках, и в примерах это написано.
0
Модератор
Эксперт Java
 Аватар для alecss131
2892 / 1398 / 412
Регистрация: 11.08.2017
Сообщений: 4,479
Записей в блоге: 2
19.11.2025, 13:04
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
списки и словари у меня создаются в круглых скобках
Ну сделано прям все для максимальной неудобности и непривычности. Правильно программист при смене языка должен страдать и все должно быть так как не принято.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
19.11.2025, 13:06
Цитата Сообщение от alecss131 Посмотреть сообщение
Так обычно создаются либо массивы либо словари, ну никак не параметры. Уместнее либо круглые либо фигурные скобки.
Да тут в целом всё выглядит как "шило на мыло":
- по большей части имеет классический С-подобный синтаксис
- много мест где "наоборот/иначе/подругому", что сильно путает.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 13:11  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Правильно программист при смене языка должен страдать и все должно быть так как не принято.
Могу сделать два варианта синтаксиса - в круглых и в квадратных скобках, но тогда тот, кто изучает чужой код, должен будет знать оба варианта. Мне кажется, это не хорошо.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 16:23  [ТС]
Билд второй. Который скачивается отдельно от основной версии, для этого нужно не тупо нажимать "Скачать последний EXE", а зайти на страницу версии и скачать оттуда. Добавлен новый пакет и несколько новых GUI-классов, благодаря чему появилась возможность создать версию "Трех в ряд" с картинками и масштабированием на весь экран. К сожалению, картинки пока нельзя загружать из файла, нужно явно прописывать в коде. Код и скриншот прилагаются. Теперь, надеюсь, глаза не кровоточат?
Вложения
Тип файла: txt Три в ряд на C#.NStar.txt (8.8 Кб, 4 просмотров)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 16:48  [ТС]
Там есть баг, что если установить поверх Pre-Pre-I-3, то EXE не собирается. Нужно удалить Pre-Pre-I-3, затем установить Pre-Pre-I-4, затем билд.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
19.11.2025, 21:40
Окей... а если у меня установлен черновой эскиз концепта полу-недо-квази-тест-до-драфт-прото-эрли-пре-альфа версии логарифм кубического кореня из семнадцати точка мнимая единица?

Не серьезно, что за фигня в именованиях? Почему бы просто не идти по цифрам 0.0.0.х?
0
Software Engineer
 Аватар для Custos
336 / 340 / 55
Регистрация: 23.09.2014
Сообщений: 1,047
19.11.2025, 21:44
Цитата Сообщение от Wolfdp Посмотреть сообщение
Почему бы просто не идти по цифрам 0.0.0.х?
А это же главная идея Etyuhibosecyu вообще во всём. Сделать максимально плохо/неудобно/нелогично/"не как у всех", чтобы этими поделиями уж точно никто не захотел пользоваться.
2
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
19.11.2025, 22:14  [ТС]
Wolfdp, спасибо, посмеялся

Добавлено через 30 минут
Wolfdp, а серьезно - поддерживаю. Названия с буквой "o" были просто модными, сейчас мода прошла, и я тоже от них откажусь. Пусть будет Pre-Pre-Alpha-4-1, потому что точка вводит в заблуждение, что это "версия 4.1". Хотя возможно, что за этой версией будет уже следовать Alpha-1, потому что мне не нравится, что "одни пре-пре-альфы и прочий мусор".
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,460
19.11.2025, 23:28
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Pre-Pre-I-4
Это просто часть названия программы и не имеет никакого отношения к версии

На винде (WinAPI), версия в любом случае будет состоять из четырех 16-битных целых чисел, разделенных точками. Причем, внутренне версия на самом деле состоит из двух DWORD (32 битное целое), допустим a и b. Тогда версия будет записываться в HIWORD(a), LOWORD(a), HIWORD(b), LOWORD(b). Т.е. каждая из четырёх чисел версии это 16-битные целые.

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

Это означает, версия приложения ТС тоже будет состоять из четырех чисел.
Например, сейчас у файла CSharp.NStar.Desktop.exe стоит версия 1.0.0.0.

А если быть точнее, то ресурс версии, который лежит рядом с манифестом, выглядит так:

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
FILEVERSION    1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK  0x3F
FILEFLAGS      0x0
FILEOS         VOS_UNKNOWN | VOS__WINDOWS32
FILETYPE       VFT_APP
FILESUBTYPE    0x0
{
  BLOCK "VarFileInfo"
  {
    VALUE "Translation", 0x0, 1200
  }
  BLOCK "StringFileInfo"
  {
    BLOCK "000004b0"
    {
      VALUE "CompanyName",       "CSharp.NStar.Desktop"
      VALUE "FileDescription",   "CSharp.NStar.Desktop"
      VALUE "FileVersion",       "1.0.0.0"
      VALUE "InternalName",      "CSharp.NStar.Desktop.dll"
      VALUE "LegalCopyright",    " "
      VALUE "OriginalFilename",  "CSharp.NStar.Desktop.dll"
      VALUE "ProductName",       "CSharp.NStar.Desktop"
      VALUE "ProductVersion",    "1.0.0+7ce89abfd69b0a770bfaeefd97d3f8278f582fe8"
      VALUE "Assembly Version",  "1.0.0.0"
    }
  }
}
Я вот когда пишу программы, то пишу версию в ресурсном файле версии, а компилятор ресурсов впихивает потом в exe. При наведении мышью или при просмотре свойств потом видна моя версия. Но обычно люди пользуются инструментами, которые автоматически повышают версию, например, после каждой сборки. Кстати, я также грамотно заполняю остальные значения, например, копирайт. А у ТС там пусто.

Например, вот файл версии моей программы

Кликните здесь для просмотра всего текста
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
FILEVERSION    1,0,0,0
PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK  0x0
FILEFLAGS      0x0
FILEOS         VOS_NT_WINDOWS32
FILETYPE       VFT_APP
FILESUBTYPE    0x0
{
  BLOCK "StringFileInfo"
  {
    BLOCK "040904B0"
    {
      VALUE "CompanyName",       "Royal_X"
      VALUE "FileDescription",   "wxQRcode"
      VALUE "FileVersion",       "1.0.0.0"
      VALUE "ProductVersion",    "1.0.0.0"
      VALUE "LegalCopyright",    "Copyright © 2025 Royal_X"
      VALUE "OriginalFilename",  "wxQRcode.exe"
      VALUE "ProductName",       "wxQRcode"
      VALUE "InternalName",      "wxQRcode"
    }
  }
  BLOCK "VarFileInfo"
  {
    VALUE "Translation", 0x409, 1200
  }
}


Я, кстати, даже указал язык программы.

0x409 - код языка: Английский (США) в шестнадцатеричном формате
1200 - кодовая страница: Unicode (UTF-16 LE)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,829
Записей в блоге: 14
20.11.2025, 00:11  [ТС]
Обнаружил интересное явление - оказывается, я специально не делал перечисления, а они работают! Но только в виде использования, а не создания. Вероятно, проходят как поля в методе GetFields().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru