Упражнения на Перфоленте. Парсим технологический журнал 1С

Публикация № 1101638

Администрирование - Администрирование данных 1С - Сервисные утилиты

программа язык программирования Перфолента Сергей Рогаткин технологичесий журнал

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

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

Подтолкнула меня к экспериментам статья Go. Разбор лога технологического журнала. Достойная альтернатива perl'у

В ней рассматривается вариант парсера написанного на языке Go вместо аналогичного решения на Perl. Я не знаю ни Go, ни Perl. И, хотя, разобраться в них для меня особого труда не составляет, т.к. я знаю достаточно языков, что бы понять и использовать еще два, не слишком хочется тратить на это время.

Тем более, что я недавно опубликовал демонстратор языка программирования Перфолента и время мне позарез необходимо на его отладку и развитие.

Итак, поехали… Для начала, мне очень понравилась картинка в указанной статье, демонстрирующая многопоточную обработку файлов ТЖ (здесь и далее ТЖ равно «технологический журнал») и я решил, что и на Перфоленте попробую сделать похожую структуру программы. Затем, сделал вывод, что мне не хочется изобретать и использовать массу параметров командной строки. Проще сделать копию программы для другого отбора и обработки строк, ведь исходный код всегда под рукой. Постепенно накопятся все необходимые мне варианты.

Начало программы стандартное, нажимаем меню Шаблоны\Программа и получаем начальный шаблон, где необходимо ввести имя программы:

 

//***************************
#ИспользоватьСтандартнуюБиблиотеку
Программа ПарсерТЖ
    //---------------------------
    Процедура Старт

    КонецПроцедуры
КонецПрограммы    

 

Теперь в процедуре Старт начинаем писать код. Нам необходимо обработать все файлы логов ТЖ находящиеся в папке программы. При необходимости, можно указать и другой каталог. Обрабатывать файлы будем в многопоточном цикле ДляКаждого, который использует все имеющиеся ядра процессора.

 

   //выбираем все лог файлы из текущей папки
   //загрузим все ядра процессора
   Рез=ПараллельныеДействия.ДляКаждого<Файл>(
                   ФС.ВыбратьФайлы(ЭтаПрограмма.Каталог,"*.log"),
                   ПолучитьДелегат(,ОбработатьФайл,"ДействиеПроц<Файл>"))

 

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

Синтаксис оператора ПолучитьДелегат такой:

ПолучитьДелегат( Объект , ИмяМетода, "ТипДелегата")

В нашем случае параметр Объект не обязателен, т.к. метод расположен в этом же модуле Программа. Тип делегата выбираем из имеющихся в стандартной библиотеке, главное, что бы совпадало число и тип параметров. Параметр ТипДелегата в данном случае тоже можно опустить, компилятор поймет и так ПолучитьДелегат(,ОбработатьФайл), но я решил написать в примере полный синтаксис, есть случаи, когда этот параметр обязателен.

 

