Hello, Executor! Познакомимся с языком 1С:Исполнитель и сразу попытаемся его усовершенствовать

23.06.20

Разработка - Языки и среды

На прошлой неделе произошел долгожданный громкий релиз в мире 1С: вышла бета версия 1С:Исполнителя. И пусть не оправдались все ожидания после анонса, пусть язык еще сырой, что-то сделать на нем очень интересно. Посмотрим, что это такое, и даже произведем небольшую модернизацию языка (Velocity-pad Costilization).

В прошедшие дни в профильных чатах кипели страсти по поводу нового языка: что это вообще такое, зачем он нужен, зачем было изобретать что-то новое, когда уже есть проверенные скриптовые языки, ведь он не подходит ни 1Сникам, ни админам… Я не буду вступать в эту полемику, я сам пока еще плохо понимаю его нишу, и пригодится ли он мне. Но мне интересно рассмотреть 1С:Исполнителя именно как новый язык: какой у него синтаксис, какие есть фишки. И надеяться, что это перейдет в «старший» язык 1С:Предприятия.

 

Первое знакомство

Все материалы для работы с новым инструментом находятся по адресу https://releases.1c.ru/project/Executor. Там вы найдете:

  • сам дистрибутив языка,
  • отдельную IDE на основе Eclipse по типу EDT,
  • плагин для VS Code (его можно установить и через сам редактор),
  • различную документацию.

Что же сделать, когда все установлено? Конечно же, написать «Hello World»! Вот как он выглядит на двух языках. Я буду везде дальше приводить примеры на русском и английском для сравнения.

 

метод Скрипт()
    Консоль.Записать("Ну, здравствуй, душеприказчик!")
;

 

method Script()
    Console.Write("Well hello executor!")
;

 

Хоть пример и очень короткий, в нем можно увидеть сразу много особенностей Исполнителя:

  1. Здесь это сразу не понятно, но язык регистрозависимый. Ключевые слова должны быть с маленькой буквы, все остальные слова – в CamelCase. Не в том регистре напишете имя переменной, что-либо другое, все, это будет ошибкой. Наверное, подстава для людей, расслабленных 1С и пишущих как бог на душу положит. Я всегда старюсь придерживаться стиля, поэтому каких-то проблем в связи с этим не заметил.
  2. Больше нет процедур и функций, только ключевое слово метод(method). Конечно, разделение по смыслу в языке есть, но об этом позже.
  3. Основным методом, точкой входа в скрипт является метод с именем Скрипт(Script). Если выполнить файл sbsl без допоплнительных параметров, вызовется именно этот метод.
  4. Для вывода используется Консоль.Записать. Я очень давно не работал с консольными языками, поэтому вспомнились школьные, студенческие годы с Basic, Pascal, readln, writeln… Здесь нет интерфейса программы, она запускается в командной строке.
  5. Точка с запятой в конце не просто случайно на следующую строку съехала. В Исполнителе не надо ставить «;» в конце каждой строки. Символ этот служит для завершения блока. Т.е. вместо КонецЕсли, КонецЦикла, все этого, теперь просто «;». Решение, которое взбесило многих после анонса, в том числе и меня. Однако начал непосредственно писать код, и это уже не кажется таким диким. Больше проблем, когда «;» в конце строчки постоянно ставишь. Но если говорить о старшем языке, я бы оставил ключевое слово конец(end), все же солидней как-то.

Запускается скрипт в командной строке, если у вас Java 11, следующим образом:

“%ПапкаИсполнителя%\executor_j11.cmd” –s “%ПапкаСкрипта%\ИмяСкрипта.sbsl” –m ИмяМетода

После имени самого исполнителя пишется имя файла скрипта через s и имя метода через m. Если имя метода не указать, запустится метод с именем Скрипт(Script).

 

Что-нибудь посерьезнее

Но давайте напишем скрипт, который делает хоть что-то осмысленное. И заодно узнаем больше фишек языка. Сделаем функцию, которая по переданному числу и названию предмета на английском, возвращает фразу. Например, передали 5 и «apple», а она в ответ «five apples». Вот код получившегося метода.

 

метод СклонениеСЧислом(Количество: Число, Единственное: Строка, Множественное = "-"): Строка //1

    знч Цифры = ["zero","one","two","three","four","five","six","seven","eight","nine"] //2
    знч СловоЧисла = (Количество < 10 ? Цифры[Количество] : Строка(Количество)) //3
    
    пер СловоПредмета: Строка //4
    если Количество != 1 //5
        СловоПредмета = (Множественное == "-" ? Единственное + "s" : Множественное)
    иначе
        СловоПредмета = Единственное
    ;

    возврат "%СловоЧисла %СловоПредмета" //6
;

 

method DeclensionWithNumber(Count: Number, Singular: String, Plural = "-"): String //1

    val Digits = ["zero","one","two","three","four","five","six","seven","eight","nine"] //2
    val CountWord = (Count < 10 ? Digits[Count] : String(Count)) //3
    
    var ObjectWord: String //4
    if Count != 1 //5
        ObjectWord = (Plural == "-" ? Singular + "s" : Plural)
    else
        ObjectWord = Singular
    ;

    return "%CountWord %ObjectWord" //6
;

 

Разберем строки, отмеченные цифрами:

  1. Объявляем новую функцию с параметрами. Напротив каждого параметра стоит тип. Потому как Исполнитель – это строго типизированный язык. Вот такое вот смелое решение для скриптового языка. Не знаю, как здесь, но в старшем языке это было бы круто сделать, хоть и сложно. После скобок с параметрами тоже указан тип, значит, это функция, она возвращает строку. Третий параметр необязательный, считаем, что если множественное число для предмета не прописано, то просто добавляем «s» к единственному. Однако зачем делать значением «-», а не просто пустую строку, спросите вы? Тут дело в вызове через командную строку. Необходимо передать все параметры в команде вызова, а если написать пустую строку, то это, считай, и параметр не передан. В общем, заморочка, может, что-то доделают в будущих версиях.
  2. Определяем массив цифр. Во-первых, «А чт эт за слв в нчл стрк?» - спросите вы… Теперь каждая переменная должна объявляться с ключевым словом. знч(val) для объектов, которые не будут перезаписываться, пер(var) – в другом случае. Английские названия здесь выглядят приятней. Дальше инициализация массива. Теперь это можно сделать в одну строку, е-ху! Очень удобная классная штука, хочу такую в платформу.
  3. Формируем слово, описывающее число. Здесь я применил тернарный оператор: условие, что если истина, что если ложь. Не совсем привычно после обычного 1Совского, надо пробовать на вкус. Все выражение поместил в скобки для выделения, можно и без них. По смыслу, это если число меньше 10, пишем прописью, иначе просто цифрами.
  4. Здесь я делаю просто объявление строковой переменной для представления самого предмета. Т.к. язык строготипизированный, то и каждая переменная должна иметь тип, что здесь и указывается. В переменных выше это не делалось, т.к. они сразу инициализируются значением, тогда тип можно не указывать. Зачем вообще я просто объявляю переменную, скажу чуть позже.
  5. Вот мы встретились с условным оператором если(if). Отличается он от знакомого нами тем, что слова тогда уже нет, ну и заканчивается тоже той самой «;». Еще изменились условные операторы. Вместо <> пришло !=, вместо = пришло ==. Не знаю, зачем это сделали, но ОК, запомнить можно.
  6. Возвращаем два получившихся слова через пробел. Здесь мы видим, так называемую, интерполяцию строк. Забудьте о всех этих конкатенациях с переменными, о всяких подстановках в шаблон, теперь можно просто вставлять переменные в строки через символ «%»! Круто, отличная тема, очень хочется себе «в продакшн». Так можно обращаться не только к переменным, но целые выражения в строках писать. И вернусь к переменной СловоПредмета. Зачем я вообще ее объявлял, ведь дальше она в обоих ветках условия присваивалась? А здесь мы встречаемся с областью видимости переменных. То, что произошло внутри условия, должно остаться внутри условия! Если объявить переменную где-то внутри блока, она не будет доступна за его рамками. Наверное, правильная вещь, но тоже нам, обычным 1Сникам, не привычная.

Сам вызов функции будет выглядеть так:

 

метод Скрипт()
    Консоль.Записать(СклонениеСЧислом(42, "table"))
    Консоль.Записать(СклонениеСЧислом(5, "mouse", "mice"))
;

 

method Script()
    Console.Write(DeclensionWithNumber(42, "table"))
    Console.Write(DeclensionWithNumber(5, "mouse", "mice"))
;

 

И в консоли мы увидим:

42 tables

five mice

 

А теперь нечто совсем иное

В анонсе Исполнителя на Зазеркалье было рассказано про иерархию типов (т.е. классов), про контракты (т.е. интерфейсы), про множественное наследование… Я обрадовался: «ООП, любимое, пришло в 1С, ну наконец-то, заживем!». По факту все оказалось не так радужно. Иерархия типов есть, но только для использования, из своих типов можно создавать только Структуры и Перечисления, без методов.

И даже нет возможности вызывать методы одного скрипта из другого. Зарезервированы ключевые слова импорт и экспорт, но они сейчас ничего не делают. Но это уж как-то совсем обидно, подумал я, и решил провести небольшую костылизацию, сделать на коленке механизм, который позволит вызывать методы других скриптов. Будет это происходит через вызов Исполнителем самого себя. Итак, вот решение.

 

метод ВызватьМетодСкрипта(ПутьСкрипта: Строка, ИмяМетода = "", Параметры = []): Строка //1

    знч ПутьИсполнителя = "F:\\1C\\Executor\\bin\\executor_j11.cmd" //2
    
    знч Аргументы = новый Массив() //3
    Аргументы.ДобавитьВсе(["-s", "\"%ПутьСкрипта\""]) //4
    если не ИмяМетода.Пусто() //5
        Аргументы.ДобавитьВсе(["-m", ИмяМетода])
    ;
    Аргументы.ДобавитьВсе(Параметры) //6

    пер Результат = ""
    знч Процесс = новый ПроцессОс(ПутьИсполнителя, Аргументы) //7
    Процесс.Запустить()
    пока Истина
        знч Вывод = Процесс.ПотокВывода.ПрочитатьКакТекст() //8
        если Вывод.Пусто()
            прервать
        ;
        Результат += "\н%Вывод" //9
    ;

    возврат Результат.Сократить() //10
;

 

method CallScriptMethod(ScriptPath: String, MethodName = "", Params = []): String //1

    val ExecutorPath = "F:\\1C\\Executor\\bin\\executor_j11.cmd" //2

    val Args = new Array() //3
    Args.AddAll(["-s", "\"%ScriptPath\""]) //4
    if not MethodName.IsEmpty() //5
        Args.AddAll(["-m", MethodName])
    ;
    Args.AddAll(Params) //6

    var Result = ""
    val Process = new OsProcess(ExecutorPath, Args) //7
    Process.Start()
    while True
        val Output = Process.OutputStream.ReadAsText() //8
        if Output.IsEmpty()
            break
        ;
        Result += "\n%Output" //9
    ;

    return Result.Trim() //10
;

 

