Git Product home page Git Product logo

mavka's People

Contributors

artemiikravchuk avatar dkostmii avatar harnyk avatar kant2002 avatar kohutd avatar ossenjoyer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mavka's Issues

Прив'язка функцій до структури

Наразі до структури можна прив'язати тільки дії, дія назва_структури.назва_дії(аргументи).
Спроба це зробити з функціями, назва_структури.назва_функції = (аргументи): функція, викликає Не вдалося зловити: Неможливо викликати пустоту.

image_2023-03-26_125351325
Використаний код: 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
друк("Наступне число: %(наступний)")

але це занадто як на мене

Використання "пропустити" і "зупинити"

Наразі в файлах мови вже є згадки про пропустити і зупинити, але вони ніде не використовуються, що може призводити до деяких помилок:
image
image

В документації вони, наскільки я знаю, не згадуються, тому це невелика проблема, але все одно, якщо в найближчий час їх не планується додати, то пропоную їх прибрати, або додати зрозуміле повідомлення помилок, напр.:
image
image

Краще розібратися зараз, потім і забути можна)

Побітові операції

Чи існують в мавці побітові операції? Якщо так, то як саме вони реалізовані? А якщо ні, то варто обговорити це питання

Пропозиції: Список

Методи роботи зі списками

Вступ

Ця задача є чернеткою пропозицій і закликом до обговорення. На її основі можна буде створбвати окремі задачі по кожній ухваленій пропозиції.

Реалізовано

Ініціалізація