Напишем эту процедуру чуть ниже процедуры Старт:

 

    //---------------------------
    Процедура ОбработатьФайл(Ф тип Файл
    
        Ив = Новый ИнтервалВремени
        
        Чт = Новый ЧтениеТекста(Ф)

        Пт = Новый ПостроительТекста

        Кво=0
        Цикл 
            Стр=Чт.ПрочитатьСтроку
            ПрерватьЕсли Стр Это Неопределено
            
            //началом строки события считаем шаблон ^\d\d:\d\d\.\d+
            //однако проверка только разделителей вполне надёжна и достаточна
            Если Сред(Стр,3,1)=":" И Сред(Стр,6,1)="." 
               Если Пт.Количество <> 0
                   Кво++
                   ОтборСтрок(Пт.ВСтроку)
               КонецЕсли    
               Пт.Очистить
            КонецЕсли
            Пт.Добавить(Стр)
        КонецЦикла
        Если Пт.Количество <> 0
            Кво++
            ОтборСтрок(Пт.ВСтроку)
        КонецЕсли    
        
        Чт.Закрыть
        
        ВыводСтроки "Обработали файл: "+Ф+"  Количество строк = "+Кво+"  Время, сек: "+Ив.ВсегоСекунд
        
    КонецПроцедуры    

 

Готово… Теперь наши файлы обрабатываются и для каждой строки вызывают процедуру ОтборСтрок(ТекущаяСтрока). Объект ПостроительТекста используем для ускорения конкатенации строк. Объект ИнтервалВремени используем для измерения времени обработки файла. Строки приходится склеивать потому, что в файле ТЖ могут быть многострочные фрагменты в определении одного события. Формально, в ТЖ события заканчиваются символами ВКПС, а многострочные строки разделяются символом ПС, но, к сожалению, для объекта ЧтениеТекста это одно и то же.

Теперь нам надо написать процедуру ОтборСтрок, в которой мы применим правила первого отбора. Почему я решил делать отбор в 2 этапа? Потому, что если файл лога у нас будет только один, или их будет меньше, чем ядер процессора, то процессор мы полностью не загрузим. Сложная обработка строки будет тормозить работу. А если быстро отобрать строки только по имени события, например «SDBL», то дальнейший отбор мы сможем вести многопоточно, вне зависимости от числа файлов.

Процедура получилась простая:

 

    //---------------------------
    //В этой процедуре отберем только интересующий нас вид строк
    Процедура ОтборСтрок(Стр тип Строка
        Если Найти(Стр,ФильтрСобытия)=0
            Возврат
        КонецЕсли
        Если ИспользоватьФильтрДанных И Найти(Стр,ФильтрДанных)=0
            Возврат
        КонецЕсли
        ОчередьСтрок.Добавить(Стр)
    КонецПроцедуры   

 

Как видно, мы используем в виде накопителя отобранных строк некий объект ОчередьСтрок, а так же еще несколько имен: ФильтрСобытия, ФильтрДанных, ИспользоватьФильтрДанных. Это всё поля, которые мы определили в модуле Программа:

 

Программа ПрасерТЖ

    Поле ФильтрСобытия тип Строка = ",SDBL,"
    Поле ФильтрДанных тип Строка = "Context=" 
    Поле ИспользоватьФильтрДанных тип Булево = НЕ ФильтрДанных.Пустая

    Поле ОчередьСтрок тип Очередь<Строка> = Новый Очередь<Строка

 

В Перфоленте у объектов есть Поля, которые похожи на переменные модуля 1С, но все же это не переменные, переменные в Перфоленте «живут» только в методах.

Объект ОчередьСтрок используется одновременно несколькими потоками, добавляющими в него отобранные строки. Если бы это была обычная коллекция, то могли бы возникнуть проблемы. Многопоточность опасна, если разные потоки одновременно обращаются к одним и тем же данным. Однако, в Перфоленте многие коллекции обобщенного типа, в том числе и Очередь<>, являются потокобезопасными и поэтому ни какая дополнительная синхронизация нам не потребуется.

 

На данном этапе у нас уже есть коллекция отобранных строк для события SDBL. Запустим их многопоточную обработку и посчитаем суммарное время работы для каждого контекста выполнения.

 

       
       
//обработаем все найденные строки
       Рез=ПараллельныеДействия.ДляКаждого<Строка>(
                   
ОчередьСтрок,
                   
ПолучитьДелегат(,ОбработатьСтроку,"ДействиеПроц<Строка>"))

 

Ничего нового по сравнению с обработкой файлов в этом фрагменте кода нет, разве что тип Файл сменился типом Строка.

Напишем процедуру окончательной обработки строки лога:

 

    //---------------------------
    //Получим из строки интересующие нас данные
    Процедура ОбработатьСтроку(Стр тип Строка
        
//получим длительность события
        Длительность = Число(Стр.Сред("-",","))
        
        
//получим контекст
        //Контекст = Стр.Сред("Context='","'")
        
        
//а можно воспользоваться и регулярным выражением
        Контекст = ""
        
Рег = Новый РегулярноеВыражение("(?<=Context=').*?(?=')")
        
Если Рег.Совпадает(Стр)
            
Контекст=Рег.НайтиСовпадения(Стр)[0].Значение
        КонецЕсли
        
        
        
//нам все же понадобится блокировка, т.к. несколько потоков могут одновременно попытаться увеличить значение по одному и тому же контексту

        Блокировка ОчередьСтрок
            //сложим время одинаковых контекстов

            Было = Результат.Получить(Контекст)
           
Результат.Вставить(Контекст, Было+Длительность)

        КонецБлокировки

      
    
КонецПроцедуры  

 

Как мне кажется, этот код будет понятен всем программистам 1С. Отбор фрагментов строки можно осуществлять двумя способами, обычными функциями работы со строками и регулярными выражениями. Кому что больше нравится.

Результат в этот раз мы собираем в коллекцию типа Соответствие<Строка,Число>. Выглядит немного необычно для программистов 1С, но не для программистов C#. В данном случае, мы просто указываем, что ключ соответствия будет иметь тип Строка, а значение будет иметь тип Число. Другие типы в этой коллекции сохранить нельзя. Можно ли использовать обычное Соответствие? Можно, но скорость его работы будет меньше и понадобятся блокировки, т.к. обычное Соответствие не является потокобезопасным.

 

    Поле Результат тип Соответствие<Строка,Число> = Новый Соответствие<Строка,Число

 

Осталось обработать результат. А давайте сохраним его в файл Эксель и откроем.

 

      
       
//обработаем результат, например, создадим табличку
       Док=Новый ТабличныйДокумент
       НомСтр=1; 
       
Для КлючЗнач Из Результат
           //берем только длительные события
           ПродолжитьЕсли КлючЗнач.Значение<400000 
           
Док.УстановитьЗначениеЯчейки(НомСтр  , 1,КлючЗнач.Значение
           
Док.УстановитьЗначениеЯчейки(НомСтр++, 2,КлючЗнач.Ключ
       
КонецЦикла

       //сохраним и откроем в Экселе
       Док.Записать(ЭтаПрограмма.Каталог+"ТабличныйДокумент.xlsx") 
       
ЗапуститьПриложение(ЭтаПрограмма.Каталог+"ТабличныйДокумент.xlsx")  

 

Я тут в цикле дополнительно ограничил количество строк, отобрал только те, длительность которых была не меньше 400000 миллионных долей секунды. Просто меня интересуют самые медленные.

 

А что со скоростью?

Вполне сопоставимо со скоростью программы на Go, у меня даже быстрее получилось, но не факт, что на любом компьютере будет так же. Тестовый файл размером 5,7 ГБ, около 10 млн. строк, пережевался за 5 минут.

 

А что с потреблением памяти и допустимым размером файлов лога?

Во время обработки файла размером 5,7 ГБ максимальное потребление памяти программой составило 1,2 ГБ. Файлы больше указанного размера я не проверял, но скорее всего проблем не будет.

 

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

19

Скачать файлы

Наименование Файл Версия Размер
Исходный текст программы парсинга ТЖ на языке Перфолента
.pfl 6,06Kb
31.07.19
0
.pfl 1.0.0 6,06Kb Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Evil Beaver 6247 31.07.19 17:56 Сейчас в теме
У вас Если без Тогда? т.е. переносить операции на другую строку уже нельзя?

Если А = 1 и 
    БольшоеСложноеДействие() // это все еще выражение условия?
    В = 3; // а это тело условия?
КонецЕсли;


И что такое "ПродолжитьЕсли"? Такое есть в VB.NET? Я в C# не встречал
2. Perfolenta 165 31.07.19 18:03 Сейчас в теме
(1) можете смело писать Тогда, оно просто не обязательное... можете переносить так как написали в своем комментарии, хотя я больше люблю, что бы И было не в конце строки, а в начале следующей...
да, ПродолжитьЕсли это оригинальный оператор Перфоленты...
еще есть:
ПрерватьЕсли Условие
ВозвратЕсли Условие
можно и с пробелом:
Прервать Если Условие
Возврат Если Условие
3. Evil Beaver 6247 31.07.19 18:06 Сейчас в теме
Кажется перфоленте не хватает описания формальной грамматики языка где-нибудь в открытом доступе. А то читаешь и удивляешься чего только не надо будет узнать...

P.S. я пожалуй пока останусь при своем мнении, что это совсем другой язык, даже не "похожий на 1С", и учить его не полезнее, чем сразу учить C#. Я могу ошибаться.
GreenDragon; kuntashov; +2 Ответить
4. Perfolenta 165 31.07.19 18:07 Сейчас в теме
(3) это верно, я файл документации только на четверть написал... надеюсь, как и обещал к новому году выкатить...
5. Perfolenta 165 31.07.19 18:08 Сейчас в теме
(3) для начала можно просто по 1с-ному писать... постепенно узнавая что-то новое... я не думаю, что у вас лично возникла проблема с пониманием хотя бы одной строки кода...
а для чистых 1С-ников да, есть новинки, но не так много, что бы нельзя было понять их смысл... а как иначе привнести в язык современные новинки?
Как прикажете записать кортежи не меняя синтаксис 1с? пришлось менять... старался осторожно подходить, что бы не слишком страшно выглядело...
6. Evil Beaver 6247 31.07.19 18:18 Сейчас в теме
(5) Нуу... я в уме переводил на шарп или на VB. Но это как раз говорит о том, что когнитивная нагрузка языка довольно большая. А чисто по 1С-ному разве можно? У вас же строгая типизация, переменные объявлять надо.
7. Perfolenta 165 31.07.19 18:21 Сейчас в теме
(6) объявлять типы обязательно только для полей, свойств и в сигнатурах методов... переменные можно все неявно инициализировать, как и делают в 1с чаще всего... я сначала начинал делать то, что получилось у вас, но потом понял, что ни как не впишусь в рамки 1С и начал "реформу" языка, старая сохранить наследственность от 1С, но не более того...
8. Evil Beaver 6247 31.07.19 18:36 Сейчас в теме
(7) ну потому что MSIL и CLR рассчитывают на строгую типизацию, поэтому я на ранних этапах забросил идею компиляции в MSIL или использования LLVM
9. Perfolenta 165 31.07.19 18:40 Сейчас в теме
(8) вам повезло :) я не ожидал того объема работ, который пришлось и еще предстоит сделать... там еще и подводных камней оказалось предостаточно... документация Microsoft та еще штучка... особенно обидно, когда что-то делаешь, а потом натыкаешься где-то на сноску мелким шрифтом и понимаешь, что делал все не правильно...
25. Darklight 19 02.08.19 11:14 Сейчас в теме
(8)Зря забросили идею компиляции в LLVM
Есть языки с динамической типизацией, имеющие компилятор в LLVM (ну если я не ошибаюсь - я тут пока профан, но тема мне очень интересна), например JavaScript, Python, Ruby

Вот тутесть небольшая статья "Динамическая компиляция программ на языке JavaScript в статически типизированное внутреннее представление LLVM"

Хотя я лично за языки со статической типизацией (и верю что будущее развития языка платформы 1С Предприятие именно в статике) - но и динамические тоже нужны - особенно для скриптов и макросов, но если они ещё и компилятор в LLVM получат - так вообще очень круто выходит - за LLVM будущее!
16. Perfolenta 165 02.08.19 00:51 Сейчас в теме
(6)
А чисто по 1С-ному разве можно? У вас же строгая типизация, переменные объявлять надо


Сегодня, ради проверки ответа на ваш вопрос, я взял библиотеку для OneScript под названием TRun1C, думаю знаете такую... в ней 1921 строка кода... прилично...
У меня ушло примерно 20 минут, что бы превратить ее в DLL библиотеку!
Ушло бы и меньше, но я же не автор библиотеки, так что на беглое изучение кода потратился...
Я только обернул ее в класс, прописал типы в сигнатуры методов и еще несколько мелочей, вроде замены слова Экспорт на атрибут &ВидноВсем... и все, библиотека нормально откомпилировалась и заработала...
т.е. в самих методах мне почти ничего не пришлось менять... все по односкриптному осталось...
Вывод... для начала вполне можно писать по одинэсному, изучив минимальные требования к оформлению программы... и прочитав немного о переменных и типах, например тут http://promcod.com.ua/subcat.asp?cat=perfolenta-programmig-language&subcat=perfolenta-syntax
22. Darklight 19 02.08.19 11:00 Сейчас в теме
(5)Простите, а где у Вас здесь продемонстрирован кортеж?
23. Perfolenta 165 02.08.19 11:05 Сейчас в теме
(22) это к слову пришлось... пример с кортежами есть в дистрибутиве...
выглядят кортежи примерно так:

к3 = $(400,"Hello_5")


или вот функция возвращающая кортеж:

Функция ПолучитьКортежValueTuple() тип $<Целое,Строка> //работает
        
        Возврат $(200,"Hello_2") //работает
        
        //и более длинные варианты того же самого:
        
        Возврат $<Целое,Строка>(200,"Hello_2") //работает
        Возврат Новый $<Целое,Строка>(200,"Hello_2") //работает
        Возврат Новый ValueTuple<Целое,Строка>(200,"Hello_2") //работает
        Возврат ValueTuple.Create<Целое,Строка>(200,"Hello_2") //работает
        
КонецФункции
Показать
27. Darklight 19 02.08.19 11:18 Сейчас в теме
(23)Здорово! А именнованные поля кортежей поддерживаются? А деконструкция? А Свитчи?
29. Perfolenta 165 02.08.19 11:29 Сейчас в теме
(27) ну вы прям всё сразу от меня хотите :)
именованые поля пока не поддерживаются, я их отложил в долгий ящик... т.к. не считаю их слишком уж полезными...
деконструкция уже есть, но пока только в переменные и в массив... в цикле Для уже есть, но в опубликованном дистибутиве этого еще нет...
со свитчами сложнее, сделать их совсем просто, но я ни как не могу придумать хороший русскоязычный вариант... мучаюсь с этим...
с одной стороны хочется такой же мощный Select как на VB, но с другой стороны простинький как в С# мне тоже нравится... короче как остановлюсь на чем-то так и появится...
33. Darklight 19 02.08.19 11:36 Сейчас в теме
(29)Именованные поля очень полезны - я при работе с кортежами предпочитаю как раз с ними работать!
40. Perfolenta 165 02.08.19 12:51 Сейчас в теме
(33) может быть... хотя я обычно именование полей в кортежах не использую... у меня в программах кортежи это временные транзитные структуры.. а если надо долгоживущую, то я обычную структуру делаю..
я обязательно именованные поля сделаю, но значительно позже... сейчас еще большой список задач, которые я считаю более важными...
59. Perfolenta 165 08.08.19 15:28 Сейчас в теме
(27) сделал "свитчи" :)
выглядит так

Выбор [Для] <expr> :
( Когда <expr> [ПРИ <expr>] [, <expr> [ПРИ <expr>]] [ Тогда ] : <stmt>+ : )+
[ Иначе : <stmt>+ : ]
КонецВыбора

работает...

      Для Инд=1 По 8
       
           Выбор Для Инд
           Когда 1,3,5 Тогда
               ВыводСтроки "Не четные"
           Когда 2,4,6 //ключевое слово Тогда не обязательное
               ВыводСтроки "Четные"
           Когда 35
             Тогда
               ВыводСтроки "Таких не бывает"
           Иначе
               ВыводСтроки "Больше 6"
           КонецВыбора        
       
       КонецЦикла
    
       Для Инд=1 По 8
       
           //каждый блок в одну строку
           Выбор Инд //ключевое слово Для не обязательное
           Когда 1,3,5 Тогда ВыводСтроки "Не четные"
           Когда 2,4,6;      ВыводСтроки "Четные" 
           Когда 35;         ВыводСтроки "Таких не бывает"
           Иначе             ВыводСтроки "Больше 6"
           КонецВыбора        
       
       КонецЦикла
       
       Для Каждого Об тип Объект Из {5, 10, 15, "Привет", "А"с, "Ф"с, Истина, '20191231'}
       //а можно просто 
       //Для Об Из {5, 10, 15, "Привет", "А"с, "Ф"с, Истина, '20191231'}
       
           //с дополнительным условием ПРИ      
           Выбор ТипЗнч(Об)
           Когда Тип("Целое") При Об>10,
                 Тип("Целое") При Об=10
                ВыводСтроки "Целое >= 10"
           Когда Тип("Целое") При Об<10 Тогда
                ВыводСтроки "Целое < 10"
           Когда Тип("Символ") При Об<"Я"с и Об>"О"с Тогда
                ВыводСтроки "Символ"
           Когда Тип("Дата")
                ВыводСтроки "Дата"
                Прервать //это прерывание цикла, а не выход из блока, как в C#!!!!
           Иначе       
                ВыводСтроки "Другое значение: "+Об+" ТипЗнч="+ТипЗнчСтр(Об)
           КонецВыбора        
   
       КонецЦикла

Показать
61. Darklight 19 19.08.19 10:07 Сейчас в теме
(59)Это хорошо!
А свитчи-выражения?


Когда 2,4,6; ВыводСтроки "Четные"

Такая запись (с точкой запятой посреди оператра) выглядит очень непривычно и как-то не логично (даже не знаю - есть ли где-то ещё, в других языках такие конструкции - где точка с запятой может разделять секции одного оператора, хотя - конечно же такое есть - это цикл for например в c ++ (и некоторых других, схожих с ним языках) "for (int i = 1 ; i < 100; i++)" - но тут внутри скобок список из трёх отдельных выражений, а не одно семантическое выражение, разделённое на части через ";" - но мне никогда такая запись не нравилась - в Kotlin или Python это реализовано более изящно, но это лирика - речь не про циклы, а про применение ";" внутри одного оператора - ну очень коряво это, на мой взгляд.

А по поводу свитчей - всё же посмотрите лучше в сторону Kotlin и его оператора "when"
62. Perfolenta 165 19.08.19 19:03 Сейчас в теме
(61)
Такая запись (с точкой запятой посреди оператра) выглядит очень непривычно и как-то не логично

ну почему же не привычно... на языке 1с в одну строку именно через точку с запятой и пишут... точка с запятой может использоваться везде где нужен разделитель... кстати, в данной конструкции ее можно было даже и не ставить, я просто тестировал разные варианты написания.... компилятор Перфоленты в большинстве случаев прекрасно переваривает отсутствие ;
А свитчи-выражения?

не понял что вы имеете ввиду? в моем предыдущем комментарии, в самом начале, там где формальное описание, <expr> означает выражение...
А по поводу свитчей - всё же посмотрите лучше в сторону Kotlin и его оператора "when"

смотрел я... ничего особенного не увидел... по-моему, в C# и в Vb даже мощнее, чем в Котлине... если не считать функциональной формы оператора when, когда возвращается результат... может быть такую тоже сделаю... а, понял... вы, наверное, это и имели ввиду, спрашивая про свитчи-выражения?

кстати... в Перфоленте функциональную форму котлиновского оператора when частично заменяет оператор ?(условие1, результат1, условие2, результат2 ..., условиеN, результатN, результатИначе)
63. Darklight 19 20.08.19 10:43 Сейчас в теме
(62)
ну почему же не привычно... на языке 1с в одну строку именно через точку с запятой и пишут...

Речь идёт не о разделение разных операторов друг от друга, а о составных операторах, состоящих их нескольких вложенных секций выражений. Покажите мне в 1С такой оператор, где секции составного оператора разделены ";" ? Хотя я сам уже знаю ответ ("если а = 1 тогда б=1; иначе б=2 конецесли" - в 1С это допустимая синтаксическая конструкция в составном операторе условия - но тут "иначе" - это одновременно и операторная скобка (двусторонняя) новый оператор. Лично мне допустимость ";" перед "иначе" не нравится. Мне больше по душе Сишный вариант (или Паскалевский...) - когда перед оператором точка с запятой не ставится.

Точка с запятой - в абсолютном большинстве случаев - воcпринимается как разделение разных операторов друг от друга, когда, условно, любой из них может отсутствовать и никак синтаксически не связан с соседями (исключение - оператор "for" - в Си подобных языках - но там особый случай и особая семантика применения).

Говоря о Kotlin я намекал о лаконичности, простоте и унифицированности синтаксической конструкции "when", которая семантически тяготеет к функциональным языкам и оператору "match" - минимум ключевых слов, максимум наглядности и унифицированности (в данном случае с лямда выраженияями): оператор "when" всей своей семантической конструкцией представляет просто список сопоставления с образцом в формате лямбда-выражения, которые и так ассоциированы с некоторым функциональным сопоставлением, а вернее отображением левой части в правую (обычно)


fun describe(obj: Any): String
{
when (obj) {
1 -> return "Единица"
in 1..10 -> return "издеваетесь?"
in 10..100 -> return "маловато будет"
in 100..1000 -> return "кота прокормлю"
in 1000..1000000 -> return "на хлеб с икрой!"
is Cat -> return "Кот!"
"Hello Kitty" -> return "Приветствуем котика"
is Long -> return "Long"
!is String -> return "Не строка"
'а', 'е', 'ё', 'и', 'о', 'у', 'я', 'э', 'ы', 'ю' ->return "$obj гласная"
else -> return "Unknown (Неведома зверушка)"
}
}
Показать


Или в виде выражения (но это уже другое предложение):

fun describe(obj: Any): String =
when (obj) {
1 -> "Единица"
in 1..10 -> "издеваетесь?"
in 10..100 -> "маловато будет"
in 100..1000 -> "кота прокормлю"
in 1000..1000000 -> "на хлеб с икрой!"
is Cat -> "Кот!"
"Hello Kitty" -> "Приветствуем котика"
is Long -> "Long"
!is String -> "Не строка"
'а', 'е', 'ё', 'и', 'о', 'у', 'я', 'э', 'ы', 'ю' ->"$obj гласная"
else -> "Unknown (Неведома зверушка)"
}

[/IS-QUOTE]

Единственное, что Kotlin так и не поддерживает пока несколько условий в одной строке сопоствления, напримерh C# может так (switch case when):


object a = get_a();
switch (a)
{
case int a when a == 0: Console.WriteLine("а - это целое число = 0");
break;
case double a when a > 0: Console.WriteLine("а - это дробное число > 0");
break;
case string a when a.length > 0: Console.WriteLine("а - это строка, длинной больше нуля");
break;
case object a when a != null: Console.WriteLine("а - это существующий объект");
break;
default: Console.WriteLine("а - не известно");
}

Показать


Правда в таком синтаксисе лишние case и break излишни напрягают!
Кстати, ";" тут тоже есть - но они не отделют две части составного подвыражения case друг от друга - а отделяют отдельные строки сопоставления с образцом.

Кстати, с недавних пор C# тоже поддерживает switch-выражения


var operation = 2;

var result = operation switch
{
1 => "Case 1",
2 => "Case 2",
3 => "Case 3",
4 => "Case 4",
_ when value > 10 => "case > 10",
_ when value <= -10 => "case <= -10",
_ => "No case availabe"
};
Показать


И заметьте - синтаксис преобразился и стал очень похож на Kotlin (тоже описывается лямбда-выражений)
Кстати, применение символа "_" для секции иначе/дефолт - я считаю более логичным (первый раз такое заметил в Scala - там вообще очень любят этот символ обрабатывать особым образом), странно почем так не сделали в Kotlin (правда там для этого применяют ключевое слово "it"). Даже применять "_" можно несколько раз - и доп. условия "when" поддерживаются.
И тут уже нет ";" внутри составного оператора - что для едино-вычисляемого выражения было бы вообще дико (наличие внутри ";").
Так что - можете смотреть на новый синтаксисиc switch'ей в C# 8.0 - он более продвинут даже чем в Kotlin - только если уж делать такой - то унифицированно для switch классических операторов и выражений
64. Perfolenta 165 20.08.19 11:30 Сейчас в теме
(63)
Хотя я сам уже знаю ответ ("если а = 1 тогда б=1; иначе б=2 конецесли"

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

и Котлин и Шарп наследники синтаксиса Си, поэтому не удивительно, когда они приходят к похожим решениям...
но Перфолента наследует синтаксис 1С, поэтому я не могу делать его Си-подобным и не хочу...
я просто пытаюсь здравые идеи других языков красиво выразить в синтаксисе Перфоленты...
например, благодаря вам, я решил, что надо добавить оператор В (in), я и раньше о нем думал, но теперь пришел к мнению, что он точно будет...
еще, задумался над необходимостью диапазонов 1..10, может тоже сделаю, но еще не решил... надо определиться какие операции будут доступны с диапазонами и что они из себя внутренне будут представлять...
Спасибо за ваши советы, они заставляют думать о том, о чем не думал до этого... вы уже повлияли на развитие Перфоленты :)
65. Darklight 19 20.08.19 12:20 Сейчас в теме
(64)

и Котлин и Шарп наследники синтаксиса Си, поэтому не удивительно, когда они приходят к похожим решениям...
но Перфолента наследует синтаксис 1С


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

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

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

Вот, например C# и VB сейчас развиваются именно так. Их тяготит груз прошлого - ориентированности на своих "прародителей" в виде C++ и VB6 более ранних версий. Не могу сказать, что мне это нравится - но у них нет выхода - создатели языков хотя их развивать и шагать в ногу со временем, но языки уже не новые - и у них есть много груза "из прошлого" который они тянут ради совместимости и приемственности, которые были в них внедряны на этапе их первоначального проектирования чтобы привлечь программистов, знакомых с языками-прорадителями!

Вот Python - сделал ход - отказался от совместимости с устревшим синтаксисос при переходе на 3-тю редакцию - это болезненное решение, но думаю со временем там всё устаканится.

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

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

Да, и ещё, не всегда, когда семантика языка логически может допускать отсутствие того или иного ключевого символа/слова - его стоит полностью исключать / делать не обязательным. Тем более когда язык только находится на этапе разработки (лучше опустить его позже - когда будет ясно, что без него действительно выходит более красивый и понятный код, который будет проще набирать). А во многих таких случая - лучше делать автоподстановку в IDE пропущенных слов, однозначно подразумеваемых в семантической конструкции - так часто делает например Visual Studio).
Ну и с ";" будьте поаккуратнее - если синтаксис подразумевает опущение данного символа, то это не значит что его следует позволять ставить там, где его обычно совсем не ожидаешь (исходя из общей практики программирования).

Ну и ещё :-) Я бы всё-таки больше смотрел сейчас в строну того, как в императивные языки проникают веяния из функциональных языков (активно развиваемые ещё со времён Scala - где это одна из основных фишек всей семантики языка, а не отдельных вкраплений синтаксиса) - тут и тотальное применение лямбда-подобного синтаксиса, и упрощённое определение функций высшего порядка + продвинутая функциональная логика их комбинаций, и упрощённый матчинг (сопоставление с образцом), и ориентированность того, что практически каждый оператор - может быть выражением и т.п. Это мировая тенденция - скрещивать императивный и функциональный стили программирования - это она рождает очень красивые и мощные гибриды - и на это стоит сразу ориентироваться при проектировании нового языка!

Ну и про нулабельнымие классы - тоже не стоит забывать - лучше сразу заложить (как в Kotlin), что все переменные классов в простом синтаксисе не могут быть нулабельными (неопределябельными/пустоватыми) - что если переменная/поле допускает значение "неопределено" то это явно должно быть обозначено при её определении. Это уже общепризнаный правильный подход - но пока малораспространнёный именно из-за груза совместимости с прошлым. Не повторяйте эту ошибку. Ну и вводите сразу операторы - безопасного обращения к нулабельным объектам и быстрой проверки на нулабельность (в C# и в Kotlin тут всё крассиво придумано).


И ещё :-D Я Вам просто напомню - пожалуйста - уберите неявное определение переменных как в 1С - это очень плохая механика - чреватая неявными ошибками при разработке программ, её поддерживающих. Большинство языков сейчас этого не позволяют - и правильно делают! А в IDE всегда стоит выделать отдельно (цветом или ещё как) локальные переменные от, объявленных вне данного болока видимости локальных переменных

Ну и :-))))) откажитесь от полей - делайте только свойства - как это реализовано в Kotlin
66. Perfolenta 165 20.08.19 16:27 Сейчас в теме
(65) на данный момент у меня два основных требования:
1) Перфолента это расширение языка 1с, т.е. код написанный по правилам языка 1С должен работать с минимальными переделками...
2) Все, что есть в Net должно вызываться...