Посмотрим, что здесь происходит:

  1. Метод принимает в качестве параметров путь вызываемого скрипта, имя метода, если вызывается не метод Скрипт, а также массив параметров, если такие нужны. Последний необязателен, поэтому задан пустым массивом по умолчанию.
  2. В данной строке вам нужно будет написать путь расположения своего Исполнителя. Вообще, можно было заморочиться, и определять его автоматически, т.к. есть методы для работы с переменными среды, а там можно взять PATH и найти там нужную папку, но для первой версии и так сойдет. Кстати, можете заметить, что все слеши в строке двойные. Это потому, что слеш спецсимвол, и так вводится именно он сам.
  3. Инициализируем массив аргументов для вызова Исполнителя.
  4. Добавляем в аргументы параметры вызова нужного скрипта. Здесь используется метод ДобавитьВсе(AddAll), который добавляет к массиву другой массив. Его мы тут же собрали в этой строчке. Удобно, опять же. Еще можно увидеть, что кавычка теперь записывается как \.
  5. И здесь можно порадоваться синтаксису. Переменные даже примитивных типов представляют собой полноценные объекты, у которых есть методы. Поэтому вместо ПустаяСтрока(ИмяМетода) пишется более элегантное ИмяМетода.Пустое(). Или, например, вместо СтрНайти(МояСтрока… теперь МояСтрока.Найти(
  6. Ну и в конце просто докидываем в аргументы массив параметров, а не пробегаемся по каждому в цикле.
  7. В этой строке сама «магия» метода. Мы можем создавать и запускать процессы ОС. Здесь мы запускаем Исполнитель для вызова метода «вложенного» скрипта.
  8. Метод может быть просто процедурой в терминах 1С, выполнить нужные действия без какой-либо обратной связи, но что если нужно получить результат? Для этого написана данная часть кода. Мы можем забирать данные из консоли вызываемого приложения. Т.е. если что-то было выведено в консоль в скрипте или метод возвращает значение, все это попадает сюда. Сам цикл построен немного странно, но это я взял из документации, возможно, стоит будет его переписать.
  9. Будем собирать выводимые значения в результат построчно, если их несколько. Здесь, во-первых, можно увидеть синтаксический сахар в виде +=. Вместо ВотТакаяДлиннаяПеременная = ВотТакаяДлиннаяПеременная + Другая можно писать ВотТакаяДлиннаяПеременная += Другая. Почему-то операцию ++ не ввели, но и это уже очень хорошо. И еще в самой строке можно увидеть символ новой строки. В итоге получается вот такой короткий код добавления новой строки в многострочную переменную.
  10. Возвращаем обрезанную через аналог СокрЛП строку, без лишних пропусков в начале и в конце.

 

Вот так, передав имя скрипта, имя метода, массив параметров, мы вызываем другой скрипт. Но, допустим, для наглядности мы захотим передать параметры не просто массивом, а вместе с именами. Сделаем второй метод.

 

метод ВызватьМетодСкрипта(ПутьСкрипта: Строка, ИмяМетода = "", Параметры = {:}): Строка //1
    
    знч МассивПарам = новый Массив()
    для Парам из Параметры //2
        МассивПарам.Добавить(Парам.Значение)
    ;
    возврат ВызватьМетодСкрипта(ПутьСкрипта, ИмяМетода, МассивПарам) //3
;

 

method CallScriptMethod(ScriptPath: String, MethodName = "", Params = {:}): String //1
    
    val ParamsArray = new Array()
    for Param in Params //2
        ParamsArray.Add(Param.Value)
    ;
    return CallScriptMethod(ScriptPath, MethodName, ParamsArray) //3
;

 

Что у нас здесь:

  1. Во-первых, мы написали метод с точно таким же именем. И это в том же модуле. Как же такое возможно? Это перегрузка методов. Можно объявлять методы с одинаковыми именами, но разными типами или количеством параметров. Что у нас как раз здесь и есть. Последний параметр – это Соответствие, состоящее из пар ключ – значение. Через {:} задается пустое соответствие.
  2. Здесь мы видим обход коллекции для каждого, и добавления в массив значений из соответствия. Т.е. имена переданных параметров и не важны, важен их порядок.
  3. Ну а дальше мы вызываем уже написанный выше метод с массивом параметров.

 

И напишем еще третий вариант метода, когда параметры можно перечислить просто через запятую. Ограничимся для примера тремя параметрами.

 

метод ВызватьМетодСкрипта(
    ПутьСкрипта: Строка,
    ИмяМетода = "",
    Параметр1: Строка|Число|Булево|? = Неопределено, //1
    Параметр2: Строка|Число|Булево|? = Неопределено,
    Параметр3: Строка|Число|Булево|? = Неопределено): Строка
    
    знч МассивПарам = новый Массив()
    если Параметр1 != Неопределено
        МассивПарам.Добавить(Параметр1)
    ;
    если Параметр2 != Неопределено
        МассивПарам.Добавить(Параметр2)
    ;
    если Параметр3 != Неопределено
        МассивПарам.Добавить(Параметр3)
    ;
    возврат ВызватьМетодСкрипта(ПутьСкрипта, ИмяМетода, МассивПарам)
;

 

method CallScriptMethod(
    ScriptPath: String,
    MethodName = "",
    Param1: String|Number|Boolean|? = Undefined, //1
    Param2: String|Number|Boolean|? = Undefined,
    Param3: String|Number|Boolean|? = Undefined): String
    
    val ParamsArray = new Array()
    if Param1 != Undefined
        ParamsArray.Add(Param1)
    ;
    if Param2 != Undefined
        ParamsArray.Add(Param2)
    ;
    if Param3 != Undefined
        ParamsArray.Add(Param3)
    ;
    return CallScriptMethod(ScriptPath, MethodName, ParamsArray)
;

 

В общем, тут мы не увидим уже ничего для нас нового, кроме объявления типов переменных. В вызываемый скрипт мы можем передать значения трех типов: Строка, Число, Булево. Значит параметр является переменной составного типа, что и указывается перечислением типов через черту. Еще в конце указан знак вопроса, что означает, что параметр также может иметь значение Неопределено(Undefined), его мы и присваиваем по умолчанию.

 

И теперь проверим этот механизм. Создадим основной метод.

 

метод Скрипт()
    знч ПутьСкрипта = "F:\\1C\\Executor\\SingularPluralRus.sbsl" //1
    Консоль.Записать("I have " + ВызватьМетодСкрипта(ПутьСкрипта, "СклонениеСЧислом", [4, "apple", "-"])) //2
    знч Параметры = {"Количество": 6, "Единственное": "orange", "Множественное": "-"} //3
    Консоль.Записать("You have " + ВызватьМетодСкрипта(ПутьСкрипта, "СклонениеСЧислом", Параметры))
    Консоль.Записать("He has " + ВызватьМетодСкрипта(ПутьСкрипта, "СклонениеСЧислом", 25, "cherry", "cherries"))
;

 

method Script()
    val ScripthPath = "F:\\1C\\Executor\\SingularPluralEng.sbsl" //1
    Console.Write("I have " + CallScriptMethod(ScripthPath, "DeclensionWithNumber", [4, "apple", "-"])) //2
    val Params = {"Count": 6, "Singular": "orange", "Plural": "-"} //3
    Console.Write("You have " + CallScriptMethod(ScripthPath, "DeclensionWithNumber", Params))
    Console.Write("He has " + CallScriptMethod(ScripthPath, "DeclensionWithNumber", 25, "cherry", "cherries"))
;

 

Попробуем все варианты метода

  1. Сразу сохраним путь используемого скрипта.
  2. Вызываем как обычный метод и складываем результат с заданной строкой.
  3. Так задается соответствие из ключей и значений. Кто работал с JSON, тому будет знакома эта запись (так же, как и для массива).

 

Если выполним этот скрипт, в консоли выведется:

I have four apples

You have six oranges

He has 25 cherries

 

Конечно, данное решение пока далеко от совершенства. Чтобы использовать его, нужно в скрипт, из которого вы будете делать вызовы, вставить эти методы, от одного до трех. Ну, хоть к вызываемым скриптам требований нет. Нормально передаются только примитивные типы, в первую очередь, строки. Если хочется передачи более сложных данных, нужно думать о сериализации.

Расстраивает быстродействие. Вот эти строчки, что были выше, у меня выводятся с интервалом в 1- 2 секунды. Получается, под каждый процесс снова заводится Ява Машина, как-то так, в этой теме я плаваю. Но это отправная точка, а вообще будем надеяться, что в будущих версиях разработчики добавят нормальное взаимодействие скриптов.

 

О языках и средах

Я разрабатывал и в специальной IDE для Исполнителя, и в VS Code с плагином. В обоих средах есть и автодополнение, и контекстная подсказка, с этим все хорошо. Конечно, где-то есть мелкие недочеты, но это особенности беты. В итоге могу сказать, что пока мне больше нравится разрабатывать именно в VSC. Такой скриптовый язык не требует сложной IDE, все необходимое есть в VSC, к тому же он стильный модный и молодежный.

Если говорить про язык, то мне больше понравился код на английском. Он смотрится органичней, нет странных русских сокращений. Ну и не надо переключать раскладку. Хотя, кстати, в IDE об этом позаботились. Чтобы набирать специальные символы типа “[“, “]”, нужно нажать этот символ с зажатой клавишей Alt.

Ну и вот для сравнения скриншоты одного и того же кода в IDE на русском, и в VSC на английском. Мне больше нравится второй вариант. А вам?

 

 

 

Заключение

Хоть я и описал много фишек языка, которые меня порадовали, кое-что интересное не попало в обзор. Например, создание собственных структур данных и перечислений, которые потом можно использовать во всем скрипте. Или типизированные исключения, с возможностью создания собственных типов, для более продвинутой обработки исключений. В общем, очень много чего, что хотелось бы увидеть в языке платформы.

Конечно, язык еще довольно «слаб», у него скудная стандартная библиотека, и вообще область применения туманна, но мне нравится, что 1С создает что-то новое, делает смелые шаги и не дает нам скучать.

Если интересно, добавляйтесь в группу по 1С:Исполнителю в Telegram: https://t.me/executor1c

Репозиторий со скриптами из статьи: https://github.com/KonstantinHeinrich/Call-1C-Executor-Scripts-Methods

1С:Исполнитель Скрипт Разработка

См. также

Как вызвать скрипты на python в 1С по технологии NativeAPI

Языки и среды Платформа 1С v8.3 Бесплатно (free)

Будем писать свои скрипты на питоне и запускать их на 1С.

15.04.2024    1252    YA_418728146    11    

46

Зачем нам 1С:Элемент

Мобильная разработка Языки и среды Бесплатно (free)

Flutter может быть использован с 1С:Предприятием для разработки кроссплатформенных мобильных приложений, обеспечивая единый интерфейс и функциональность на устройствах под управлением iOS и Android. Это позволяет создавать приложения с высокой производительностью благодаря использованию собственного движка рендеринга Flutter. Интеграция Flutter с 1С:Предприятием позволяет создавать мобильные приложения любого уровня сложности, интегрировать их в корпоративные информационные системы, а также реализовывать бизнес-логику

19.03.2024    9266    ROk_dev    67    

41

(Не) Строгая типизация 1С

Языки и среды Платформа 1С v8.3 Бесплатно (free)

Существует множество языков программирования, и каждый имеет свои особенности по работе с типами данных. Слабые, явные, динамические и другие... Но кто же здесь 1С и почему с приходом "строгой" типизации EDT 1С-программистам стоит задуматься над изменением своих привычек.

16.01.2024    4546    SeiOkami    21    

55

Простое приложение на Dart

Языки и среды Бесплатно (free)

Пример небольшого приложения, с которого можно начать изучать язык программирования Dart.

08.08.2023    3344    acvatoris    6    

13

Статический анализатор кода 1С на Си

Языки и среды Платформа 1С v8.3 Россия Бесплатно (free)

Написание статического анализатора для 1С традиционным способом на Си.

30.06.2023    3044    prohorp    15    

12

Сквозная задача на Исполнителе - часть первая (IMAP)

Языки и среды Абонемент ($m)

Поставили нам задачу - вынести на отдельный сервер функционал получения заказов от клиентов по электронной почте, парсинг полученных XLS в приемлемый вид и трансформация заказов в красивый JSON, понятный нашей учетной системе на 1С. Всю эту красоту желательно запустить в отдельном докер - контейнере, по возможности не тратя лицензии, поэтому отдельно стоящую конфигурацию на БСП отвергаем сразу. Можно было бы собрать всё на Apache Airflow или Apache NiFi, но решили попробовать реализовать всю логику без Open Source, будем делать свой ETL, с Исполнителем, который в версии 3.0 научился взаимодействовать с электронной почтой по IMAP. Начнем с середины - сначала напишем скрипты, а потом соберем их в рабочую конструкцию

1 стартмани

01.06.2023    1938    0    kembrik    2    

7

1С# - Расширяем код 1С кодом на C#

Языки и среды Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Вставки кода на C# внутри кода на 1С.

7 стартмани

07.04.2023    9451    4    SerVer1C    56    

43

Независимая разработка совместимых компонент на ORM 1С – миф или истина где-то в аннотациях Java?

Языки и среды Платформа 1С v8.3 Бесплатно (free)

При работе с 1С ORM (object relation mapping) все время преследует ощущение постоянного создания монолитного приложения — один раз привязался к какой либо сущности (например, справочник Контрагенты), и весь код заполнен ссылками на эту конкретную реализацию. Можно ли независимо разрабатывать в ORM совместимые между собой справочник «Контрагентов» и использующий его документ «Платежное поручение», но при этом избежать жестких зависимостей? Спасут ли нас микросервисы? Пример на аннотациях Java демонстрирует, как это возможно делать.

13.03.2023    1065    1CUnlimited    0    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
20. CyberCerber 853 23.06.20 14:31 Сейчас в теме
28. VKislitsin 968 23.06.20 15:26 Сейчас в теме
(20) Спасибо! Не знал об этом канале.
+
13. MikhailDr 23.06.20 13:59 Сейчас в теме
Вот и думай 1Script смотреть изучать или Исполнителя.
+
78. Evil Beaver 8117 23.06.20 22:43 Сейчас в теме
(13) Чего его смотреть и изучать, это тот же язык. Просто берешь, и пишешь на 1С. Вот, например, змейка на 1Script. Неужели она сложная?

https://gist.github.com/EvilBeaver/5554d52bf926ac60ad75f7a9673a7f33
YPermitin; comol; +2
134. MikhailDr 24.06.20 23:55 Сейчас в теме
(78) Я просто с ним еще не работал, вот только на этой неделе установил. Думал, там все несколько иначе, но раз так, убедили.
+
102. comol 5052 24.06.20 18:25 Сейчас в теме
(13) Вся фишка в том что ванскрипт не надо изучать. А на "страдания фигней" от 1С не надо обращать внимания... Пока это возможно
+
15. DoctorRoza 23.06.20 14:16 Сейчас в теме
"Вакансия: Программист 1С, требования: опыт работы с 1С:Исполнитель не менее 3 лет"
rpgshnik; s_vidyakin; YPermitin; MezhduProchim; awk; Daruma; MikhailDr; Лис Р; CyberCerber; +9
21. AnderWonder 27 23.06.20 14:43 Сейчас в теме
Страдают ерундой всякой вместо того, что бы платформу допиливать и баги фиксить.
s_vidyakin; YuriFm; +2
22. awk 741 23.06.20 14:48 Сейчас в теме
Здесь это сразу не понятно, но язык регистрозависимый.

Язык хрен пойми как зависимый.

Пер А = 1
Пер а = 2 // Ошибка

Пер А = 1
а += 2 // Ошибка
rpgshnik; +1
23. CyberCerber 853 23.06.20 14:54 Сейчас в теме
(22) Да, все правильно, язык регистрозависимый, так еще добавили (думаю, как защиту от ошибок по невнимательности) запрет на создание переменных, которые отличаются только регистром.
+
31. Perfolenta 204 23.06.20 16:07 Сейчас в теме
(23)
так еще добавили
или просто забыли, что язык регистрозависимый при проверке повторного объявления переменной...
rpgshnik; Evil Beaver; awk; AnderWonder; +4
32. awk 741 23.06.20 16:17 Сейчас в теме
(23) Если язык регистрозависим, то:

пер А = 1
пер а = 2 // Нет ошибок (две) разные переменные

Если язык регистроНЕзависим, то:

Пер А = 1
а += 2 // Нет ошибки так как одна и та же переменная

В 1С:Исполнитель - хрень.
lunjio; +1
34. CyberCerber 853 23.06.20 16:25 Сейчас в теме
(32) Ну, я не знаю, это как стрелять себе в ногу, называя переменные в одной области МояПеременная и мояПеременная. :-) А эта багофича как раз такое сделать не дает. Это надо обращаться к разработчикам языка. Они есть в чате.
MezhduProchim; +1
37. awk 741 23.06.20 16:35 Сейчас в теме
(34) У вас фантазия не богатая.

Например: Просвет и ПроСвет.
Perfolenta; +1
39. CyberCerber 853 23.06.20 16:36 Сейчас в теме
(37) Да, совсем бедная, даже точно такие же имена, как в документации, в пример привел :-)
+
38. CyberCerber 853 23.06.20 16:36 Сейчас в теме
(32) А, так вот же, из документации:

