LINUX.ORG.RU

Метапрог-прототип, версия 7 + графические диалоги на Метапроге

 , ,


0

3

Скачать (перед запуском читайте !Русский.txt или !Українська.txt):

https://www71.zippyshare.com/v/dNcHIgzD/file.html

Новая версия принесла несколько новых фич интерфейса пользователя. Добавлено выделение прямоугольником для вырезания и копирования части диаграммы (в прошлой версии было только копирование и вставка одного блока по щелчку колесом мыши). После копирования куска диаграммы (с проводками с данными и жесткими последовательностями) его можно вставить кликом колесом мыши на пустом месте диаграммы. Есть план реализовать в будущий версиях также создание подфункций из выделенного куска - аналог Create SubVI из LabVIEW (так была сделана немалая часть функций в прототипе Метапрога).

Однако самая интересная фича новой версии - сериализация в base64 координат блока на диаграмме с цепочкой функций. Этому есть как минимум два возможных применения. Можно «ткнуть пальцем» на нужный блок (меню блоки - ткнуть пальцем на блок). Будет сгенерирована строка такого вида:

metaprog_debug:AAAAAAAAAAAAAAAHAAAAAFBUSDAAAAAEAAAAAAAAAAAAAAAAAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAU4fPk6Ov87ejqIO3gIOfg7+jy4PUAAAAK0+rw4L/t8fzq4AAAABXh8+To6/zt6Oog7eAg5+Dv8O7x4PUAAAAH0PPx8ero6VBUSDEAAAAxcmVsIAAr0LHRg9C00LjQu9GM0L3QuNC6INC90LAg0LfQsNC/0LjRgtCw0YUubXBiZBNiCtNfkRABAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAT9rPr7vfo8evu4ujpIOSz4Ovu4wAAAArT6vDgv+3x/OrgAAAAFPbl6+736PHr5e3t++kg5Ojg6+7jAAAAB9Dz8fHq6OlQVEgxAAAANXJlbCAAA25rYwAq0YbRltC70L7Rh9C40YHQu9C+0LLQuNC5INC00ZbQsNC70L7Qsy5tcGJkP/rfBI32qgEAAAADAAAAB01QTCAyLjAAAAAHTElDRU5TRQAAABDy5erx8u7i6Okg5LPg6+7jAAAACtPq8OC/7fH86uAAAAAQ8uXq8fLu4vvpIOTo4Ovu4wAAAAfQ8/Hx6ujpUFRIMQAAAC9yZWwgAANua2MAJNGC0LXQutGB0YLQvtCy0LjQuSDQtNGW0LDQu9C+0LMubXBiZFbEp7cIT2gBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAV5+Dv8/HqIOKz6u3gIE51a2xlYXIrAAAACtPq8OC/7fH86uAAAAAU5+Dv8/HqIO7q7eAgTnVrbGVhcisAAAAH0PPx8ero6VBUSDAAAAAWAAEAAgNua2MNbmtjIGluaXQubXBiZFQc/+kgVZgBAAAAAwAAAAdNUEwgMi4wAAAAB0xJQ0VOU0UAAAAO+PDo9PIg7fPq6+Xg8CsAAAAK0+rw4L/t8fzq4AAAAA748Oj08iDt8+rr5eDwKwAAAAfQ8/Hx6ujpUFRIMQAAADpyZWwgAANua2MAL9GW0L3RltGG0ZbQsNC70ZbQt9Cw0YbRltGPINC90YPQutC70LXQsNGAKy5tcGJkaxMcpv873AEAAAAAUFRIMAAAAAQAAAAAdcftGC2ZsAE=:metaprog_debug

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

Вместо тысячи слов:

https://i.postimg.cc/gd7RZD9Q/image.png

Там будет явно показан конечный блок, на который «ткнули пальцем», либо подфункция, по которой до него следует добираться.

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

https://postimg.cc/hQVLBcHp

Дебаг-строку выводит оранжевый блок.

В новой версии прототипа Метапрога было исправлено множество багов. Теперь метапроговские массивы и СУВТ можно помещать под указатели и вставлять в структуры, не боясь багов. Это позволило добавить к будильнику, реализованному в прошлой версии, диалоги, запрашивающие час и минуту срабатывания будильника.

Для компиляции надо скачать https://sourceforge.net/projects/tinyfiledialogs/

Распаковать в папке с Си-файлом так, чтобы работал соответствующий инклюд.

Код:

https://pastebin.com/5NW30tQx

Введя нужное число, закрываете окошко. После ввода часа и минуты в консоль будет выведено время срабатывания. Теперь будильником можно пользоваться и для повседневных нужд (звук пронзительный, хорошо слышный, sound.wav больше не нужен), однако завершать его работу надо еще через диспетчер задач или Ctrl+C в консоли, когда не идет звук. Также нет проверки введенных чисел, если введете не то число - будильник никогда не сработает.

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

Предыдущая версия:

Метапрог-прототип, версия 6 + будильник на Метапроге



Последнее исправление: metaprog (всего исправлений: 2)
Ответ на: комментарий от AntonI

Все типы известны на момент генерации кода по диаграмме, берите и пишите те типы которые нужно.

И так пишутся те типы которые нужны.

Коллекция разнородных объектов с типами определяемыми в рантайм это очевидно для Вас слишком сложно и не требуется

Ваше мнение очень важно для нас, пожалуйста, оставайтесь в треде.

а когда такое требуется то это делается по другому

Спасибо за ценный совет, именно так и поступим.

stasolog
()
Ответ на: комментарий от fsb4000

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

Я вижу какой говнокод получается у проФФесиональных программистов, особенно в последние годы. Даже опенсорс катится по наклонной. Даже Thunar из последнего дебиановского XFCE падает, да и в целом в гткшных приложениях багов полно - и это вроде еще и самое стабильное из мейнстримных DE, так и думаю рано или поздно запилить свое на Метапроге. Об индусах, оккупировавших M$ и скативших винду в полное зондов говно, я вообще молчу - Биллу Гейтсу должно быть стыдно за продолжателей его дела.

То же GUI: можно ничего не знать и рисовать в Builder, а можно знать MVC паттерн, или MVP, или MVVM, или MVU.

Это какой ЯП и какая среда?

Программа нарисованная в Builder и программа котороя корректно реализует паттерн Model View Update просто несравнимы по надёжности и эллегантности. Model View Update можно легко юнит тестить, это просто божественно, узнать методику которая позволяет тебе делать GUI приложение к которому можно писать юнит тесты. Которая позволяет сохранять состояние и легко сделать кнопку которая по желанию пользователя отправит например последние 100 состояний разработчику. Так что если пользователь найдёт баг, больше никаких мучений с воспроизведением бага, это автоматически. Я просто хочу чтобы ты сделал какое-то реальное приложение и почувствовал всю боль, которая приходит при поддержке пользователей и изменение требований к приложению.... Паттерны лишь уменьшают боль, которая у тебя будет при разрабатывании большого приложения, дебаггинга, или написания тестов.

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

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

С приходом визуального программирования все слишком круто поменяется в сравнении с текстовыми ЯП.

metaprog
() автор топика
Ответ на: комментарий от provaton

Ну надо посмотреть, согласен мои догадки особо не имеют под собой почвы. Вижу что это какое-то хаскелеподобное нечто с ghc и gmp наперевес. С хаскелеподобным синтаксисом.

abcq ★★
()
Ответ на: комментарий от metaprog

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

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Так устроена любая современная высокотехнологичная отрасль. Любой высококлассный специалист занимающийся чем то более сложным чем подметание улиц непрерывно учится и переучивается

Есть отличная цитата, из удаленных в Почему ООП стало более популярным и соответствующие языки и технологии программирования чем то же ФП? - так arturianec100 отвечал царю:

Вот что ты со мной сделал??? Теперь когда я вижу пропаганду очередной скриптухи, вместо «вау», у меня «бл@, выкатили ещё один недоязычок! Несколько лет назад все жужжали, что надо учить скриптуху Х, а теперь хайпят скриптуху Y. Все знания по Х оказались мусором и выкидываются на помойку. „Индусы“ повторяют, что это норма для it, но эта пропаганда не работает, когда понимаешь фундаментальность сишки. Вся та сишная база и паттерны на её основе актуальны уже более 40 лет (да, появился gnuc, который стал „современным Си“, но это развитие тех старых концепций).» Однако мерзко осознавать каким мусором является большое количество it-шных вакансий.

Те, кто знают Си, уже больше 40 лет могут не переучиваться. А Метапрог использует в своей основе те же «вечные» сишные концепты: структура, юнион, указатель, енум и куча числовых типов разных видов и разрядностей. Все, база готова! И она будет гарантированно актуальной еще многие десятилетия, если не больше.