а дальше идут не требования, а просто вкусовые предпочтения:
3) я не люблю обилие значков и предпочитаю ключевые слова...
4) я не люблю полностью функциональные языки... мне нравится только функциональный подход в некоторых конструкциях... поэтому я скрещиваю императивный и функциональный стиль, но осторожно...
5) минимизация сложных для беглого чтения конструкций...

От полей я не откажусь, т.к. они есть в Net и особых проблем не вызывают... а вот защиту от неопределенности обязательно буду развивать...
В неявном объявлении переменных я тоже проблемы не вижу... они ведь получают при этом тип и дальше операции с ними проверяются на типобезопасность... это не то же самое, что переменные неопределенного типа...
67. Darklight 19 20.08.19 17:12 Сейчас в теме
(66)
код написанный по правилам языка 1С должен работать с минимальными переделками...

Учитывая, что 1С это язык с динамической типизацией, а Перфолента - статически типизированный язык - поддерживать это правило практически не возможно! Совместимость будет - но лишь отчасти!

Спорить с Вами не хочу - как уже написал "Вы тут единоличный автор - царь и бог" - и только от Вас зависит будущее языка "Перфолента"

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

По поводу Полей лишь опять отошлю к синтаксису Kotlin - в Java тоже есть Поля - но Kotlin (который полностью совместим с Java) обходится без них с целью упрощения своего синтаксиса, да и поля - нынче в ООП вообще уже не в моде - почти всегда в современных ООП языках в классах объявляют (и рекомендуют) Свойства с автогенерируемыми аксессорами. И Kotlin изящно избавился в своём синтаксисе от полей (хотя после компиляции они конечно же есть - но они скрыты - их генерирует компилятор). Да и синтаксис C# для объявдения Свойств, например, не далеко отошёл от объявления полей - сейчас может не так изящно, как в Kotlin, зато тоже способствует тенденции к снижению объявления в классах именно Полей.
И, соответственно, поля из библиотек .NET конечно же должны быть доступны. Но Вот в классах, спроектированных на "Перфоленте" я бы оставил лишь Свойства. Kotlin это не мешает - это прекрасно Java-совместимый язык!