Имена методов, переменных, типов и прочих конструкций языка следуют следующему правилу: имя
начинается с буквы (точнее со всего, что стандарт Unicode считает буквой) или с подчеркивания и может
иметь сколько угодно дополнительных букв, цифр и подчеркиваний. Имена чувствительны к регистру,
однако нельзя использовать имена, которые различаются только регистром. В этом смысле язык не допускает
создание переменной мояПеременная и МояПеременная.
+
40. awk 741 23.06.20 16:38 Сейчас в теме
(38) Это характеристика ума разработчика.

Кстати:

пер Если = 1 - ошибок не выдает.
+
42. CyberCerber 853 23.06.20 16:41 Сейчас в теме
(40) Что характеристика?
Ну верно, про пересечение с ключевыми словами ничего не сказано
+
45. awk 741 23.06.20 16:44 Сейчас в теме
(42) Атор языка - жертва ЕГЭ. У него полное отсутствие знаний по истории развития компьютерных языков, а так же проблемы с формальной логикой.
+
47. CyberCerber 853 23.06.20 16:49 Сейчас в теме
(45) Ну, это ваше сообщение тоже никакой логике не поддается. Просто безобоснованные выпады и оскорбления.
+
50. awk 741 23.06.20 17:01 Сейчас в теме
(47) Дорогой, проблемы "опасных" инструкций, встают перед разработчиками языков не первый раз. И решаются вполне успешно. Можно посмотреть как это решено в С или Perl (сокращу поиск - с помощью директив компиляции и ключей запуска). Это почему у автора беда со знанием истории.

А с формальной логикой беда, т.к. Нарушен закон тождества:

В формальной логике закон тождества принято выражать формулой: A есть A, или A=A, где под A понимается любая мысль.


язык регистрозависим, то:

пер А = 1
пер а = 2 // Нет ошибок (две) разные переменные
comol; +1
51. CyberCerber 853 23.06.20 17:06 Сейчас в теме
(50) Вроде, что-то умное говорите, но после обращения "дорогой" ничего обсуждать не хочется
+
53. awk 741 23.06.20 17:13 Сейчас в теме
(51)Словом, "дорогой", я очень хочу отделить вас от авторов данного языка. Ваши слова: "безобоснованные выпады и оскорбления", то же не располагают к общению. Выпады мои вполне обоснованны. И жертва ЕГЭ - это вполне диагноз, но не человеку, а системе образования в РФ. То есть человек не виноват и может все исправить, главное осознать и начать учиться. Если бы я не подбирал слова, то скорее всего назвал бы авторов: "дебилами" и тогда это действительно было бы оскорбление.
+
199. Darklight 32 25.06.20 16:16 Сейчас в теме
пустой коммент - прошу не обижаться
+
59. comol 5052 23.06.20 17:48 Сейчас в теме
(45) +100500 вообще огонь. Тоже скачал попробовал...
+
30. amd1986 23.06.20 15:56 Сейчас в теме
Пока непонятно, нахрена он нужен. Визуально код читается хуже. Нет какой то структурированности.
Darklight; rpgshnik; YuriFm; comol; awk; +5
33. Perfolenta 204 23.06.20 16:23 Сейчас в теме
Посмотрел, поигрался, позапускал примеры...
Не понял, зачем было городить огород с таким странным синтаксисом, если возможности языка не слишком-то ушли вперед по сравнению с обычным языком 1С...
Я бы еще понял, если бы тут было полноценное ООП или крутая функциональщина... но нет... язык Исполнителя, как язык программирования, совсем слабый...
Гораздо правильней подход у Односкрипта.... Тем более, что в него можно просто добавить синтаксического сахара и получить все фишки Исполнителя... которые можно хоть как-то фишками назвать... думаю, что Андрей Овсянкин так и сделает, тем более, что он уже сказал, что запреты на доработку языка сняты...
Странных решений в Исполнителе много... Например, зачем было разделять тип Дата на 3 типа? Почему надо было отказываться от встроенных функций 1С для работы со строками, датами и т.д.?
Наверное, что бы учить надо было всё с нуля, а потом постоянно путаться переключаясь с одного языка на другой?
Darklight; rpgshnik; lunjio; awk; comol; +5
198. Darklight 32 25.06.20 16:14 Сейчас в теме
(33)Похоже у Вашей разработки "Перфолента" (как и у OneScript) появился конкурент. Который пока и не конкурент вовсе - ибо это дикая смесь обоих разработок, впитавшая недостатки обоих, почти не предложив преимуществ!

Писать в стиле 1С Исполнитель - не на много удобнее, чем скажем, на том же C# или Java (ну или на Перфоленте) - а среди существенных фишек только составные типы (я Вам их сразу предлагал сделать как фишку Перфоленты, кстати), вот только компилировать надо - но на мой взгляд - не такая уж это проблема!