ч = Список(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 модулі в основний репозиторій Мавки.

Перевірка типів

Проблема

Наразі Мавка не перевіряє типи. Це зроблено, щоб програми виконувались швидше.

Тим не менше, під час розробки функція перевірки типів може дуже добре допомогти.

Пропозиція додати прапорець до команди виконання мавки і назвати його "--увімкнути-перевірку-типів". Коли цей прапорець присутній, код буде виконуватись з перевіркою типів.

Приклад:

тест.м:

а число = "сонце сяє, вітер віє"

команда:

мавка --увімкнути-перевірку-типів тест.м

приклад результату:

Не вдалось зловити: Неможливо присвоїти значення "сонце сяє, вітер віє" (текст) змінній "а" (число) через несумісність типів.

Помилка в розширені

Помилка в розширені

  • Мавка: 0.11.3
  • NodeJS: 18.16.1

Код в якому відбулася помилка

index.м

взяти файл "Object-keys.js" як keysObject

js keysObject

список = ("var1"=1, "var2"=2, "var4"=4, "var5"=5, "var6"="лох", "var7"=7, "var8"=8)

структура Колекція
кінець

дія Колекція.ключі() 
  вернути ключі(список)
кінець

колекція = Колекція()
результат = колекція.ключі()
друк(результат)

Object-keys.js

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

ReferenceError: context is not defined

На жаль, не вдалося дослідити причину помилки, але можна повторити, викликаючи щось типу 2+пусто:
image
Помилка виникає наче при всіх операторах:
image

В одному з прикладів компілятор не може отримати поле

структура Ракета
  назва текст
  швидкість число
  вага число
кінець

дія Ракета.запустити()
  друк("Ракету %(я.назва) запущено!")
кінець

нептун = Ракета(назва="Нептун",
                швидкість=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

Макети

Проблема

Проблеми як такої немає, але було би класно мати конструкції для абстрагування структур через щось схоже на інтерфейси в ООП.

Чернетка:

макет Двигун
  запустити()
  зупинити()
кінець

структура ІоннийДвигун є Двигун
  ;; властивості двигуна
кінець

дія ІоннийДвигун.запустити()
  ;; ...
кінець

дія ІоннийДвигун.зупинити()
  ;; ...
кінець

Пропозиція

Обговорити тут.

Порівняння швидкості виконання з іншими мовами

Привіт 🙂
Чи проводили порівняння швидкості виконання коду з іншими мовами, наприклад, з Python, Java, Ruby? Якщо так, то чи можна переглянути результати? Якщо ні, то цікаво було б порівняти швидкість виконання, наприклад, алгоритму хешування sha256.

Yarn не створює посилання на бінарники в папці node_modules/.bin

Через кірилицю в імені команди "мавка" та "пак", коли пакет 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"
  },

Pattern Matching

Проблема

Варто мати таку зручну конструкцію, як pattern matching. Бо при його використанні можна швидко отримати потрібні поля структури як окремі змінні та відсіяти непотрібні.
Пропоную наступний синтаксис:

структура Людина
  ім'я текст
  вік число
кінець

дія отримати_студента(ім'я текст) Людина
  Людина(ім'я="Тарас", вік=21)
кінець

Людина(вік, ...) = отримати_студента("Тарас")
друк(вік)

Також зручною буде конструкція match. Варто подумати над перекладом ключового слова.

л = Людина(ім'я="Тарас", вік=21)

порівняти л
  Людина(ім'я, вік=13) тоді друк("неповнолітній %(ім'я)"),
  Людина(вік, ім'я) якщо вік не менше 18 тоді друк("Повнолітній %(ім'я)"),
  хтось_ще тоді друк("Інший варіант"),
  _ тоді впасти "недосяжне"
кінець

Відображення версії мови у консолі (тимчасово)

Відображення версії у консолі та, при можливості, нової версії Мавки, якщо така доступна у репозиторії пакетного менеджера NPM.

Це дасть змогу відразу зрозуміти, чому та чи інша функція недоступна.

Рішення може бути тимчасовим, аби уникнути виведення версії Мавки у випадку, якщо стандартний вхід перенаправлено до файлу.

Як ідеальний варіант, можливе резервування нових символів (структур, їхніх методів, глобальних функцій і т.д.) з позначенням версії, починаючи з якої символ буде реалізовано, для найкращого досвіду розробника.

Вищевказане може стати постійною практикою у циклі розробки Мавки.

Помилка як значення

Пропозиція

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

Мотивація

Класичне кидання помилок не є надійним, оскільки це є вириванням з потоку керування. Не відомо коли, хто, і чи взагалі відреазує на виняток. Ловити винятки синтаксично не обов'язково, а якби було обов'язково, то код би або виглядав загромаджено і гірше читався, або була би одна точка реагування на помилки, з якої не зрозуміло, без заглиблення у код, джерело самої помилки.

Можливий вигляд реалізації

Наразі, обговорений у телеграм чаті варіант виглядає наступним чином:

дія додати_з_умовою(а, б)
  якщо а більше 999
    вернути Помилка("а має бути не більше 999")
  кінець

  Ок([а + б, а + а, б + б])
кінець

[аб, аа, бб] = додати_з_умовою(1000, 2) ;; кидає помилку
[аб, аа, бб], помилка = додати_з_умовою(1000, 2) ;; не кидає помилку

Тобто тут суть, що з дії може вернутись Ок, або Помилка (як всюди).
Коли дія викликається, то з неї вертається або Ок, або Помилка.
За замовчуванням вертається розгорнутий Ок, але є можливість обробити помилку записавши її в змінну через другий арумент оператора присвоєння.

ок, помилка = додати_з_умовою(...)
;; якщо вернулось Ок, то в "ок" буде результат обчислення
;; якщо вернулось Помилка, то в "ок" буде пусто, а в "помилка" буде Помилка

ок = додати_з_умовою(...)
;; тут те саме, тільки якщо вернулось Помилка, то ця помилка буде викинута через "впасти", так як користувач ніяк не обробив

Переліки (enum)

Проблема

В мову згодом треба буде додати enum-и. Потрібно придумати для них синтаксис.

Пропозиція

Обговорити тут.

Помилка при умові типу `якщо не логічне_значення`

Умови вигляду якщо логічне_значення працюють правильно:
image
Але виникає помилка парсеру при спробі виконати умову якщо не логічне_значення
image
Помилку знайшов при роботі Долею (тести), отримав більш повну інфу:
image

Обговорення різних апострофів

Різні трапляються символи на позначення апострофа в наших текстах, в кожного свої плюси.
Зараз в мавці підтриманий U+2019, але є аргументи і за інші символи - запрошую до обговорення.

  • U+2019 - він же одинарні лапки. Є на стандартній розкладці.

  • U+0027 - красивий гачечок, рекомендований в вікіпедії, можна умовно назвати типографським.
    Немає на стандартній віндовій розкладці, є на ukrainian unicode.

  • U+02BC - теж красивий гачечок, семантично означає саме те що треба в нашій мові (зміна звучання попередньої букви, а не скорочене обʼєднання декількох слів як в англійській).
    Немає на стандартній віндовій розкладці, є на ukrainian unicode.
    Головний великий плюс цього символа - всі готові регулярки його підтримують і не розбивають слово на частини. Ба більше, цей символ можна використовувати всередині кириличних ідентифікаторів в інших мовах програмування, що спрощує в майбутньому реалізацію взаємодії з бібліотеками.
    Також цей символ можна використовувати як частину кириличного домену.

Символ ділення

Проблема

Символ ділення / недоступний в загальноприйнятій українській розкладці клавіатури.

Пропозиція

Пропоную обговорити це тут. Також, можливо, є сенс замінити його на %.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.