Разумется, появляются новые библиотеки и платформы, но в визуальном представлении осваивать из куда проще, чем в текстовом. В Лабвью мне новые библиотеки даются очень легко, без гугла и почти без мануалов.

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от abcq

Это тот опыт который накоплен программистами за более чем пол века активного программирования

В тексте. Он плохо годится для визуалки.

тот опыт который позволяет писать сложное ПО командой разработчиков и не захлебнуться в собственном коде

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

С приходом визуального программирования все слишком круто поменяется в сравнении с текстовыми ЯП.

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

AntonI ★★★★★
()
Ответ на: комментарий от abcq

Но да, для начала бы вообще определиться ТС что он делает, «язык» ли это, если да, то где грамматика языка?

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

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

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

Сказка про белого бычка. В том виде до которого Метапрогу никогда не подняться - и упс, не взлетело.

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

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

AntonI ★★★★★
()
Ответ на: комментарий от metaprog

Опыт есть опыт, он годится для всего, способ ввода это и представление никак не влияют на этот опыт. Вы заблуждаетесь.

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

Опять «межпланетный шахматный турнир» :)

abcq ★★
()
Ответ на: комментарий от abcq

Ему про это говорили раз 50 человек 7 как минимум, я не шучу. Ничего не поменялось…

AntonI ★★★★★
()
Ответ на: комментарий от abcq

сейчас оно генерируется в условную глобальную мусорную лапшу с кучей лишних бессмысленных переменных и семантически бессмысленных выражениях подобно пустой ветке else например

Пустой else оптимизируется компилятором, лишние переменные тоже - зачем мне усложнять транслятор?

metaprog
() автор топика
Ответ на: комментарий от metaprog

зачем мне усложнять транслятор

Не просто транслятор, а транслятор прототипа, его же все равно потом переделывать. Так то для читаемости, оно понятно.

stasolog
()
Ответ на: комментарий от AntonI

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

Да не вопрос. Вопрос лишь в простоте освоения. Вот в Лабвью это дается легко из-за оформления библиотек (в том числе для работы с железом) в удобные меню. А в ардуинах, которые программируются на плюсах, без курения Reference и мануалов нихрена не сделаешь. И это довольно-таки простые примеры.

metaprog
() автор топика
Ответ на: комментарий от AntonI

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

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

Задокументируйте все свои мысли, станет куда проще.

abcq ★★
()
Ответ на: комментарий от abcq

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

Я уже отвечал на этот вопрос, этот код не применим для встраивания в С проект без полной переработки, ни один С программист или вообще программист такой код у вас не примет. Кажется это отличный критерий его полезности.

abcq ★★
()
Ответ на: комментарий от Nereus

Водянистая обзорная мудня из под коня это, как и все его книги

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

metaprog
() автор топика
Ответ на: комментарий от JustAnotherUser

Уже ответили. В Метапроге wasm сейчас можно пользовать, например, через Си+Nuklear+SDL2+Emscripten. Позже, уже после выхода из прототипа, возможно, прикрутим LLVM (поддерживает wasm) или даже непосредственно wasm.

metaprog
() автор топика
Ответ на: комментарий от metaprog

Вопрос лишь в простоте освоения.

Сложные вещи не будут простыми в освоении. То что Вы освоили в программировании это примитив, да и его то Вы толком не асилили.

«5х5=25, 6х6=36 значит 7х7=47 и не лезьте ко мне со своей таблицей умножения!» - это как раз Ваш с Дианой и @fsb4000 случай.

AntonI ★★★★★
()
Ответ на: комментарий от provaton

ну есть образчики кто на нем пишет вполне себе около энтерпрайзный бэкенд для веба. Но да тут еще популяризировать и популяризировать :)

abcq ★★
()
Ответ на: комментарий от AntonI

То что Вы освоили в программировании это примитив, да и его то Вы толком не асилили.

Гуй-приложение, сеть, сервер, трансляцию в Си и импорт инклюдов на этом «примитиве» сделать можно. А тебе слабо? Ты ж у нас супер-кодер, спецкурс преподаешь. Или все же не программист? Либо крест сними, либо трусы надень.

metaprog
() автор топика
Ответ на: комментарий от metaprog

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

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от AntonI

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

abcq ★★
()
Ответ на: комментарий от abcq

давайте обсуждать конкретную реализацию и технические детали

Чего именно? Будильника или квадратного уравнения решаемого методом ньютона?;-)

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

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Метапрогра же :) Рано или поздно найдется тот кто приведет его хотя бы к С (¬‿¬)