Писать скрипты же в стиле OneScript программистам на 1С куда привычнее и проще (слишком уж не скриптовый код вышел в 1С: Исполнителе - ну совсем не дружелюбный для написания скриптов людям, которые программировали на 1С8).

Хотя язык будет развиваться - некоторые вещи в нём уже априори заложены не дружелюбными для перехода! 1С-никам будет выгоднее просто использовать OneScript - ну или Перфоленту, с C# и Java.

Другое дело - что это, вероятное, будущее развития языка платформы для гипотетической 1С: Предприятие 9 - вот тут некоторые фишки, насторожившие в скриптовом применении 1С Исполнителя уже не будут казаться неправильными (да к тому моменту и язык то подтянут на гораздо более высокий уровень, устранив детские болезни).

Но, некоторые вещи (как разделение блоков кода через ";") пугают уже сейчас и пугают не на шутку!
Как и отсутствие ООП - надеюсь временное - ну не зря же все функции обозвали методами (крайне не популярное ключевое слово в языках программирования).

Хорошо, хоть переменные надо явно объявлять через "пер" или "знч (хотя , считаю, что 1С-никам русские термины "Перем" и "Знач" были бы куда приятнее набирать и на слух); тут я Вам тоже сразу говорил - делайте явное определение - как почтии во всех современных языках!

Вот тут ещё мой комментарий гляньте

В общем - не думаю, что в ближайшем десятилетии у 1С Исполнителя будет перспективы массового изучения и применения - слишком неоднозначный выходит. Ну тут понятно - что пока его делали для замены Питона в 1С Центр администрирования - и это правильно! Но дальше - дело не пойдёт, особенно учитывая невысокую распространённость данного платного продукта.

Ну а далее - только перспективы смены языка в 1С Предприятие 9 - и эти перспективы даже меня уже сейчас начинают пугать :-(
+
205. Perfolenta 204 25.06.20 16:50 Сейчас в теме
(198)
Писать в стиле 1С Исполнитель - не на много удобнее, чем скажем, на том же C# или Java (ну или на Перфоленте)

ну нет, на Перфоленте писать в стиле 1С удобно, в Перфоленте ни что не насилует привычки программиста 1С... только в объявлениях методов обязательно типы параметров указывать, а в остальном можно писать по 1С-овски...
Вот если программист 1С хочет узнать новых приемов, то на Перфоленте "их много есть"...
Исполнитель же ломает все привычки программиста 1С через колено и выбрасывает на помойку большую часть знаний (например, встроенные функции работы со строками и все другие)...
разделение блоков кода через ";"

Если бы у программистов 1С не было привычки ставить ; для разделения операторов, то я бы не имел ничего против... но эта существующая привычка ведет к ошибкам и постоянной боли...
я вот стал размышлять, а не добавить ли в Перфоленту возможность ставить ; вместо концов, но с сохранением возможности ставить в конце операторов... теоретически может получиться нормально, если эта ; единственная в строке кода... (это пока только мысли)
ну не зря же все функции обозвали методами (крайне не популярное ключевое слово в языках программирования)

тут я, кстати, угадал :) у меня в Перфоленте где-то с нового года тоже можно писать Метод/КонецМетода, но функции и процедуры у меня остались... в других языках очень по разному, где-то обходятся словом def, где-то надо явно указывать void... это все мелочи жизни...
тут я Вам тоже сразу говорил - делайте явное определение (переменных)

я размышлял об этом, но все же остановился на возможности включить это при необходимости директивой препроцессора... опять же из-за привычек программистов 1С... кто считает важным, тот включит...

пока это конечно не конкурент, тем более, что похоже это пока какой-то очень медленный интерпретатор... слишком уж низкую скорость он демонстрирует, хуже 1С...
(154) в этом комментарии я скорость измерял...
+
223. Darklight 32 25.06.20 18:51 Сейчас в теме
(205)
у нет, на Перфоленте писать в стиле 1С удобно

Я не пытался ущемить Перфоленту - это классический оборот речи - указывающий, что тут нет каких-то явных преимуществ!

тут я, кстати, угадал :) у меня в Перфоленте где-то с нового года тоже можно писать Метод/КонецМетода, но функции и процедуры у меня остались... в других языках очень по разному, где-то обходятся словом def, где-то надо явно указывать void... это все мелочи жизни...

Да, я об этом где-то в коммеентах тут уже сравнивал

кто считает важным, тот включит...

В том то и дело - что большинство это не считает важным - от того и ошибки - все современные языки от этого уже отказались. То что опция есть - это хорошо, но ещё раз - настоятельно рекомендую по умолчанию сделать её именно включённой - вот кому надо будет уже очень сильно иметь большую совместимость с 1С - вот тот пусть переключает данную опцию! Пока не дошли до версии 1.0 - лучше одумайтесь! Вот - даже 1С уходит от такого решения - в будущем у некоторой схожести Перфоленты и нового языка 1С - появятся как раз новые места невоместимости - о которой Вы так печётесь сейчас - думайте больше о светлом будущем, чем о гадостном прошлом!

Про скорость видел - уже обсуждали тут - будем считать пока это просто недоработками бета версии 1С Исполнителя - как никак это лишь первый релиз!
+
225. Perfolenta 204 25.06.20 19:11 Сейчас в теме
(223)
Я не пытался ущемить Перфоленту

в данном случае я этого и не заподозрил... даже мысли такой не было... я просто возразил на вашу мысль....
В том то и дело - что большинство это не считает важным

все взрослые люди... пусть сами и решают... кстати, такая возможность есть в VB.Net... по началу, при переходе с Vb6, флаг был выключен, но со времнем все привыкли его включать, люди же в большинстве умные... а теперь он по умолчанию включен... так что и у меня может быть так со временем получится...
я не хочу ломать 1С-ников, пусть головой думают... буду в документации напоминать "Включайте обязательное объявление переменных!!!", а то козлёночком станете... кстати, спасибо, сейчас прямо на сайте Перфоленты в статье про переменные это и напишу....
Про скорость видел - уже обсуждали

про скорость осталось выяснить, сделали они интерпретатор или просто неудачно компилируют в байткод JVM? Если интерпретатор, то скорость сильно поднять не смогут, а если компилируют, то не понятно почему так медленно работает?
+
232. Darklight 32 26.06.20 10:22 Сейчас в теме
(225)
буду в документации напоминать "Включайте обязательное объявление переменных!!!", а то козлёночком станете...

Вы плохо знаете славян - кто же читает документацию? И тем более включает всякие флаги коли не приспичит?


(225)
Если интерпретатор, то скорость сильно поднять не смогут, а если компилируют, то не понятно почему так медленно работает?

Ответил на Ваш исходный пост о сравнении скорости (188) тут
+
237. Perfolenta 204 26.06.20 11:07 Сейчас в теме
(232)
Вы плохо знаете славян - кто же читает документацию?

это штамп... на самом деле все программисты читают документацию в каком-нибудь объеме... кто больше, кто меньше, но без этого просто нельзя работать...
+
238. Darklight 32 26.06.20 11:09 Сейчас в теме
(237)
документацию в каком-нибудь объеме

Это ключевая фраза.
Не хватает ещё фразы "в какой-то момент"

Сразу всё изучать мало кто будет - значит сразу начнутся вырабатываться (или сохраняться) неправильные привычки!
+
209. Perfolenta 204 25.06.20 17:09 Сейчас в теме
(198)
а среди существенных фишек только составные типы (я Вам их сразу предлагал сделать как фишку Перфоленты, кстати)

а вдруг они это сделали читая нашу с вами дискуссию? :)))

я после общения с вами обдумывал составные типы, но пока у меня в мозгах не сложилось как это должно выглядеть... в Исполнителе тоже как-то коряво на мой взгляд это сделали и дело не в синтаксисе, он вполне пойдет, дело в работе с такими типами...
но, может при детальном рассмотрении мне понравится и я у них это скопирую для совместимости... а может нет...
+
222. Darklight 32 25.06.20 18:34 Сейчас в теме
(209)Я ТУТ В КОМЕНТАХ УЖЕ УПОМИНАЛ, что для составных типов нужно усовершенствовать оператор "?." чтобы такая конструкция проверял возможность вызвать у члена слева член справа (что для составных и типа "Любой") это очень актуально было бы - и вернуть результат вызова только если это возможнь, а если такого члена нет - то возвращать "неопределено" - то можно достаточно безопасно писать такой код (в месте с оператором "??") - заведомо ожидая получить "неопределенно" в результате - и думая об обработке такого результатат. Ну а правильную скрытую реализацию для такого оператора сделать не проблема.

Ещё тут имеет смысл подумать о самих типах, то есть о том, как определять, скажем, аргументы функций такого типа (который может быть составным или содержать неопределено). Тут хорошо бы при каждом таком определении (переменной составного типа) всегда видеть, что он составной (даже если этот тип был объявлен где-то в другом месте через алиас) - тогда программист будет помнить что с этой переменной/аргументом нужно аккуратно работать, а если не правильно объявит - то ему будет синтаксическая ошибка.
Ну что-то типа так
Перем а : НекийТип?; //даже если некий тип уже объявлен как Тип НекийТип = Строка?; //То есть подразумевает что уже может быть не только строка но и неопределено)
Но что делать если некий тип объявлен так "Тип НекийТип = Строка|СправочникСсылка;" - здесь нет неопределено (в отличии, от того как определяются составные типы в 1С8 - переменной такого типа нельзя присвоить неропределено, если её определить так же с "?" то появится возможность присваивать неопределено). Ну можно тогда как в 1С:Исполнителе - считать "?" пустым типом, который явно нужно включить в составной

Тип НекийТип1 = Строка|?; //Строка или неопределено
Тип НекийТип = Строка|СправочникСсылка;  //Строка или объект-ссылка на любой справочник

Перем а : НекийТип1? = неопределено; //? - указывает на то, что это составной  тип - он обязателен
//Перем б : НекийТип2? = неопределено; //Будет ошибка - тут неопределено не допустимо
Перем б : НекийТип2|? = неопределено; //Не будет ошибки - явно расширили возможностью указать значение "Неопределено"
//Перем в : СправочникСсылка =  б?.=Ссылка; //Будет ошибка - не в операторе "?." (он вернёт неопределено), а в присвоении значения переменной "в" - т.к. она не принимает значения "неопределено" (и даже если в б - будет ссылка - всё-равно будет ошибка - т.к. возмодно неопределено по контракту типа переменной б).
Перем в : СправочникСсылка|? =  б?.=Ссылка;  //Всё ок
//Перев д : СправочникСсылка = Справочники.Номенклатура.НайтиПоКоду("1"); //По идеи - тут тоже должна быть ошибка - ибо "СправочникСсылка " это составной тип
Перем д : СправочникСсылка? = Справочники.Номенклатура.НайтиПоКоду("1"); //а вот так всё должно быть хорошо!
Перем г : Любой? = д?.КакойтоРеквизит; //Будет неопределено - если "КакойтоРеквизит" отсутсвует в свойстве объекта из переменной д.
Перем е  = д?.КакойтоРеквизит ?? "Отсутсвует КакойтоРеквизит"; //Автовывод типа - тут неопределено в переменной е будет не возможно, оно будет заменено на строку - а сам тип будет выведен как составной тип всех типов реквизита "КакойтоТип" всех справочников, где он есть + строка неограниченной длинны можно огранить так: Строка("Отсутсвует КакойтоРеквизит",25)
//Перем e = неопределено - будет ошибка;
Перем ж = д?.КакойтоРеквизит ?? Строка("Отсутсвует КакойтоРеквизит",25):?; //Моя попытка синтаксически всё-таки дать возможность присваивать неопределено. - тут тип строки уточняется как допускающие пустое значение неопределено для системы вывода типа переменно ж
Перем з : Строка? = Строка?(ж); //Хитрая синтаксическая попытка приведения составного типа к строке - возвращающая неопределено если это невозможно
Перем й  = ж КАК Строка; //ну или так (как в C#)
ж = неопределено;
Показать