Неявное объявление переменной, не важно статическая она или нет, это всегда проблема вложенности. Если у меня, скажем, в классе - объявлено Поле/Свойство с именем "Организация" (типа, скажем "Строка") и я, скажем, в методе это класса неявно введу якобы локальную переменную "Организация" (присваивая её строку) - то явно присвою значение Полю/Свойству класса, а не локальной переменной, действующей внутри только метода. А теперь представьте обратную ситуацию - у меня была локальная переменна "Организация", объявленная неявно в методе класса - а потом в классе (а может в его предке) появилось Поле/Свойство "Организация", то при перекомпиляции - код в методе вместо локальной переменной, начнёт менять это Поле/Свойство - причём будет это совршенно неожиданно - ведь этот код даже не менялся!

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

Так что, неявное объявление переменных - плохая практика. Не говоря уже о том, что тут просто трудно при анализе текста понимать - где объявление новой переменной, а где присвоение значения уже объявленной ранее переменно/поля/свойства!

Поэтому в подавляющем большинстве языков нет неявного объявления переменных! Тем более в статически типизипрованных!

Но если уже так хочется оставить неявное объявление переменных - сделайте опцию компиляции (выключенную по умолчанию) и директиву компиляции модуля (метода) для случаев требования высокой обратной совместимости с кодом 1С

