mavka-ukr / mavka Goto Github PK
View Code? Open in Web Editor NEWСучасна українська мова програмування
Home Page: https://мавка.укр
License: Other
Сучасна українська мова програмування
Home Page: https://мавка.укр
License: Other
Наразі до структури можна прив'язати тільки дії, дія назва_структури.назва_дії(аргументи)
.
Спроба це зробити з функціями, назва_структури.назва_функції = (аргументи): функція
, викликає Не вдалося зловити: Неможливо викликати пустоту
.
Використаний код: https://pastebin.com/aZ3BavLC.
;; ініціалізаця перших двух елементів
t1 = 0
t2 = 1
;; ініціалізаця наступного елкмента (третього)
наступний = t1 + t2
;; Запит на кількість елементів у корисувача
кількість = читати("Введіть кількість елементів: ")
;; Напечатати перші два елемента t1 та t2
друк("Послідовність Фібоначчі: %(t1), %(t2), ")
;; надрукувати від 3-го до кількість-ого елемента
перебрати діапазон(3, +кількість + 1) як i
друк("%(наступний), ")
t1 := t2
t2 := наступний
наступний := t1 + t2
кінець
Дає результат
Послідовність Фібоначчі: 0, 1,
1,
1,
1,
що вказує на те що змінні t1,t2,наступний не змінюються. Мабуть потрібна або помилка, або попередження щодо цього, бо легко помилитися.
Шістнадцяткове число у вигляді 0шАБВГҐД
виглядає дивно. Не думаю, що це сильна проблема, але можливо є інші способи репрезентувати такі числа.
Пропоную це тут обговорити.
Так як мова наразі використовує JS як основу, логічно очікувати, що в ній мають бути значення з JS.
В JS є такі поняття як NaN
та Infinity
. Перше означає, що значення не число (хоча тип числовий), друге нескінченність (теж числовий тип).
Треба придумати для них назву. Точніше вирішити, бо дуже не придумаєш.
NaN
-> НеЧ
Infinity
-> Нескінченність
Вище те, що я використав, коли робив їх підтримку в Мавці. Якщо з НеЧ
ще можна жити, то Нескінченність
виглядає надто довгою...
Я думав змінити на Безмежність
, але поки не впевнений, бо це слово може мати інші значення в математичному контексті. Треба зробити якесь дослідження щодо цього. Бо Безмежність
виглядає, пишеться і читається швидко і добре. Можливо це читатиме якийсь професор або науковець з математики, то прохання дати свою оцінку. Наразі лишаю Нескінченність
.
Інші пропозиції до обох слів вітаються.
;; ініціалізаця перших двух елементів
t1 = 0
t2 = 1
;; ініціалізаця наступного елкмента (третього)
наступний = t1 + t2
;; Запит на кількість елементів у корисувача
;; кількість = читати("Введіть кількість елементів: ")
кількість = 5
;; Напечатати перші два елемента t1 та t2
друк("Послідовність Фібоначчі: %(t1), %(t2), ")
;; надрукувати від 3-го до кількість-ого елемента
перебрати діапазон(3, +кількість + 1) як і ;; тут кіриліцею
друк("%(наступний), ")
t1 := t2
t2 := наступний
наступний := t1 + t2
кінець
дає помилку компілювання Не вдалось зловити: Синтаксична помилка на 15:41
кількість = читати("Введіть число: ")
наступний = кількість + 1
друк("Наступне число: %(наступний)")
видає
Введіть число: 4
Наступне число: 41
Бажано мати конструкцію яка дозволяе сконвертувати строку у число. Я можу написати так
кількість = читати("Введіть число: ")
наступний = +кількість + 1
друк("Наступне число: %(наступний)")
але це занадто як на мене
Наразі в файлах мови вже є згадки про пропустити
і зупинити
, але вони ніде не використовуються, що може призводити до деяких помилок:
В документації вони, наскільки я знаю, не згадуються, тому це невелика проблема, але все одно, якщо в найближчий час їх не планується додати, то пропоную їх прибрати, або додати зрозуміле повідомлення помилок, напр.:
Краще розібратися зараз, потім і забути можна)
Чи існують в мавці побітові операції? Якщо так, то як саме вони реалізовані? А якщо ні, то варто обговорити це питання
Хотілось би мати хоча б елементарні припущення (assertions).
Я створив приклад імплементації натхненний jest
.
Ця задача є чернеткою пропозицій і закликом до обговорення. На її основі можна буде створбвати окремі задачі по кожній ухваленій пропозиції.
ч = Список(1,2,3)
перебрати ч як х
друк(х)
кінець
другийЕлемент = чекати ч.отримати(1)
друк(другийЕлемент)
ч.розмір
або
ч.розмір()
ч.встановити(1, 2)
Або можна реалізувати array access operator .()
, який би працював на читання і запис.
Його ж можна використовувати зі структурами для динамічного доступу до полів.
# Встановити
ч.(1) = 2
# Отримати
ч.(1)
ч.відрізок(1,3)
або
;; елементи 1,2,3,4
ч.(1..5)
;; елементи 0,1,2,3,4
ч.(..5)
;; елементи 3,4,...
ч.(3..)
;; копія
ч.(..)
Або так:
а = Список(1,2,3)
б = Список(100,200,300)
в = а.причепити(б)
друк(в) ;;1,2,3,100,200,300
Або так:
а = Список(1,2,3)
б = Список(100,200,300)
в = а + б
друк(в) ;;1,2,3,100,200,300
Асоціативний словник (мапа, хеш).
х = Словник()
х.встановити("оце", "яблуко")
х.встановити("ото", "вишня")
друк(х.має("оце")) ;; так
друк(х.має("абощо")) ;; ні
друк(х.отримати("оце")) ;; "яблуко"
друк(х.ключи()) ;; Список("оце", "ото")
друк(х.отримати("кря")) ;; пусто
друк(х.розмір()) ;; 2
х.видалити("ото")
перебрати х як ключ, значення
друк(ключ, значення)
кінець
Альтернатива методам отримати/встановити, використовується гіпотетичний оператор індексного доступу .()
:
х = Словник()
х.("оце") = "яблуко"
друк(х.("оце"))
Опис параметризованого типу словника, використовуючи гіпотетичний оператор узагальнення !(Т0,Т1,...)
:
с Словник!(текст, число) = Словник()
Для хорошої типизації варто мати Generics. Українською це хтось переклав як "Узагальнення". Впринципі, непоганий варіант для слова, хоча, можливо, є ще варіанти. Але слово не проблема.
Поки не впевнений, що можна придумати щось дуже краще з того що вже є, тому:
Приклад узагальнення списку:
числа список<число> = [1, 2, 3]
словника:
слова словник<текст, текст> = (
"лайк"="вподобайка",
"баг"="вада"
)
структури:
структура Тварина<Г, Ш, Т, К>
голова Г
шия Ш
тулуб Т
кінцівки К
кінець
т = Тварина<МудраГолова, СильнаШия, НепробивнийТулуб, ГнучкіКінцівки>(...)
to be continued
Як ви ставитеся до впровадження в Мавку модулів, які імпортуються під час інтерпретації файлу, без потреби попереднього імпорту в файлі, який запускається?
Це вже було реалізовано @dkostmii, але було б непогано додати runtime модулі в основний репозиторій Мавки.
Наразі Мавка не перевіряє типи. Це зроблено, щоб програми виконувались швидше.
Тим не менше, під час розробки функція перевірки типів може дуже добре допомогти.
Пропозиція додати прапорець до команди виконання мавки і назвати його "--увімкнути-перевірку-типів". Коли цей прапорець присутній, код буде виконуватись з перевіркою типів.
тест.м:
а число = "сонце сяє, вітер віє"
команда:
мавка --увімкнути-перевірку-типів тест.м
приклад результату:
Не вдалось зловити: Неможливо присвоїти значення "сонце сяє, вітер віє" (текст) змінній "а" (число) через несумісність типів.
взяти файл "Object-keys.js" як keysObject
js keysObject
список = ("var1"=1, "var2"=2, "var4"=4, "var5"=5, "var6"="лох", "var7"=7, "var8"=8)
структура Колекція
кінець
дія Колекція.ключі()
вернути ключі(список)
кінець
колекція = Колекція()
результат = колекція.ключі()
друк(результат)
const mavka = getMavka();
const context = getContext();
const keysObject = mavka.makeProxyFunction(([object]) => {
const res = Object.keys(object);
return res;
});
context.set("ключі", keysObject);
return arg.asText(context).asJsValue(context);
^
TypeError: arg.asText is not a function
Взявши приклад із головної сторінки
ім'я = читати("введіть ваше ім'я: ")
друк("привіт, %(ім'я)")
можу вводити лише латиницю.
Виглядає що це через це - heapwolf/prompt-sync#43
структура Ракета
назва текст
швидкість число
вага число
кінець
дія Ракета.запустити()
друк("Ракету %(я.назва) запущено!")
кінець
нептун = Ракета(назва="Нептун",
швидкість=900,
вага=870)
нептун.запустити()
Цей код приведено як приклад на офіційному сайті https://мавка.укр, але він не працює ані у гральному майданчику, ані на реальній машині. Усе, що він видає, це:
Ракету пусто запущено!
У коді ім'я ракети явно вказано до виконання функції запустити()
, але значення поля чомусь невидиме. Чи воно не вказується взагалі, чи функція не в змозі дістатися поля, але ось так.
Неможливо взяти модуль з підпапки. Шлях до модулю: тека/привіт.м
.
0.104.0
старт.м
:
взяти тека.привіт [привіт]
привіт()
тека/привіт.м
:
дія привіт()
друк("Привіт від Лесі!")
кінець
дати привіт
Не підтримується взяття з репозиторію.
Ось приклад коли можна запустити будь-який код із мережі.
підключити_розширення_з_мережі ("https://gist.githubusercontent.com/kant2002/c13111c484539706dd710630c0bc74d1/raw/81a2bbc5ea285cd28cb0c6692e1782c2f858691e/%25D0%25BF%25D1%2580%25D0%25B8%25D0%25BA%25D0%25BB%25D0%25B0%25D0%25B4.%25D0%25BC")
Для сучасної мови бажано обмежити можливості запуску будь-якого коду із інтернету, або хоча би обмежити список ресурсів звідки можна завантажувати код.
Потрібні дії-генератори. Але перед цим треба описати ітератори.
Макет ітератора:
макет Ітератор
;; переводить ітератор на початкову позицію
почати() ніщо
;; поточне значення
значення() щось
;; поточний ключ
ключ() щось
;; переводить ітератор на наступне значення
далі() ніщо
;; перевіряє чи ітератор має наступне значення
перевірити() логічне
кінець
Дія-генератор:
дія генеретор_випадкових_чисел(кількість число) Ітератор
перебрати діапазон(0, кількість)
пустити Рандом.число()
кінець
кінець
перебрати генеретор_випадкових_чисел(10) як випадкове_число
друк(випадкове_число)
кінець
пустити
є ключовим словом-аналогомyield
, щось скорочене від "випустити"
Як ви ставитесь до того, щоб додати вбудований модуль Мавки для керування файловою системою?
Присвоєння значення за замовчуванням, а саме обʼєкта іншої структури, властивості структури спричиняє помилку.
0.104.0
структура Двигун
кінець
структура Автомобіль
двигун Двигун = Двигун()
кінець
/проект/старт.м:5:24: неочікуваний токен '(' очікується NL
Розробка проекту відбувається тут: https://diia.dev/mavka/mavka
Прохання всі issues та PR публікувати туда.
Проблеми як такої немає, але було би класно мати конструкції для абстрагування структур через щось схоже на інтерфейси в ООП.
Чернетка:
макет Двигун
запустити()
зупинити()
кінець
структура ІоннийДвигун є Двигун
;; властивості двигуна
кінець
дія ІоннийДвигун.запустити()
;; ...
кінець
дія ІоннийДвигун.зупинити()
;; ...
кінець
Обговорити тут.
Привіт 🙂
Чи проводили порівняння швидкості виконання коду з іншими мовами, наприклад, з Python, Java, Ruby? Якщо так, то чи можна переглянути результати? Якщо ні, то цікаво було б порівняти швидкість виконання, наприклад, алгоритму хешування sha256.
Через кірилицю в імені команди "мавка" та "пак", коли пакет mavka встановлюється через yarn, відповідні сімлінки не створюються.
Наприклад, ось так працює:
npm init -y
npm install mavka
echo 'друк("привіт")' > тест.м
npx мавка тест.м
А ось так не працює, хоча має працювати:
yarn init -y
yarn add mavka
echo 'друк("привіт")' > тест.м
yarn мавка тест.м
error Command "мавка" not found.
Пропоную додати такоє аліаси команд латиною.
"bin": {
"мавка": "src/bin/mavka.js",
"mavka": "src/bin/mavka.js",
"пак": "src/bin/pak.js",
"pak": "src/bin/pak.js"
},
код
список = ["a", "b", "c", "d"]
список.обернути()
Помилка
> npm start .\тест.м
> [email protected] start
> node src/bin/mavka.js .\тест.м
Не вдалось зловити: Неможливо викликати пустоту.
Проблема
Варто мати таку зручну конструкцію, як pattern matching. Бо при його використанні можна швидко отримати потрібні поля структури як окремі змінні та відсіяти непотрібні.
Пропоную наступний синтаксис:
структура Людина
ім'я текст
вік число
кінець
дія отримати_студента(ім'я текст) Людина
Людина(ім'я="Тарас", вік=21)
кінець
Людина(вік, ...) = отримати_студента("Тарас")
друк(вік)
Також зручною буде конструкція match
. Варто подумати над перекладом ключового слова.
л = Людина(ім'я="Тарас", вік=21)
порівняти л
Людина(ім'я, вік=13) тоді друк("неповнолітній %(ім'я)"),
Людина(вік, ім'я) якщо вік не менше 18 тоді друк("Повнолітній %(ім'я)"),
хтось_ще тоді друк("Інший варіант"),
_ тоді впасти "недосяжне"
кінець
Відображення версії у консолі та, при можливості, нової версії Мавки, якщо така доступна у репозиторії пакетного менеджера NPM.
Це дасть змогу відразу зрозуміти, чому та чи інша функція недоступна.
Рішення може бути тимчасовим, аби уникнути виведення версії Мавки у випадку, якщо стандартний вхід перенаправлено до файлу.
Як ідеальний варіант, можливе резервування нових символів (структур, їхніх методів, глобальних функцій і т.д.) з позначенням версії, починаючи з якої символ буде реалізовано, для найкращого досвіду розробника.
Вищевказане може стати постійною практикою у циклі розробки Мавки.
Misha13.11
Для обробки помилок використовувати, в основному, значення замість кидання винятків. Кидання винятків не прибирати, бо для швидкого написання коду, або для ситуацій, з яких не відновитися, вони корисні.
Класичне кидання помилок не є надійним, оскільки це є вириванням з потоку керування. Не відомо коли, хто, і чи взагалі відреазує на виняток. Ловити винятки синтаксично не обов'язково, а якби було обов'язково, то код би або виглядав загромаджено і гірше читався, або була би одна точка реагування на помилки, з якої не зрозуміло, без заглиблення у код, джерело самої помилки.
Наразі, обговорений у телеграм чаті варіант виглядає наступним чином:
дія додати_з_умовою(а, б)
якщо а більше 999
вернути Помилка("а має бути не більше 999")
кінець
Ок([а + б, а + а, б + б])
кінець
[аб, аа, бб] = додати_з_умовою(1000, 2) ;; кидає помилку
[аб, аа, бб], помилка = додати_з_умовою(1000, 2) ;; не кидає помилку
Тобто тут суть, що з дії може вернутись Ок
, або Помилка
(як всюди).
Коли дія викликається, то з неї вертається або Ок
, або Помилка
.
За замовчуванням вертається розгорнутий Ок
, але є можливість обробити помилку записавши її в змінну через другий арумент оператора присвоєння.
ок, помилка = додати_з_умовою(...)
;; якщо вернулось Ок, то в "ок" буде результат обчислення
;; якщо вернулось Помилка, то в "ок" буде пусто, а в "помилка" буде Помилка
ок = додати_з_умовою(...)
;; тут те саме, тільки якщо вернулось Помилка, то ця помилка буде викинута через "впасти", так як користувач ніяк не обробив
В мову згодом треба буде додати enum-и. Потрібно придумати для них синтаксис.
Обговорити тут.
Файл программа.м
, запускається правильно
Файл программа.тест.м
з тим же кодом, помилка
Буде користно для файлів по типу программа.тест.м
або программа_версія2.1.м
Отримана помилка повністю: https://pastebin.com/D0aS222N.
Різні трапляються символи на позначення апострофа в наших текстах, в кожного свої плюси.
Зараз в мавці підтриманий U+2019, але є аргументи і за інші символи - запрошую до обговорення.
U+2019 - він же одинарні лапки. Є на стандартній розкладці.
U+0027 - красивий гачечок, рекомендований в вікіпедії, можна умовно назвати типографським.
Немає на стандартній віндовій розкладці, є на ukrainian unicode.
U+02BC - теж красивий гачечок, семантично означає саме те що треба в нашій мові (зміна звучання попередньої букви, а не скорочене обʼєднання декількох слів як в англійській).
Немає на стандартній віндовій розкладці, є на ukrainian unicode.
Головний великий плюс цього символа - всі готові регулярки його підтримують і не розбивають слово на частини. Ба більше, цей символ можна використовувати всередині кириличних ідентифікаторів в інших мовах програмування, що спрощує в майбутньому реалізацію взаємодії з бібліотеками.
Також цей символ можна використовувати як частину кириличного домену.
Символ ділення /
недоступний в загальноприйнятій українській розкладці клавіатури.
Пропоную обговорити це тут. Також, можливо, є сенс замінити його на %
.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.