Я вот так себе это представляю ;-)
+
227. Perfolenta 204 25.06.20 19:27 Сейчас в теме
(222) да, где-то так и я себе это представляю...
однако, Перфолента сейчас основана на .Net, поэтому при попытке реализации составных типов я сильно задумываюсь над физической реализацией и к удачным решениям пока не прихожу... поэтому и нет этого пока в языке...
Например,
//объявим структуру с одним полем
Структура А
    &ВидноВсем Поле Д тип Дата|Строка|Число
КонецСтруктуры

как мне физически это реализовать, если в .Net составных типов не существует? мой компилятор-то знает про составной тип, а внешний код ничего об этом не знает...
три поля разного типа не возможно сделать, выход один, объявлять с типом Объект... но тогда для внешнего программиста это полностью теряет смысл... и ведет к ошибкам, т.к. в мыслях написавшего программиста был составной тип и он мог не подумать о том, что в код попадет не ожидаемый тип...
ещё пример:
Перем А тип Дата|Строка|Число
ВыводСтроки А*2 //НЕЛЬЗЯ ТАК НАПИСАТЬ
//а это значит, что типизация перестала быть статической 
//и стала динамической, т.е. медленной и подверженной ошибкам во время выполнения

(кстати, я пока в Исполнителе не до конца разобрался чем тип Объект отличается от типа Любой, надо внимательней почитать)
и таких нюансов очень много я набрал... так что тут я буду ещё долго думать, прежде чем сделаю составные типы...
кстати, оператор ?? я уже полностью реализовал, а операторы ?. и ?[ пока только распознаются компилятором, но обрабатываются как обычные . и [
уже скоро, как дойдут руки, реализую полностью....
+
229. I_G_O_R 69 26.06.20 00:45 Сейчас в теме
233. Perfolenta 204 26.06.20 10:30 Сейчас в теме
(229) в F# не совсем такие составные типы, как имеются ввиду в 1С и в исполнителе... там фактически создаются два вложенных класса, каждый из которых имеет своё имя... можно конечно и таким путем пойти...
+
236. Darklight 32 26.06.20 11:01 Сейчас в теме
(227)
как мне физически это реализовать, если в .Net составных типов не существует?

Вроде бы я ранее уже предлагал Вам решения. Думайте больше о коде на Перфоленте - чем об интеграции с внешним кодом. 1С тут явно об этом вообзще не думает.
И я не вижу проблемы сделать три поля разного типа (+ ещё одно для хранения текущего типа, вернее - одно, т.к. дата и число взаимозаменяемы числом; +4 свойства прямого доступа - со специфическим оформлением для IL и атрибутами - тут уже другие языки разберутся, что это свойства, если они их поддерживают; + перегрузку операторов приведения - но это, конечно не все языки умеют поддерживать; + нужны будут перегрузки операторов арифметических действий) - упакованные в ещё одну структуру и пометить её отдельным атрибутом. Реально доступ к полям в стороннем языке то будет - пусть не такой красивый как в Перфоленте - но ведь будет - доступ - а остальное - это не Ваши проблемы. Пример с кортежами C# я Вам уже приводил. Как и пример с нулабельными типами (значений и ссылочные) - разработчики C# тут не шибко заморачивались о том как это будут поддерживать другие .NET языки.

ВыводСтроки А*2 //НЕЛЬЗЯ ТАК НАПИСАТЬ

Вот поэтому я за применение дополнительных операторов с ? (и пометкой ? объявления переменных таких типов) - чтобы исключить исключения в runtime - и программист явно понимал, что тут стоит быть аккуратны:

Перем А тип Дата|Строка|Число? = "моя строка"
ВыводСтроки А?*2  //выведет пусто (неопределено), т.к. оператор ?* с операндами типов "строка" и "число"  должен веренуть "неопределено"
ВыводСтроки А?*2 ?? "Некорректный тип значения А=\""+А+"\" тип=\""+тип(А)+"\"" //Ну тут ясно что выведет "Некорректный тип значения А="моя строка" тип="System.String"
ВыводСтроки А*2 //тут должно быть предупреждение компиляции (но не ошибка) - что желательно применить оператор "?*"
Перем Б тип Дата|Строка|Число = "моя строка" //тут должна быть ошибка компиляции - что нужно указать пометку "?" для объявления переменной составного типа


Ксстати в последней строке можно и исключение выдать на стадии компиляции - применяя вывод типов - определив, что фактически в А будет тип "Строка" - и её никак нельзя умножить на 2.

кстати, я пока в Исполнителе не до конца разобрался чем тип Объект отличается от типа Любой,

Насколько я понимаю - Объект - это ссылочный тип а-ля System.Object в .NET
А Любой - это любой тип в т.ч. тип значения (и примитивный тип) - в .NET ему нет аналога. Но для понимания - можете изучить как это устроено а Scala - там такой тип есть - Any (и составные типы там тоже есть - правда не так красиво как в 1С Интерпретаторе или в JavaScipt)
+
240. Perfolenta 204 26.06.20 11:26 Сейчас в теме
(236)
Думайте больше о коде на Перфоленте - чем об интеграции с внешним кодом.

в Net интеграция очень важна, т.к. любая более-менее сложная программа собирается из независимых библиотек... нужен четко продуманный и прописанный механизм демонстрации составных типов вовне... что бы хотя бы библиотеки написанные на Перфоленте могли это понимать и использовать в обе стороны...
я об этом думаю, собираю материалы, пишу себе записки на будущее, но реализация пока в долгом ящике...
+
242. Darklight 32 26.06.20 11:31 Сейчас в теме
(240)Интеграция Важна сама по себе - удобство вне Перфоленты - не так важно само по себе (а возможность работать извне ведь будет). Да и не так уж часто вообще востребованы эти составные типы, чтобы так уж заморачиваться) - но как маркетинговая изюминка языка - это очень хорошая штука! Дык, теперь ещё и конкурента в лице 1С Исполнителя догонять нужно будет ;-)
+
244. Perfolenta 204 26.06.20 11:48 Сейчас в теме
(242)
Да и не так уж часто вообще востребованы эти составные типы, чтобы так уж заморачиваться

поэтому я и не спешу... и мне не нравится потеря простой статической типизации... составные типы или приносят потерю скорости и другие недостатки динамической типизации... или заставляют программистов обязательно писать проверки и преобразования типов...
Вы не представляете, сколько я времени потратил на поддержку в языке типа Объект... генерируя код на низком уровне для любой операции приходится предполагать, что тут окажется тип Объект и писать дополнительные генераторы кода для таких случаев...
+
247. Darklight 32 26.06.20 12:33 Сейчас в теме
(244)Ваше право. Но лично я бы этим загорячился бы почти сразу - как одной из главных маркетинговых фишек языка!
+
251. Perfolenta 204 26.06.20 12:51 Сейчас в теме
(247) знаете, когда я только начинал, мне казалось, что я хорошо представляю какой язык буду делать... у меня была написана масса примеров того, какой язык я хочу.... а в процессе работы получился совсем другой язык... теперь я точно знаю, что язык нельзя сначала придумать, а потом в этом же виде реализовать... в процессе все равно выяснится, что что-то не нужно, а чего-то не хватает... а некоторые решения казавшиеся хорошими покажутся плохими...
поэтому я теперь очень философски к этому отношусь... если я вдруг увижу, что составные типы в каком-то месте программы, которую я буду писать на Перфоленте, хорошо впишутся и упростят чтение, понимание или скорость написания, то я тут же начну их реализовывать... пока я вижу их только как ограничение на присваивание, но это на данный момент не стоит возможных усилий на реализацию...
благодаря общению с Вами я продвинулся в понимании, что я хочу от составных типов, но не могу прямо сразу браться за реализацию...
+
259. Darklight 32 08.07.20 16:36 Сейчас в теме
(251)Забавно, вот сейчас наткнулся на статью об ожидаемых фишках языка C# 9 (да - да не успела MS выкатить полностью (да даже не полностью) версию C# 8 - а уже пилит версию C# 9 - права выше упомянутая статья уже устарела - вот более свежая на английском (там есть ссылка и на оригинальный материал и на текущий план) - и походу там фишку (о ней ниже) перенесли уже на на C# 10 :-/

Так вот, в новой версии C# возможно появятся дизъюнктивные типы!!! Они же типы-объединения (Тип "Discriminated union"), ни же составные типы - ну как в JavaScript, Scala и КАК УЖЕ ЕСТЬ В F# - вот пример на C# (возможный вариант синтаксиса):



// Определяем класс-запись C# 9 
// (честно: так и не понял в чём тут особое преимущество, особенно зная как это сделано в Kotlin 
// и как ожидалось с C# 8 но так и не появилось), что умеют инициализаторы классов C# 7
public class Person  
{  
  public initonly string Firstname { get; }  
  public initonly string Lastname { get; }  
};  
  
enum class ByteOrBool { byte ByteValue; bool BoolValue;} // Возможный вариант синтаксиса

enum class MixedType  
{  
  Person PersonValue;  
  ByteOrBool UnionValue;  
}  

//Значение для присвоение значения в "поле" MixedType
var person = new Person()  
{  
  Firstname = ”Bassam”;  
  Lastname = “Alugili”;  
};  
  
var unionRecord = new MixedType.PersonValue(person); // Объект-запись из C# 9  (что так и не появилось с C# 8)
var unionType1 = new MixedType.UnionValue( BoolValue true); // Boolean type  
var unionType2 = new MixedType.UnionValue( ByteValue 11uy); // Byte type  
Показать