Хотя я не вижу в этом (в обратной совместимости) никакого смысла - уж очень далеки платформы 1С и .NET друг от друга! Да и сам язык 1С уже очень сильно морально устарел - зачем тащить весь этот хлам в светлое будущее - мне не понятно!

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

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

ну а если к языку ещё и компиляторы в LLVM и в байткод 1С прикрутить (хотя бы ограничено) - то сфера применения языка расширится многократно - и тут как раз его могут предпочесть за красивые фишки, которых нет в других языках, даже в проектах, которые пишутся на других платформах!

Вы царь и бог - решать Вам!
Fox-trot; Perfolenta; +2 Ответить
68. Perfolenta 165 20.08.19 19:08 Сейчас в теме
(67)
Спорить с Вами не хочу

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

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

да, у меня есть директива компиляции #ТребоватьОбъявлениеПеременных, но по умолчанию она выключена... т.к. целевая группа (одинэсники) привычна к неявному объявлению... описанные вами проблемы бывают и у меня, но достаточно редко, что бы считать это слишком серьезной проблемой...
Еще есть директивы #ЗапретитьПозднееСвязывание и #ЗапретитьСужающиеАвтоКонвертацииТипов, но на данный момент их включить нельзя... это в целях отладки языка, т.к. автоконвертации типов и позднее связывание очень сложные штуки, я на них очень много времени убил... хочу, что бы при любых тестах ошибки всплывали... когда все отлажу, то позволю включать эти директивы...

Но я бы лучше смотрел в сторону привлечения программистов, кто уже программирует на платформах .NET и Java, JavaScript

а зачем это им? они уже серьезно потратились на изучение англоязычного программирования... и оправдывая это перед самим собой, начинают утверждать, что русский язык не пригоден для программирования... ни кто из гуру не хочет снова стать чайником...
тем более, что их языки более развиты и стабильны чем мой, который я в одиночестве еще даже не доделал...
моя цель это новички и те, кто сможет получить дополнительные плюшки от нового языка переиспользуя уже полученный опыт 1с... они тоже не слабо потратились на его изучение...
я вовсе не копирую VB, но и он тоже стал донором некоторых конструкций, как и C#, и Kotlin, и Python тоже стали, я стараюсь у всех самое лучшее взять, но с перестилистикой...
ну а если к языку ещё и компиляторы в LLVM и в байткод 1С прикрутить