abcq ★★
()
Ответ на: комментарий от AntonI

Все типы известны на момент генерации кода по диаграмме, берите и пишите те типы которые нужно.

И так пишутся те типы которые нужны.

Коллекция разнородных объектов с типами определяемыми в рантайм это очевидно для Вас слишком сложно и не требуется

Ваше мнение очень важно для нас, пожалуйста, оставайтесь в треде.

а когда такое требуется то это делается по другому

Спасибо за ценный совет, именно так и поступим.

metaprog
() автор топика
Ответ на: комментарий от metaprog

И так пишутся те типы которые нужны.

До-до, в виде СУВТ.

AntonI ★★★★★
()

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

А код я проскролил, спасибо за разбор.

stasolog
()
Ответ на: комментарий от AntonI

Я его когда-то просил подобное запилить, сказал, что через СУВТ попробует сделать. Посмотрим.

Unicode4all ★★★★★
()
Ответ на: комментарий от hobbit

То, что ты называешь «абстракциями ради абстракций» — это фундаментальные концепции, позволяющие бороться со сложностью больших проектов

Создавая новые сложности. Кстати, самый большой проект в программировании (говорят, что и всего человечества) - это ядро линукса. И оно на чистом Си, заходы по поводу внедрить даже С++ (не говоря уже про питон или джаваскрипт) Линус решительно отвергает. Кстати, именно этот пример привел меня к тому, что транслировать Метапрог-диаграммы надо именно в Си и брать именно сишную систему типов за основу (к тому же, она очень похожа на то, что я использую в Лабвью).

повышать надёжность кода.

Как раз наоборот можно проследить, что чем более высокоуровневую скриптуху выкатывают - тем меньше той самой надежности. Винду ХР делали во времена, когда дотнетов и сишарпов не существовало, максимум на плюсах - и получилась лучшая винда, успешно работающая на 512 мб ОЗУ даже без свопа (правда современные браузеры толстоватые стали). А десятка - это говно на палочке, написанное и переписываемое уже на электроне и прочих новомодных фреймворках. Где тут надежность?

Вот например, как ты собираешься без ООП писать драйвера устройств, к примеру? Драйвер в любой современной ОС — это по сути дела класс, который предоставляет методы открытия, закрытия, позиционирования, чтения, записи… И есть внутренние структуры, в которых за пределами драйвера никто лазить не должен, вот тебе и инкапсуляция. И неважно, на каком языке это написано. Хоть на ассемблере. По сути это ООП.

Пускай это будет хоть ООП, хоть ФП, хоть черт лысый, если я при этом не буду вынужден трахаться с классами, приватными полями, геттерами-сеттерами и читать тонны макулатуры по абстракциям ради абстракций.

metaprog
() автор топика
Ответ на: комментарий от hobbit

Легко. Видел мой пример на godbolt? Представь что println это метод, а все типы внутри СУВТ это объекты. Конечно код генерироваться будет по другому, но думаю должно быть ясно.

stasolog
()
Ответ на: комментарий от metaprog

И оно на чистом Си

Да хоть на ассемблере. Речь не про языки. Ты сам начал ругать именно ООП как концепцию — так вот, в ядре линукса оно есть.

если я при этом не буду вынужден трахаться с классами

Кстати, в языке без классов с ООП трахаться приходится гораздо больше. В Си можно реализовать даже виртуальные методы — но все указатели на функции тебе придётся заполнить вручную.

приватными полями, геттерами-сеттерами

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

и читать тонны макулатуры по абстракциям ради абстракций

Ещё раз. Ты не понял, что это (судя хотя бы по тому, что с разговора про ООП ты тут же сбиваешься на языки реализации), ты не понял, зачем это. Но ярлык повесить как здрасте.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Кстати, в языке без классов с ООП трахаться приходится гораздо больше.

Это больше из за текстовой природы языков.

stasolog
()
Ответ на: комментарий от stasolog

а все типы внутри СУВТ это объекты.

Другими словами, если мы говорим про драйвер, то ВСЕ драйверы должны быть в одной диаграмме?

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Желательно, но драйвера всегда могут зарегистрировать себя в таблице переходов. Такой функционал еще не реализован правда, но почему бы и нет %)

stasolog
()
Последнее исправление: stasolog (всего исправлений: 1)
Ответ на: комментарий от metaprog

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

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

И оно на чистом Си

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

abcq ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.