Вот честно - я не смог оценить красоту данного синтаксиса :-(
Получился просто аналог Си union - хоть это и прекрасная основа для создания составных типов, но синтаксически это всё выглядит очень коряво!

Дизъюнкции типов при обработке ошибок
try  
{  
  …  
  …  
}  
catch (CommunicationException | SystemException ex)  //захват любой ошибки типа "CommunicationException" или "SystemException "
{  
    // Здесь обрабатываем CommunicationException и SystemException 
}  
Показать


Это уже поинтереснее, но тоже не сказал бы что уж очень круто - просто синтаксический сахар для обработки ошибок нескольких типов в одном блоке.

//Ограничения дженерик-типа
public class GenericClass<T> where T : T1 | T2 | T3

А вот это уже очень круто - наконец-то можно точечно ограничит обобщённый-тип произвольными типами а не видами типов (увы - тут всё равно всё очень далеко ещё от возможностей ковариантных и инвариантных ограничений типов в Scala - например на то, что тип должен быть любым наследником от указанного)

Гетерогенные коллекцми
var crazyCollectionFP = new List<int|double|string>{1, 2.3, "bassam"};  

А вот это уже выглядит вполне себе красиво - и круто! Вот только как там будет выглядеть обработка элементов коллекции? Пример из статьи пока умалчивае - но первы пример - намекает на ужас!

Составной тип на выходе из выражения-условия (? или switch)
var result = x switch { true => "Successful", false => 0 };  

Ну это понятно - это всё хорошо

Замена перегрузок функций на одну
void logInput(int input) => Console.WriteLine($"The input is {input}");  
  
void logInput(long input) => Console.WriteLine($"The input is {input}");  
  
void logInput(float input) => Console.WriteLine($"The input is {input}");  


может быть заменен на единственную строку:


void logInput(int|long|float input) => Console.WriteLine($"The input is {input}");  

Ну.... забавно - тут вопросов нет - сладкий синтаксический саха!

Ну - естественно, можно использовать и для возвращаемых типов, например из функций

ublic int|Exception Method() // возвращение исключения
  
public class None {}  
  
public typealias Option<T> = T | None; // Option type  
  
public typealias Result<T> = T | Exception; // Result type  
Показать


Тоже всё - вкусненько!

Жаль нет примеров с приведением типов и присвоения значения таких составных типов другим не составным типам! :-(

вот тут ещё должны быть примеры- но про составные типы их пока нет :-(

Так что, нашу с Вами беседу о составных типах "услышали не только в 1С но и в Microsoft" :D

В общем - поддержка со стороны мелкомягких Вам в помощь - теперь будет на что Вам ориентироваться при разработке составных типов!
Ну а как выйдет релиз C# 9 можно будет более уверенно ожидать там реализации Дизъюнктивных объединений, или ждать C#10 - а как выйдет - можно и IL код проинспектировать - поняв тонкости технической реализации.

Ну, или надо разбирать IL код от F# - где эта фишка уже есть - и синтаксически она в C# как раз оттуда передирается ;-)

Вот такая вот, Вам пища для размышления о составных типах! Конечно в 1С: Исполнителе синтаксически лучше сделано, зато в C# 9(10) фишек больше на таких типах заявлено!

ну а про операторы "?." "??" для работы с составными типами тоже забывать не надо - они пока даже в C# не заявлены - но логику их работы я Вам ранее уже описывал - это была бы очень мощная фишка!

Ну - посмотрим, что там ещё JetBrains в своём Resharper выкатят - ведь оператор "?." они первыми ввели именно в этом расширении для VS, даже без мелкомягих. Уверен - что для типов-объединений они тоже что-нибудь оригинальное выкатят! Но не раньше - чем такие типы финально закрепятся в составе языка C# - уж точно не ранее финального релиза C#10
Perfolenta; +1
260. Perfolenta 204 08.07.20 23:29 Сейчас в теме
(259)
Так что, нашу с Вами беседу о составных типах "услышали не только в 1С но и в Microsoft" :D

да, наверное эта идея носится в воздухе...
однако, когда я читаю новинки в шарпе 8-9-10, меня не покидает ощущение, что код становится все менее читабельным... эта проблема существует во всех функциональных языках... код пишется сравнительно легко, но читается очень тяжело... особенно чужой...
а в простых языках, вроде 1С, наоборот, писать надо много, но зато чужой код читается бегло без проблем...
Посмотрим, когда выйдет, как это будет устроено внутри... может они под новые возможности языка платформу доработают... они уже не раз так делали... тогда и мне будет легче это реализовать...
+
261. Darklight 32 09.07.20 10:23 Сейчас в теме
(260)
однако, когда я читаю новинки в шарпе 8-9-10, меня не покидает ощущение, что код становится все менее читабельным...

Вполне готов с этим согласиться - надо лишь сделать поправку на то, что когда давно разрабатываешь на одном языке - ещё с тех пор, как он был прост и не наворочен, а потом туда начинают активно вносить новые фишки - то разбираться в чужом коде, который их начинает активно применять становится не всегда легко. Наверное, при таком экстенсивном развитии языка, это нормально - просто мозг привыкает к простым вещам и ему сложно переключаться на новое (даже если оно простое) - особенно с возрастом.
Но C# ещё достаточно молодой язык - ему простительно такое экстенсивное поведение. Не простительно лишь то, что он слишком много вобрал от языка предка C++ - и это его сильно тяготит. На самом деле - в Java уже те же проблемы - просто язык более старый (поэтому сначала появилась Scala, а потом Kotlin). В javaScript тоже не всё гладко - но есть TypeScript - там всё посовременнее! Да даже такой популярный язык как Python - тоже имеет неудачные концепции из прошлого - не смотря на большую чистку синтаксиса при переходе на версию 3 (правда с тех пор язык как раз практически остановился в своём развитии - наверно готовится очередная революция в 4-ой версии).
Вот, любители функционального подхода активно советуют применять F# - в котором тоже сочетается как функциональнная так и императивно-объектная парадигмы - от того язык достаточно мощный и относительно простой (не то что Lisp или Haskell) - но всё же тут нужна явная ломка мышления - т.к. всё-таки балом тут рулит функциональная логика. Лично меня чисто функциональный подход не "вставляет" - мне нравится глубокая гибридизация - вот как в Scala - правда этот язык тоже простым не назовёшь. Хотя, вот бы туда, ещё логику параллельной работы как Elexir и АОП с контрактным программированием как в Eiffel и макросы и выражения как в Nemerle..... шутка!
Хотя.... я бы на месте Микрософта ещё поигрался бы с C# лет так 10-20 - а потом вообще начал бы разработку нового языка - для той же платформы - отбросив всё наследие С++. Вообще - я бы даже два разных языка (помимо функционального F#, хотя я не люблю чисто функциональные языки - поэтому считаю его тоже пережитком прошлого) стал бы развивать и продвигать. Один - более ориентированный на описании абстрактной логики и управление процессами (с меньшим уровнем оптимизации, зато больше подходящего для решений прикладных задач и скриптизации простой рутины). Второй - более ориентированный на написание системной логики и обработку чётко-структурированных данных (с большим уровнем оптимизации, большее подходящий для решения именно задач, требующих чёткой работы и быстродействия, а так же для использования в кодогенерации). Какой язык был бы проще - никакой! Для освоения профессии - нужен третий язык (на той же платформе) - простой и не замысловатый - удобно применяемый в учебных процессах. А потом - уже нужно осваивать выше названные два языка (но не одновременно).

особенно чужой...
а в простых языках, вроде 1С, наоборот, писать надо много, но зато чужой код читается бегло без проблем...

С этим не согласен. Чужой код читается - если он хорошо написан, задокументирован и не очень длинный - а именно на таких языках он часто выходит именно монструозным и запутанным - ибо хочется реализовать универсальную продвинутую логику - только для этого не хватает выразительных средств - зато многим коддерам не влом писать тонны однотипного кода!

Поэтом я за языки - где можно применять логику более высокого уровня абстракции и повторного использования логики.
И вообще - за то, чтобы писать высокоабстрактный код помогала сама IDE в лице смарт-помошника. И анализировать его - тоже помогала IDE.

Посмотрим, когда выйдет, как это будет устроено внутри... может они под новые возможности языка платформу доработают... они уже не раз так делали... тогда и мне будет легче это реализовать...

Ну ждите - хотя платформу под язык MS, на мой взгляд, не часто дорабатывал. Сейчас уже давно больше старается все языковые развивать лишь внутри компилятора и библиотек, а не платформы! Даже не помню, что со времён 3(4)-й версии C# они такого специального в платформу (т.е. в расширение команд IL) именно для фишек языка C# вставляли (правда я тут техническими CLR тонкостями уже давно не интересовался - вот всё жду выхода 5 или даже 6 версии платформы и книжки Джеффри Рихтера по ней - чтобы не тратить время на то, что скоро отомрёт).

А я, вот, уже задумался, над реализацией LLVM фронтэнд-компилятора (и VM) для 1С Исполнителя - чтобы убедиться - что оригинальная реализация исполнителя - ДЕРЬМО (ну или я просто плохой программист - если не справлюсь лучше)!
+
262. Perfolenta 204 09.07.20 14:16 Сейчас в теме
(261)
а именно на таких языках он часто выходит именно монструозным и запутанным - ибо хочется реализовать универсальную продвинутую логику - только для этого не хватает выразительных средств - зато многим коддерам не влом писать тонны однотипного кода!

ну не знаю, я встречал много плохо написанного кода 1С, но что бы он плохо читался из-за этого не помню... я иногда смеюсь с "изощренной" логики некоторых 1С-ников, но что бы приходилось долго думать над написанным, что же оно там делает, такого не помню... при желании конечно можно все запутать, но даже самые "говнокодеры" хотят написать просто и понятно, поэтому все равно оно читается легко, только смешно...
А вот когда на том же шарпе читаю код некоторых продвинутых, то уже приходится останавливаться на некоторых местах и вчитываться разбирая пунктуацию и раскручивая длинную колбасу из лямбд и Линка... а когда еще встречаются "новинки", точное поведение которых не помнишь, то совсем туго становится...
Ну ждите - хотя платформу под язык MS, на мой взгляд, не часто дорабатывал. Сейчас уже давно больше старается все языковые развивать лишь внутри компилятора и библиотек, а не платформы!

LINK, Nullable, кортежи, TPL, Generics и т.д. всё появлялось в языке C# вместе с существенными доработками платформы (а платформа это не только IL, но и Framework, т.к. без этих библиотек ничего не будет работать совсем)... из последнего могу назвать поддержку диапазонов 1..5, которую внедрили в Core, но "забыли" внедрить в Net Framework... в результате мне диапазоны надо самому делать, т.к. я пока в Net Framework все делаю и Core пропускаю, сразу уже на Net 5 буду переходить, где-то с начала будущего года...
А я, вот, уже задумался, над реализацией LLVM фронтэнд-компилятора (и VM) для 1С Исполнителя

круто... у вас должен достойный язык получиться, судя из того, что я узнал о вас при нашем общении... однако, судя по моему опыту, дело не только в том, хороший вы программист или нет, дело в объеме работ, которого я, например, не ожидал... многое, из того, что у меня в Перфоленте еще не сделано, просто из-за недостатка времени не сделано... ведь его просто крохи остаются после основной работы и семьи... я вот за эту неделю всего-лишь смог в редакторе темную тему добавить, т.к. люди попросили... но неделя на такую мелочь, непозволительно долго, а куда денешься...
+
265. Darklight 32 09.07.20 15:06 Сейчас в теме
(262)Всё это было до C# 4.0
LINQ - C# 3.0 (да и на платформу не особо повлияло вроде бы - хотя что-то там по мелочи допиливали в .NET 3.5)
Nullable - C# 2.0 (объектные появились позже, но не повлияли на платформу)
TPL - C# 4.0 (и вроде бы тоже на платформу не влияло - чисто библиотечная реализация)
Generics C# 2.0 (тут да - платформу допиливали - но это был очень давно, я же написал, что после C# 4 платформу под язык практически если не меняли или совсем не меняли).

Расширения библиотек не особо влияют на то, как платформу используют сторонние компиляторы т.е. зачастую многое появляется как раз в расширениях для прочих компиляторов (в их библиотеках) - а потом потихоньку перетекает во фреймворк.

А проблема диапазонов в том... что Вы сейчас программируете там, где всё умерает - лучше бы переходили на Core - думаю, Вам было бы проще (кроме GUI Winforms) перевести проект сейчас уже на Core - чем вот так мучиться и потом всё-равно переводить на net 5 - который тот же Core. Уже сейчас кстати есть prewie net 5 - ну возьмите хотя бы её!

По поводу LLVM - пока меня тут самого уже много пугает и смущает - но двигаться в этом направлении я буду медленно и из далека - сейчас вот пока просто изучаю и пишу простую стековую VM (на самом деле это эмулятор 1СVM). Больше всего меня тут смущает синтаксический разбор - сколько раз я уже начинал это для 1С языка - и сколько раз бросал! Ну и оптимизация - это тоже меня очень смущает! Поэтому пока пишу VM - это проще. Сейчас для байткода 1С - потом для LLVM - потом ещё хочу их скрестить! И сделать бакэнд из LLVM в 1С (а то и наоборот тоже) - а потом уже займусь и 1С Исполнителем (набив шишек).

В планах пока перенести 1С: Исполнитель на уровне совместимости близкой к 100% (вот толкьо отдельно - уберу ";" как разделитель блоков кода - уж больно не нравится - но сделаю опцию для ~100% совместимости)
+
268. Perfolenta 204 09.07.20 15:22 Сейчас в теме
(265)
вроде бы тоже на платформу не влияло - чисто библиотечная реализация

вы немного путаете... если бы библиотеку можно было бы изъять, а компилятор продолжал бы работать, то это было бы просто библиотечной реализацией... но когда возможность работы компилятора опирается на библиотеку, и он не может без нее работать, то это уже является изменением платформы, как единого целого...
у меня в Перфоленте тоже есть такая проблема, я пока НЕ опираюсь на свою стандартную библиотеку, т.е. без нее компилятор может работать во всех своих возможностях, а компилятор шарпа без Net Framework или Core становится полностью не работоспособным (как и компилятор Перфоленты без Net Framework)...
я изучал возможность перейти на Core... на Core 2 это было не рационально, там многого необходимого еще не было, а на Коре 3 не рационально из-за скорого выхода Net 5... а раз уж я почти допилил на Net Framework, то рационально его добить до версии 1.0... хотя бы потому, что МС пообещала, что Net Framework будет поддерживаться до конца жизни Windows...
+
263. Perfolenta 204 09.07.20 14:24 Сейчас в теме
(261)
А я, вот, уже задумался, над реализацией LLVM фронтэнд-компилятора (и VM) для 1С Исполнителя

кстати, я провел эксперимент и добавил в язык несколько синонимов из 1С:Исполнителя... и Перфолента стала очень похожей на Исполнитель...
//---- почти как на языке 1С:Исполнителя ------------
    метод СклонениеСЧислом3(Количество: Число, 
                             Единственное: Строка, 
                             Множественное: Строка = "-"
                             ): Строка
        знч Цифры = {"zero","one","two","three","four","five","six","seven","eight","nine"}
        знч СловоЧисла = ?(Количество < 10, Цифры[Количество], Строка(Количество))
        пер СловоПредмета: Строка = ""
        если Количество != 1
            СловоПредмета = ?(Множественное = "-", Единственное + "s", Множественное)
        иначе
            СловоПредмета = Единственное
        конецесли
    
        возврат $"{СловоЧисла} {СловоПредмета}"
        
    конецметода    

Показать

вот так у меня теперь тоже можно писать, хотя это секрет и неофициально :))
+
267. Darklight 32 09.07.20 15:14 Сейчас в теме
(263)Ну... может это и хорошо.... радуют двоиточия ;-) не радует "метод" - ну да бог с ним (сам когда-то так хотел). "знч", "пер" - корявенько (далеко не всем понравилось), но да бог с ними. Что я тут ещё не заметил
"!=" вроде бы было
"?()" пока со скобками
Составных типов пока нет...
Неопределено как "?"?