это я просто не потяну... мне бы выполнить все планы по Net... а там еще работы и работы... а дальше много будет зависеть от того, найду ли я схему монетизации... если не найду и пойду в опенсорс, то развитие будет очень медленным...
69. Darklight 19 20.08.19 20:26 Сейчас в теме
(68)Про совместимость я написал выше - лучше определится - либо стараться максимально быть приближенным к классчиескому 1С, тащить к себе всю его ущербность, и ориентироваться только на его аудиторию. Либо создавать что-то более совершенное, и привлекать адептов сразу со всех сторон. Но, Вы. всё-таи выбрали вариант совместимости - что же это Ваше право. Просто я не на этой стороне, уж простите. Была бы возможность программировать для платформы 1С на языке, скажем C# или Java - я бы программировал на нём и забыл бы это бред синтаксиса 1С как страшный сон. Хотя лично я не долюбливаю ни тот ни другой язык. Даже в более, "любbмих" (вру) мною , Scala и Kotlin мне много чего не нравится, и я не считаю их идеальными и даже близко. Увы - идеального языка для меня не существует - и сейчас я вообще вынашиваю планы о разработке совершенно иного императивного языка - технически более более близкого например к Transact SQL (который, к слову, мне тоже не очень нравится семантически, мне более подуще семантика языка LINQ to SQL/Entity framework) чем, скажем, к Kotlin. Но это язык более высокго порядка абстрации, подразумевающий взаимодействие с кодом, написанном в более классическом стиле (с применением LLVM не важно на каком языке и в какой парадигме).

Говоря же о других (не 1С-ных) комьюнити, я в-первую очередь думал ещё не о закоренелых адептов "вражеских лагерей", а о тех, кто только делает первые шаги на поприще программирования. А сейчас yjdbxrb чаще всего изучают Java, JavaScript, C#, Python
Вот их, в первую очередь, и стоило бы "переманивать" (направлять в "своё" русло). Но "старым" "примитивным" языком с несовременной семантикой построения алгоритмов их не привлечь - их будут манить мощные и изящные фишки более активно развивающихся языков, ну и их востребованность (и как следствие - деньги и количество вакансий) будет их привлекать ещё больше!

Ну а сообщество 1С-адепотов - оно не долговечно - пройдёт ещё лет 30 и компания 1С уж наверняка анонсирует новую платформу - и поверьте, там не будет языка 1С в знакомом виде - это будет либо глубокая переработка (ещё больше, чем это было при переходе с 7.7 на 8.0), либо тотальная замена на другой язык (иначе он попросту останется "костяными счётами в мире суперкомпьютеров"). Таковы интересы компании - для которой сейчас западный рынок становится более привлекательным, чем русскоговорящий (тут они уже завоевали достаточно, и лишь будут стараться удерживать эти объёмы при дальнейшей эволюции). Возможно русский синтаксис сохранят, а может и нет.... не так уж много программистов кому он действительно нужен! А проблем с глобализацией разработок создаёт ого-го как много!

А по поводу монетизации - есди Вы выпустите бесплатный компилятор в .NET и платные в LLVM и в байткод 1С - то это могло бы быть оправдано. Ну компилятор в байткод 1С уж точно был бы востребован - т.к. многим программистам захотелось бы писать для платформы более продвинутый код - но так, чтобы он интегрировался с самой платформой, хотя бы на уровне простого взаимодействия: классический код, метаданные и библиотеки из конфигурации должен быть доступны в Перфоленте, а код перфоленты - должен быть доступен к вызову хотя бы на уровне процедур и функций общих модулей (хотя моудли объектов тоже можно было бы задействовать). Вот это была бы бомба! А если она ещё и на мобильной платформе работала....
70. Perfolenta 165 21.08.19 01:03 Сейчас в теме
(69)
и сейчас я вообще вынашиваю планы о разработке совершенно иного императивного языка

я желаю вам удачи, но могу сказать, что сам просто не представлял объем работы необходимый для создания современного языка... теперь представляю... а ваша задумка грандиознее моей, так что готовьтесь... :)
пройдёт ещё лет 30

30 лет это очень много, 30 лет назад еще ни C# ни JAVA не было, а сейчас уже кое кто их устаревшими называет, да и сколько редакций они пережили... я о таких горизонтах не могу думать, т.к. не знаю даже, удастся ли из под плинтуса выскочить...
Возможно русский синтаксис сохранят, а может и нет.... не так уж много программистов кому он действительно нужен!

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

у языка 1с фишек нет, а вакансии есть... это не прямая корреляция... реклама и маркетинг больше влияют на развитие и распространение языка, чем любые его фишки... вспомните классику "написано однажды - работает везде" и сколько бабла на раскрутку этого слогана было потрачено...
да и сколько раз за 30 лет я слышал о новых крутых парадигмах и языках, но если честно, то большинство кода в мире пишется на обычных циклах и условных операторах... мало чем отличающихся от старых... достаточно примеры в GitHabe посмотреть на том же Шарпе...
10. Steelvan 01.08.19 14:31 Сейчас в теме
(3) со вторым абзацем согласен

В прошлом году тоже "новый" язык оприлюдили.
РусскийФокс называли.

Что-то автор перестал его продвигать в массы после нескольких публикаций.
13. Perfolenta 165 01.08.19 15:27 Сейчас в теме
(10) я общаюсь с автором Русского Фокса, он изначально утверждал, что для себя его делает... и он продолжает его делать, выкладывает ролики в Ютубе...
на мой взгляд у него одна проблема, Майкрософт бросила Фокс, совсем...
А Net пока ни кто бросать не собирается, более того, планы его развития изложены на годы вперед... так что мне на этот счет легче, чем Андрею Ошнурову...

я вовсе не питаю иллюзий, что мне удастся пробить недоверие... но, судя по большинству комментариев тех, кто скачал и посмотрел мой язык, люди приняли Перфоленту хорошо...
и это радует... а дальше от меня будет зависеть, смогу ли я сдела так, что бы люди хотели и им нравилось программировать на Перфоленте... буду стараться...
11. Steelvan 01.08.19 15:11 Сейчас в теме
Надо быстрее делать решения, которые решают важные для дельцов задачи.
Это может дать деньги для жизни за счет проекта + будут примеры использования на настоящих деловых задачах.

Иначе сообщество может Вас забросать бесплатными работами на 10 лет вперед.
Вы выдохнетесь (жена запилит, просто надоест и т.п.) и бросите.

Пока это просто "смотрите что могу". Поделка.
До продукта нужна обертка в сайт с разделами:
*) Примеры применения;
*) Документация:
*) Ссылки на выполненные работы с выгодой по сравнению с 1С;
*) Форум техподдержки;

Может и прозвучит грубо, но мое мнение такое, что автор это сделал для самовыражения.
Если бы он хотел этим зарабатывать, то доделал и выкатил бы сразу полный комплект сопутствующей атрибутики (сайт, примеры, документация). И это было бы воспринято серьезно с самого начала.
Обнародование "как есть, разбирайтесь сами" признак того, что это побарахтается немного и повторит судьбу onescript (будет пущено на самотек с доработками сообщества и минимальным участием авторов как регуляторов).

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