Только не делайте разделение блоков кода через ";"
А вот универсальное окончание "конец" в принципе можно, наверное, добавить - хотя я всё-равно за "{ }" - уж больно мощная, краткая, понятная и универсальная конструкция,и распространённая!
+
269. Perfolenta 204 09.07.20 15:28 Сейчас в теме
(267)
Только не делайте разделение блоков кода через ";"

пока даже не думал... :)
"!=" вроде бы было

было <> и осталось... != теперь просто синоним...
Неопределено как "?"?

да, это давно у меня так Целое?...
знч это теперь синоним с конст
пер это теперь синоним перем
: это синоним тип
метод может заменять функцию и процедуру, которые тоже остались на своих местах....
тернарный оператор пока не хочу...
+
272. Darklight 32 09.07.20 15:35 Сейчас в теме
(269)Я имел в виду вот так: пер а : ?;
Коряво, но 1С: Исполнитель так может
Тернарный оператор можно заменить так "а = если условие тогда 1 иначе 2" - так умеет Nemerle - та все инструкции - это выражения!
Ну или как в C# 8 "а = switch (условие) { истина -> 1, _ -> 2}"
+
274. Perfolenta 204 09.07.20 15:38 Сейчас в теме
(272) можно рассмотреть такое как

пер а:Объект

но не знаю стоит ли? слово Объект не так уж и сложно написать...
+
276. Darklight 32 09.07.20 15:40 Сейчас в теме
285. Perfolenta 204 09.07.20 16:07 Сейчас в теме
(276) я пока тоже не понял...
написал я в исполнителе
пер а:?
и не смог в а ничего присвоить кроме Неопределено... т.е. ? в данном случае просто означает значение Неопределено... абсолютно бесполезная переменная получилась...

а вот
пер а: Объект?
позволяет присвоить значение любого типа....

в Перфоленте это соответствует
пер а:Объект
знак вопроса не нужен...
+
286. Darklight 32 09.07.20 16:11 Сейчас в теме
(285)Просто речь о совместимости - не более того. Просто "?" - обозначает тип "Неопределенно". Само по себе оно может и не важно. Но в совокупности с более абстрактными механиками оперирования типами - может оказаться значимым моментом.
+
289. Perfolenta 204 10.07.20 17:19 Сейчас в теме
(267)
Только не делайте разделение блоков кода через ";"
А вот универсальное окончание "конец" в принципе можно


поэкспериментировал со словом "Конец" в качестве универсального синонима... не понравилось... информация о вложенности блоков сразу теряется и в целом получается даже хуже, чем одинокая ; в строке.... одинокая ; хотя бы больше "воздуха" даёт... и в принципе она синтаксису Перфоленты не противоречит... пока оставлю всё как есть, но если вдруг захочется большей совместимости с Исполнителем, то я уже не против добавить одинокую ; в качестве конца блока...
вот такая метаморфоза.... :)
+
264. Perfolenta 204 09.07.20 14:40 Сейчас в теме
(261) есть еще один вопрос над которым я сейчас думаю... я сделал в языке оператор КАК полностью универсальным... т.е. он может преобразовывать значения любого типа в любой тип, если преобразование осуществимо... со ссылочными типами это и в шарпе так, но со структурными типами в шарпе этот оператор не работает, а у меня возвращает пустую стуктуру заказанного типа, если преобразование выполнить не удалось... вот и думаю не переборщил ли я?
более того, и левый и правый операнд могут быть представлены во время выполнения... т.е. тип назначения может быть не известен во время компиляции... сижу и думаю, может ли это быть полезно или урезать возможности?
        Перем А1 тип Целое = 1
        Б1 = А1 Как ДВещ
        Перем А2 тип Целое? = 2
        Б2 = А2 Как ДВещ
        Перем А3 тип Целое = 3
        Б3 = А3 Как ДВещ?
        Перем А4 тип Целое? = 4
        Б4 = А4 Как ДВещ?

        масА={5,6} 
        ПЧ = масА Как System.Collections.IEnumerable
        
        ЧёрныйКот = Новый Кот(12,"чёрный") 
        Живность = ЧёрныйКот КАК Животное
        ВыводСтроки Живность.Вес
        
        Перем Зверь тип Животное = ЧёрныйКот
        ВыводСтроки (Зверь КАК Кот).Цвет
        
        СтрДт = "12.03.2020 23:59:59"
        ВыводСтроки "Строка КАК Дата = " + (СтрДт КАК Дата) 
        ВыводСтроки "Структура КАК Объект = " + (555 КАК Объект)
        ВыводСтроки "Структура КАК Растение = " + ((555 КАК Растение) ?? "<Неопределено>")+" - после ошибки..."

Показать

вот так сейчас можно...
+
270. Darklight 32 09.07.20 15:29 Сейчас в теме
(264)А можно по-подробнее про проблему? Вы про то, что не работает приведение типов для типов-значений? Я-что-то не в курсе проблемы (наверное просто не сталкивался).
Насчёт правого операнда во время выполнения не понял? Вы - вот это имели в виду
функция Привести<Т>(а : Объект) : Т?
    Возврат а Как Т;
КонецФункции


Кстати, хорошо бы в классы встроить поддержку хотя бы неявного конструирования типа при приведении - т.е. "555 КАК Растение" вот это могло бы быть "Растение" - если класс "Растение" имел бы конструктор, принимающий один аргумент "число" (остальные со значениями по умолчанию).
ну наоборот тоже - но это уже явное приведение типа "Растение КАК 555" - тут класс "Растение" должен поддерживать данную операцию хотя бы как метод (про перегрузку операторов приведения говорить не будут).
Ну Вы меня поняли - я на возможности С++ намекаю ;-)
+
273. Perfolenta 204 09.07.20 15:36 Сейчас в теме
(270)
т.е. "555 КАК Растение" вот это могло бы быть "Растение" - если класс "Растение" имел бы конструктор, принимающий один аргумент "число"

я так сначала сделал, но это оказалось неудачным решением... еще где-то год назад я такие преобразования убрал из языка... прямо сейчас затрудняюсь назвать все причины, подзабыл, но помню, что столкнулся с неприятными побочными эффектами такого решения и отказался от него... слишком свободно все стало "преобразовываться"... и то что можно и то что нельзя... :)
+
277. Darklight 32 09.07.20 15:41 Сейчас в теме
(273)я говорю о применении таких преобразований только при явном использовании оператора "КАК"
+
279. Perfolenta 204 09.07.20 15:43 Сейчас в теме
(277) ну, в этом случае может и стоит подумать... запишу в мыслишки...
+
281. Darklight 32 09.07.20 15:49 Сейчас в теме
(279)Потому они и явные приведения типов! Неявные привидения типов - это всё ЗЛО - кроме приведения примитивных типов другу к другу! И приведения любых типов к строке!
+
284. Perfolenta 204 09.07.20 16:01 Сейчас в теме
(281) любые определенные как Explicit и Implicit преобразования в любых объектах вовсе не зло...
а вот через конструктор оказалось злом... но может вы и правы, как явное преобразование можно допустить и через конструктор... хотя лучше скорее всего заставить программиста написать метод явного преобразования Explicit/Implicit, т.к. сохраняется вероятность, что конструктор не был для этого предназначен... а специальный метод точно был...
+
287. Darklight 32 09.07.20 16:12 Сейчас в теме
(284)Можно и не через конструктор - суть не в том, а в том, чтобы такие преобразования были возможны - если они будут закладываться разработчиком
+
288. Perfolenta 204 09.07.20 16:16 Сейчас в теме
(287) это у меня все реализовано, любые заложенные разработчиком объекта преобразования используются... я даже старые методы FromXXX и ToXXX поддержал на всякий случай... хотя они устарели еще при переходе к Net 2.0...
но я их все еще иногда встречаю в библиотеках....
+
266. Perfolenta 204 09.07.20 15:08 Сейчас в теме
(259)
Замена перегрузок функций на одну