Все вышенабранное является личным мнением автора и может отличаться от мнения редакции :)
14. Perfolenta 165 01.08.19 15:42 Сейчас в теме
(11) да, вы все верно написали... без какой-то схемы монетизации всё будет жить и двигаться плохо... на грани выживания...
но для того, что бы двинуться в бизнес нужен продукт, а его сначала сделать надо... вот и делаю...
изначально я тоже думал, что лучше выкатить уже готовый продукт... но после нескольких экспериментов над 1с-никами, которые согласились попробовать Перфоленту (до опубликования), я понял, что знакомить людей с новым языком можно заранее... это работает... люди попробовали и стали делать для себя маленькие, но полезные программки... конечно, с моей помощью, но начали и у них получается, всё работает...
язык и коммерческий продукт на его основе это все же разные вещи...
Что вы можете сделать из того, что не можете на 1С?
Много чего, например, скорость работы кода Перфоленты может в сотни раз превышать скорость работы 1С... можно сделать службу Windows, независимое от лицензий 1С приложение, собственно всё, что делают люди выбирая C# или VB вместо 1С...
17. vasvl123 92 02.08.19 06:57 Сейчас в теме
(11) На 1С чего не пытаешься сделать, только учетная система получается)
Perfolenta; +1 Ответить
19. Perfolenta 165 02.08.19 09:33 Сейчас в теме
12. Steelvan 01.08.19 15:17 Сейчас в теме
Деньги двигатель всего.

На этом можно зарабатывать ?
Если да, то отлично.
Если нет, то вы у своей семьи украли КолВоЧасов * 1000руб (+/-).
15. Perfolenta 165 01.08.19 15:46 Сейчас в теме
(12) я это хорошо понимаю, поэтому думаю о том, как продукт будет монетизироваться... но на данный момент продукт еще доделать надо... пока был только анонс, что не противоречит практике маркетинга...
а у семей, в капитализме, все самозанятые вынуждены время красть, к сожалению...
я не могу себе позволить уйти с работы в 17-00, как это делали мои родители в СССР, или уйти в отпуск на 30 дней, абсолютно не вспоминая о работе, как это делал мой отец...
43. for_sale 773 02.08.19 18:37 Сейчас в теме
(15)
Кем это они у вас так замечательно работали??

И при чём тут капитализм? Я сейчас при капитализме ушёл на вольный хлеб - не нарадуюсь. В том числе и потому, что не надо никуда ездить, и работать можно, когда хочешь.
44. Fox-trot 96 02.08.19 18:57 Сейчас в теме
(43)
И при чём тут капитализм?

при социализме самозанятых почти не было, кругом работали от звонка до звонка
такие дела
Perfolenta; +1 Ответить
45. Perfolenta 165 02.08.19 22:39 Сейчас в теме
(43) обычными рабочими на обычном заводе работали...
при капитализме отдельный человек не показатель уровня жизни... чем ближе вы к вершине пирамиды, тем толще ваш бутерброд... как известно, под чертой средней зарплаты на много больше людей, чем над ней...
я тоже почти всю жизнь работаю сам на себя и на свой уровень жизни не жалуюсь, но клиентов на месяц не бросишь... поэтому и в отпуск нормальный сходить не могу...
46. for_sale 773 03.08.19 09:22 Сейчас в теме
(45)
Ну так, получается, капитализм тут не при чём? Вы организовываете свою работу и свой уровень жизни. Вы также, как и при социализме, можете пойти на завод и вкалывать там до седьмого пота в грязи, шуме, гари, крике среди пьяных коллег, половина из которых - бывшие уголовники (нет, я не обобщаю, это флешбеки из моего собственного заводского опыта). Зато скорее всего в положенный день вы получите положенную сумму и сможете с радостью раз в году хоть на месяц съездить в Турцию, а может даже и в Крым. У меня родители тоже на заводе, половину жизни при социализме, половину при капитализме, поверьте, если вы действительно хотите социализм и работать на заводе, то сейчас на заводе ничего не изменилось))

Но ведь вы не захотели на завод? Вы воспользовались тем, что дал вам капитализм - выбором, и выбрали другой путь, в тепле, с кондиционером, с чашечкой горяченького и обалденным видом за окном (опять не обобщаю, а делюсь своим нынешним опытом) и возможностью ругать проклятый капитализм и со слезой счастья вспоминать родной социализм))
47. Perfolenta 165 03.08.19 13:11 Сейчас в теме
(46) такое впечатление, что вы про разницу между капитализмом и социализмом ничего не знаете...
я бы и работал на заводе, был бы инженером кораблестроителем, на которого учился... только от него остались рожки да ножки... огромная территория на которой можно сталкера снимать... как и от остальных заводов и фабрик в городе... мне просто пришлось стать самозанятым в 90-е, что бы с голоду не помереть...
капитализм ничего не дал, он забрал... может быть вы не помните центральные улицы города застеленные на километры покрывалами, на которых лежали пожитки граждан надеявшихся хоть что-то продать, а я прекрасно помню... в этом суть капитализма, ни кто ни кому не нужен...
Сейчас на заводе кое-что изменилось... наш завод, на полученную прибыль, построил целый микрорайон для своих рабочих, несколько пансионатов и пионерских лагерей на море для своих рабочих и их детей, он содержал несколько десятков технических и гуманитарных кружков и спортивных секций, где я мог заниматься бесплатно, выбирая то, что нравится... а сегодня, вся эта прибыль уходит хозяевам, которые имели ввиду и рабочих и их детей... именно поэтому народ у нас недавно собрал деньги и поставил памятник директору нашего завода, с говорящей фамилией Заботин... который, помимо всего остального, построил яхтклуб для нас, а не купил яхту себе, как делают нынешние...
Артано; +1 1 Ответить
48. for_sale 773 03.08.19 13:52 Сейчас в теме
(47)
Мда... Такое впечатление, что вы про разницу между капитализмом и развалившимся социализмом ничего не знаете. Это не капитализм - это разваленный, неспособный выжить социализм дал нам разруху и продаваемые пожитки. Я никак в толк не возьму - если он такой офигенный, этот социализм - почему же не то, что американцы какие-то, а даже вы в нём не живёте? Послушаешь - так всё офигенно было, да только развалился почему-то. А уже 100 лет гниющий капитализм шагает по планете.

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

Вы даже не понимаете, что вы сами можете быть директором завода и строить яхтклубы (или покупать яхты), что вы можете вообще не работать и жить припеваючи (или не припеваючи), что вы можете поехать в любую другую страну или в любой другой регион, можете строить заводы с нуля или придумывать языки программирования. Всё, что вам надо - это миска супа, работа с 9 до 18, нормированный отпуск раз в году и чтобы для вас кто-нибудь строил микрорайоны, яхтклубы и кружки, но только чтобы это был кто угодно, только не вы.
49. Perfolenta 165 03.08.19 15:54 Сейчас в теме
(48) гниющий капитализм никуда не шагает... он гниет, как и 100 лет назад...
он мог бы сделать нормальной жизнь людей в Африке, в латинской Америке, на ближнем востоке, много еще где, но он несет только смерть и разрушения ради собственной прибыли... они сами это прекрасно понимают... просто посмотрите их фильмы о будущем... оно мрачное...

Вы меня тут чуть ли не овцой обозвали и предложили миску супа... так вот, я открыл свою первую фирму в 1992-м, а сегодня у меня уже четвертая... я могу себе многое позволить, т.к. вполне достаточно зарабатываю на жизнь... и я прекрасно знаю, что такое эксплуатация людей, т.к. сам этим не мало занимался... но лет 10 назад я это прекратил, т.к. мне всегда это было противно... теперь моя фирма это семейное предприятие...
Но глядя на многих моих друзей и знакомых, я понимаю, что их жизнь могла бы быть совсем другой, если бы остался Союз... я видел их семьи тогда, и я вижу как у них сейчас...
Вы даже не понимаете, что вы сами можете быть директором завода и строить яхтклубы (или покупать яхты), что вы можете вообще не работать и жить припеваючи (или не припеваючи), что вы можете поехать в любую другую страну или в любой другой регион, можете строить заводы с нуля или придумывать языки программирования.

съесть, то он съест, но кто ему даст... ваши слова напоминают речевки о походе в Европу на нашем украинском майдане... чашечка кофе с утра в парижском кафе по безвизу... ага... этот безвиз доступен очень не многим... а остальным только в виде "съездить в Париж и умереть"... вы прекрасно знаете, что 1% американцев владеет 82% богатства и не собирается ни с кем делиться...
Артано; +1 1 Ответить
55. Fox-trot 96 04.08.19 07:57 Сейчас в теме
(48)
Вы даже не понимаете, что вы сами можете быть директором завода и строить яхтклубы (или покупать яхты), что вы можете вообще не работать и жить припеваючи

вот он предел мечтаний
ржунимагу
Perfolenta; +1 1 Ответить
56. for_sale 773 04.08.19 09:39 Сейчас в теме
(55)
Неисключено) А вы, наверное, хотите осудить чей-то предел мечтаний?)) Показать "правильный" предел?))
18. vasvl123 92 02.08.19 07:01 Сейчас в теме
(12) А если в рабочее время, то обокрали работодателя
20. Perfolenta 165 02.08.19 09:36 Сейчас в теме
(18) я, к счастью, сам себе работодатель... хотя, если разобраться, то клиенты это тоже начальники и работодатели... только они не имеют возможности тебя уволить, но могут уволиться сами..
21. Perfolenta 165 02.08.19 10:51 Сейчас в теме
Только что проверил интересный момент: оказывается, C# и VB.Net не умеют делать цикл Для Каждого (foreach) по нескольким перечислителям, а Перфолента умеет!!!
Например, в стандартной библиотеке Перфоленты есть тип Матрица, который можно обойти в цикле Для Каждого двумя способами: по значениям и по элементам матрицы.
Для Значение тип ДВещ Из МояМатрица //цикл по IEnumerable<ДВещ>
   //
КонецЦикла 
Для Элемент тип ЭлементМатрицы Из МояМатрица  //цикл по IEnumerable<ЭлементМатрицы>
   //
КонецЦикла 

C# и VB.Net могут только первый перечислитель обойти по значениям, а второй не могут....
вот такой вот курьёз :) кое в чем Перфолента круче, хотя пока, конечно, в ней еще многого нет, что есть в этих двух языках... только работаю над многими вещами...
24. minimajack 55 02.08.19 11:07 Сейчас в теме
(21) чесно говоря ничего не понял...хотя пытался)
26. Perfolenta 165 02.08.19 11:15 Сейчас в теме
(24) значит цикл Для Каждого вам не понятен... все просто, когда вы пишете Для Каждого система определяет по какому типу можно пройтись в указанной коллекции...
например, когда вы идете по объекту СписокЗначений, то вы на каждом шаге получаете тип ЭлементСпискаЗначений...
но в Перфоленте коллекция может давать возможность обходить ее по разным типам содержимого... представьте, что СписокЗначений можно было бы обойти сразу по значениям или по представлениям, а не только по элементам....
28. Darklight 19 02.08.19 11:22 Сейчас в теме
(26)Дайте, пожалуйста, более наглядный пример - заинтриговали
32. Perfolenta 165 02.08.19 11:34 Сейчас в теме
(28) вот на C#
using System;
using Промкод.Перфолента;

namespace Энумерабле2
{
    class Program
    {
        static void Main(string[] args)
        {
            Матрица matr=new Матрица(3,3);
            foreach (Double element in matr)
            {
                Console.WriteLine($"Element: {element}");
            }
            foreach (ЭлементМатрицы element2 in matr) //ОШИБКА!!!
            {
                Console.WriteLine($"Element: {element2}");
            }

            Console.ReadLine();

        }
    }
}
Показать

то же самое на Перфоленте работает...
35. Darklight 19 02.08.19 11:39 Сейчас в теме
(32)Что-то пример какой-то не удачный. Всё равно мне не понятно
36. Perfolenta 165 02.08.19 11:58 Сейчас в теме
(35) что именно не понятно? есть коллекция, например, СписокЗначений как в 1С, его можно обойти в цикле Для Каждого получая на каждой итерации объект типа ЭлементСпискаЗначений из которого можно получить Значение....
а было бы хорошо, если бы можно было сразу по значениям пройтись...
вот в данном примере это и продемонстрировано...
сначала проходим по значениям матрицы, которые имеют тип Double, а потом по элементам матрицы, которые имеют тип ЭлементМатрицы и содержат информацию о строке и колонке значения...
в Перфоленте я так могу, а в C# и VB нет...
37. minimajack 55 02.08.19 12:06 Сейчас в теме
(36) это никому не надо, если надо - есть методы коллекций values(), keys() и т.п.
38. Perfolenta 165 02.08.19 12:09 Сейчас в теме
(37) надо или не надо это спорный вопрос... а вот собственные спецификации они криво реализовали это факт... у меня же работает, а я по ихним же спецификациям делал...
41. minimajack 55 02.08.19 12:56 Сейчас в теме
(38)
В СписокЗначений лежат ЭлементСпискаЗначений в котором значение типа ЭлементСпискаЗначений...
Как выбрать Значение?
СписокЗначений = Новый СписокЗначений;
СписокЗначений.Добавить(1,"1");
СписокЗначений.Добавить(2,"2");

СписокЗначений2 = Новый СписокЗначений;

Для каждого ключЗнач Из СписокЗначений Цикл
	СписокЗначений2.Добавить(ключЗнач, ключЗнач.Представление);
КонецЦикла;

Для каждого ключЗнач Из СписокЗначений2 Цикл
	Сообщить(Строка(ТипЗнч(ключЗнач)) + " " + ТипЗнч(ключЗнач.Значение));
КонецЦикла;
Показать

Элемент списка значений Элемент списка значений
Элемент списка значений Элемент списка значений
42. Perfolenta 165 02.08.19 13:00 Сейчас в теме
(41) вы про 1С или про Перфоленту спрашиваете?
ответ в обоих случаях - никак...
я пока двойной перечислитель только в объекте Матрица сделал... а СписокЗначений и другие 1с-ные коллекции почти такие же как в 1С... но думаю, что сделаю и в них тоже такую возможность... а может и не буду...
30. Darklight 19 02.08.19 11:29 Сейчас в теме
У вас вот этот код
 Рег = Новый РегулярноеВыражение("(?<=Context=').*?(?=')")

Выполняется внутри процедуры "ОтборСтрок" которая вызывается циклически - это не очень хорошее решение - т.к. регулярне выражение каждый раз компилируется заново а это (в зависимости от выражения) может быть достаточно затратной операцией. Да ещё и объекты постоянно создаются заново - засоряя память и ускоряя процесс сборки мусора.
Я не знаю насколько потокобезопасен класс "РегулярноеВыражение" но лучше его вынести за рамки потока - либо сделать глобальную коллекцию предкомпилированных паттернов (используемую всеми потоками) - либо сделать для каждого параллельного алгоритима отдельный экземпляр(ы) (что сложнее в силу применения параллельного цикла, где очень сложно управлять асинхронностью).
В общем - тут неплохо бы показать оба подхода для людей, которым асинхронное программирование пока чуждо!
31. Perfolenta 165 02.08.19 11:32 Сейчас в теме
(30) вы прямо читаете мои мысли... я сначала вообще без регулярных выражений написал, а потом решил, что надо добавить пример с регулярным выражением... думал его вынести из процедуры, но потом решил, что так будет не наглядно... в производительности просадка копеечная, я проверял...
34. Darklight 19 02.08.19 11:38 Сейчас в теме
(31)Тут больше дело в показательноси хотя да, это палка о двух концах либо показывать как проще, либо показывать как нужно!
39. Perfolenta 165 02.08.19 12:31 Сейчас в теме
(34) наглядность и "синтаксический сахар" почти всегда побеждает соображения производительности, пока критически в них не упрется...
Оставьте свое сообщение