void logInput(int input) => Console.WriteLine($"The input is {input}");

void logInput(long input) => Console.WriteLine($"The input is {input}");

void logInput(float input) => Console.WriteLine($"The input is {input}");

может быть заменен на единственную строку:

void logInput(int|long|float input) => Console.WriteLine($"The input is {input}");

Ну.... забавно - тут вопросов нет - сладкий синтаксический саха!
Показать


а вот это я пожалуй уже сейчас реализую... тут можно все сделать элементарно и без всякого нарушения совместимости с внешним кодом... для внешнего кода будут по прежнему видны несколько перегруженных функций... хотя, вижу некоторые подводные камни, но скорее всего решаемые, например:
void logInput(int|long|float input1,int|long|float input2) => Console.WriteLine($"The input is {input}");  

тут уже 6 перегрузок надо генерировать... а если встретится уже перегруженное с такими же параметрами?
+
271. Darklight 32 09.07.20 15:32 Сейчас в теме
(266)Конфликты перегрузок решаются в языках с приоритетом более частной перегрузки - ну а коли будут совсем одинаковы - привет синтаксическая ошибка!

Наверное с C#9 - они это всё-таки по-другому сделаю
+
275. Perfolenta 204 09.07.20 15:39 Сейчас в теме
(271)
Наверное с C#9 - они это всё-таки по-другому сделаю

только если IL допилят
+
278. Darklight 32 09.07.20 15:42 Сейчас в теме
(275)Хм... ну.... не знаю - тут F# надо глянуть - там такое вроде бы уже есть и при нынешнем IL
+
280. Perfolenta 204 09.07.20 15:48 Сейчас в теме
(278) я всегда, когда гляжу как в F# сделано, прихожу к мнению, что там просто накостылено... всё очень громоздко... команда C# точно во взаимодействии с разработкой платформы действует, а F# у них похоже как гадкий утенок где-то сбоку гнездится...
+
282. Darklight 32 09.07.20 15:51 Сейчас в теме
(280)Слышал абсолютно обратное мнение :D
+
283. Perfolenta 204 09.07.20 15:56 Сейчас в теме
(282) я не про сам язык F#, там красиво, я про то, как они на уровне IL все это реализуют... мне что-то ни разу не захотелось делать как у них...
а вот в C# и в VB внутренности мне часто нравятся и я бывает переделываю своё как у них...
+
35. tormozit 7140 23.06.20 16:27 Сейчас в теме
Опечатка - "тренарный" -> "тернарный".
+
36. CyberCerber 853 23.06.20 16:33 Сейчас в теме
(35) Спасибо, поправил
+
41. naf2000 23.06.20 16:40 Сейчас в теме
Элементы коллекций все равно получаются типа "любой", что не очень хорошо. Нужны generics
+
44. CyberCerber 853 23.06.20 16:44 Сейчас в теме
(41) Т.е. задавать ограничение типа для всей коллекции сразу?
+
48. naf2000 23.06.20 16:53 Сейчас в теме
(44) как это делается в шарпе и джаве, например:

МассивМоихСтруктур = новый Массив<МояСтруктура>()
+
49. CyberCerber 853 23.06.20 16:55 Сейчас в теме
(48) Ну да, я понял. Да, наверное, это было бы правильно для строготипизированного языка.
Darklight; +1
200. Darklight 32 25.06.20 16:19 Сейчас в теме
(49)Это уже классический подход XXI - века обобщённые (джереник) типы в строготипизированных языках!
+
133. Perfolenta 204 24.06.20 22:21 Сейчас в теме
(48) прямо как у меня в Перфоленте :)
+
43. tormozit 7140 23.06.20 16:44 Сейчас в теме
Как в этом языке записать сложное многострочное условие, чтобы инструкции ветки были хорошо отличимы от самого условия?
+
46. CyberCerber 853 23.06.20 16:45 Сейчас в теме
(43) Ну, кажется, та же самая проблема есть и в обычной 1С. Если начинается с "И", "Или", то это условие
+
201. Darklight 32 25.06.20 16:20 Сейчас в теме
(43)А не могли бы пояснить на примере - очень интересно в чём засада?
На мой вгляд (как я пронял) - тут часто больше проблема форматирования в IDE - т.е. если бы для IDE можно было написать плагин, позволяющий красиво форматировать такие условия - то и на язык не нужно было бы пенять).
Ну а в остальном в помощь - обявление вспомогательных функций в тексте (с замыканием и каррингом).
Применение такого сравнения через "ИЗ" (В), в т.ч. с кортежами
ну и продвинутый паттерн мэтчинг:


//Где-то объявлены переменные а,б,в,Знч

Перем чек1 : () =>  (а == б) ИЛИ (а == в);
Перем чек2 : (с,д) =>  (а == с) ИЛИ (а == д);
Перем чек3 : (с,д) =>  (а == с/2) ИЛИ (а == д/2);
Перем чек4 : (с,д, чек1, чек2, чек3=неопределено)=> чек1(с,д) ИЛИ чек2(с,д) ИЛИ чек3?(с,д?,чек1,чек2);
Пере  Функ1 :() => 0;
Если 
         чек1() 
 ИЛИ Подбор (Знч) ИЗ ["Один","Два","Три",Функция1()]  //Match(Знч)
 {
         Фун1() : "Ноль",
         1 : "Один",
         чек2() => "Два",
         чек3(а,б) => "Три",
         чек4(1,_,чек2,чек3) ИЛИ Знч=4 => "Четыре",
         чек4(1,_,чек2,чек3,чек5)  => Функция1(),
         _ : "Минус один"
  }
ИЛИ  Знч = -1
ТОГДА
{

}

Показать
+
52. naf2000 23.06.20 17:12 Сейчас в теме
Да нефига, C# язык регистрозависим, но два public класса в одной сборке с именами отличающимися только регистром не создадите.
Сделано это для поддержки языков, где нет регистрозависимости.
Тем не менее он регистрозависимый.
+
54. awk 741 23.06.20 17:30 Сейчас в теме
(52) А два private?

Подозреваю, что имя файла совпадает с именем класса, перечисления, структуры. А тут вступают ограничения не языка....
+
55. naf2000 23.06.20 17:37 Сейчас в теме
(54) нет. Имена файлов могут быть любыми. Один класс в нескольких файлах. В одном файле несколько классов.
private и internal можно, как все что используется только внутри сборки.
Это всё в документации написано.
+
60. comol 5052 23.06.20 17:54 Сейчас в теме
Огонь а не "язык". Главное не постите эту новость и статью на хабре... а то будет реально стыдно :(. На инфостарте ещё ладно, тут свои - по доброму смеются.

А так "уникальный строготипизированный скриптовый почти регистрозависимый язык, требующий JVM для запуска скрипта с возможностью кодить на русском языке" звучит угнетающе.

Хочется верить что те люди которые сиё чудо придумали и разработали больше ничего в 1С не разрабатывают, а то и правда страшно как то :(
Perfolenta; oldcopy; YuriFm; AnderWonder; +4
61. awk 741 23.06.20 18:02 Сейчас в теме
(60) Это заход на 1С:Предприятие 9.0
+
62. comol 5052 23.06.20 18:21 Сейчас в теме
(61) Уже был заход... когда то... 1С на Java. Слава богу не зашло... хотя идеи были неплохие в основе. Если бы это был как "новый язык для 9.0" это было бы ещё куда не шло - можно было бы обсуждать и вцелом конечно телодвижения правильные.
Но сейчас как в старом анекдоте "теоретически у нас есть 3 миллиона долларов, а практически ..." строготипизированный скриптовый язык на JVM, хз кому и для чего нужный.
Darklight; +1
64. awk 741 23.06.20 18:33 Сейчас в теме
(62) Groovy, Kotlin, Scala, JPython, JRuby - то же на JVM. Тут не принципиально. Просто захватывать рынок, на котором не протолкнуться, с сомнительными бизнес-преимуществами как-то странно, для взрослых, вменяемых людей, с большими деньгами.
Рекомендую попробовать:

/* Hello World in Groovy */
def Мяу = "Я на русском?"
println("Hello world $Мяу")

Ввести и выполнить
https://www.tutorialspoint.com/execute_groovy_online.php

Что бы понять, что русский язык - это сомнительное бизнес-преимущество.
+
69. aximo 2029 23.06.20 18:49 Сейчас в теме
70. comol 5052 23.06.20 19:06 Сейчас в теме
(64) и что из этого на JVM используется для автоматизации задач администрирования. Т. Е. Чтобы админиьь сервер мне надо туда Яву сначала впихнуть? А если у меня таки автономный сервер в докере? У меня контейнер и так немаленький из за 1С вырастет ещё в 5 раз?....

Кодить на русском ещё норм... Но задачи администрирования на русском... Это уже уж очень сомнительно
oldcopy; +1
74. awk 741 23.06.20 19:19 Сейчас в теме
(70)
Но задачи администрирования на русском... Это уже уж очень сомнительно
Особенно когда намучишься с кодировкой.

и что из этого на JVM используется для автоматизации задач
Groovy в Jenkins.
[IS-QUOTE]
Т. Е. Чтобы админиьь сервер мне надо туда Яву сначала впихнуть? А если у меня таки автономный сервер в докере? У меня контейнер и так немаленький из за 1С вырастет ещё в 5 раз?..../QUOTE]

Как сказал Чарльз Миллз Мэ́нсон маме:
- Если тебе не нравятся мои друзья - покушай салатику.
comol; oldcopy; +2 1
63. aximo 2029 23.06.20 18:30 Сейчас в теме
опять повторяют ошибку как и с ЕДТ. - требуют Джаву.
comol; +1 2
68. CyberCerber 853 23.06.20 18:38 Сейчас в теме
(63) А что надо требовать?
+
72. comol 5052 23.06.20 19:10 Сейчас в теме
(68) для скриптового языка ничего. Он должен быть наивным с ноль сторонних библиотек. Если ориентирован на Windows то ещё хоть . Net можно. В 1С же есть нормальные разработчики C++ платформа то на плюсах написана. На фига набирать студентов джавистов и снижать качество из за экономии.
kote; +1 2
Оставьте свое сообщение