Pull to refresh

Comments 25

UFO landed and left these words here
Программа написанная на языке microScript транспилируется в javascript.

x=5;
my_object[x] без кавычек что вернуть должен?


вопрос в другом, если собственно "по синтаксису схож с Lua" зачем было изобретать велосипед, а не просто скомпилировать ту же Lua в webassembly?
или fengary — lua переписанная на яваскрипте.

x=5;my_object[x] без кавычек что вернуть должен?

Вернет 0

вопрос в другом, если собственно "по синтаксису схож с Lua" зачем было изобретать велосипед, а не просто скомпилировать ту же Lua в webassembly?или fengary — lua переписанная на яваскрипте.

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

nil и bool выкинули, вместо него теперь 0, и отличить его от несуществующего в таблице значения теперь нельзя?

a=[1,2,3]

b=[1,2,3,0]

a[4] == b[4]?

извините конечно, но имхо по сравнению с ванильной lua лучше совсем не стало,

кому сильно надо с метатаблицами разберётся и синтаксический сахар для class/object себе сам дорисует

объявление массива тем же оператором что и индесация тоже упрощение сомнительное.

извините конечно, но имхо по сравнению с ванильной lua лучше совсем не стало,

microScript не лучше Lua и не пытается быть лучше. Область применения microScript ограничена созданием игр и приложений в среде microStudio.

a=[1,2,3]
b=[1,2,3,0]
a[4] == b[4]?

Поскольку в этом примере вы используете [] вместо {}, предположу что это пример кода на microScript а не Lua.

В microScript это сравнение двух несуществующих значений (индексы начинаются с 0, не как в Lua). Таким образом, a[4] == b[4] все равно что0 == 0 в microScript - вернет true.

Если иметь ввиду все-таки Lua, тогда запишем так:

a = {1,2,3}
b = {1,2,3,0}
a[4] == b[4]

Теперь мне уже понятно о чем речь. Теперь мы сравниваем nilи0.
В Lua nil == 0 вернет false.

nil и bool выкинули, вместо него теперь 0, и отличить его от несуществующего в таблице значения теперь нельзя?

Тут надо оговориться - в microScript нет таблиц как в Lua:

таблица в Lua это такая структура данных, которая сочетает в себе свойства массива, хэш-таблицы («ключ»-«значение»), структуры, объекта.

В microScript есть списки (list), которые можно рассматривать как массивы подобные массивам в JavaScript. Но я не буду браться прям сравнивать, так как не программировал на JS. Просто наблюдаю что эти вещи похожие.

Ну а теперь перепишем Ваш пример для microScript:

a=[1,2,3] //по индексу 3 ничего нет, поэтому там 0
b=[1,2,3,0] //по индексу 3 имеем доступ к значению 0
a[3] == b[3] //вернет 1(true)

Понятно, что это очень простой пример (мало элементов в списках) и мы явно видим, что сравнимаем "ничего" (что в microScript по умолчанию 0) со значением 0. Но если бы у нас были большие списки и мы хотели сравнить пятидесятые элементы списка, то результат был бы не очевиден. В данном примере мы имеем два списка с целыми числами и хотим выяснить, равен ли определенный элемент одного списка другому определенному элементу другого списка?

Единственная проблема заключалась бы в том, что в списках содержались бы как нулевые значения (например переменная со значением 0), так и 0 (как "ничего"). В таких списках не отличить 0 (как "ничего") от переменной со значением ноль. А это в microScript может случиться только тогда, когда списки могут быть разреженными (ну, как разреженные массивы). А разреженными они могут быть только тогда, когда мы будем пользоваться операциями со списком, не описанными в документации.

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

  list_a = [1,2,3]
  list_b = [1,2,3,4]
  list_a[list_a.length-1] == list_b[list_b.length-1] //вернет false
  //list.length хранит длину списка (количество элементов в списке)
Операции со списком в microScript, расскажу о них в следующей статье
Операции со списком в microScript, расскажу о них в следующей статье

Если бы я хотел сравнить элементы одного списка начиная с индекса 0, с элементами другого списка, также начиная с индекса 0, при этом не сравнивая несуществующие значения, я бы сделал например так:

  list_a = [1,2,3]
  list_b = [1,2,3,0]

  if list_a.length <= list_b.length then
    for i = 0 to list_a.length-1
      print(list_a[i] == list_b[i])
    end
  end
  
  if list_a.length > list_b.length then
    for i = 0 to list_b.length-1
      print(list_a[i] == list_b[i])
    end
  end

В консоли:
1
1
1

Да, в microScript можно создать разреженный список. Он будет содержать пустые значения, которые в Lua были бы nil, а в microScript они будут нулевыми, но можно этого и избежать.

объявление массива тем же оператором что и индесация тоже упрощение сомнительное.

В этом microScript похож на JS а не Lua. microScript транспилируется в JS кстати говоря.

Очень компактный и интересный язык. Не понятно только для чего по-умолчанию делать переменные глобальными, а локальность вводить оператором local.

Ведь в JavaScript тоже так было.

First, strict mode makes it impossible to accidentally create global variables. In normal JavaScript mistyping a variable in an assignment creates a new property on the global object and continues to "work" (although future failure is possible: likely, in modern JavaScript). Assignments, which would accidentally create global variables, instead throw an error in strict mode.

(c) MDN

Но с появлением strict modeпоявилась возможность сделать код надежнее благодаря конструкции 'use strict'.

А теперь и эта конструкция не нужно: строгий режим включён по-умолчанию в EcmaScriptмодулях:

ECMAScript 2015 introduced JavaScript modules and therefore a 3rd way to enter strict mode.  The entire contents of JavaScript modules are automatically in strict mode, with no statement needed to initiate it.

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

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

(c) Википедия

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

В плане эргономичности чего только стоят:

loop {
    break;
}

Вместо:

while(true) {
    break;
}

Все операторы - выражения, а последнее выражение в функции, если оно не содержит ";" - возвращается.

Вишенка на торте: объявление переменных.

  • let - не меняет значение;

  • let mut - меняет;

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

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

UFO landed and left these words here

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

"Это игра ума, это дипломная работа" - нет, это не игра и не дипломная работа:)

Эта статья по сути является дополнением к предыдущей статье.

Возможно, если прочтете предыдущую стать, Вам станет более понятно о чем речь https://habr.com/ru/post/595213/

Рискну предположить, зачем этот язык и какие задачи эффективнее на нем решать, я боюсь что все устали уже от JS-style языков, типа задач: phyton, js в процессорах - чтобы ниже порог вхождения, боюсь true языки таких образом будут нечто магии

"Привет" + "Вася" = "Привет Вася". То есть язык за меня решает, что я хочу вставить между словами пробел?

Спасибо за замечание, нет, не решает:) Пробел нужно ставить, отредактирую

Очень интересно, напоминает ActionScript 2, но с классами. Так как старый Flash давно накрылся, было бы очень классно сделать ему простую замену! Вопрос в том, как у вас там дальше с работой со спрайтами, таймлайном, движением по траекториям и программной анимацией...

Да, а переменные класса ведь не глобальные, их область видимости какая, внутри класса? А в методах класса?

Да, а переменные класса ведь не глобальные, их область видимости какая, внутри класса? А в методах класса?

Эти переменные не являются глобальными, они доступны только внутри класса. Переменные из методов также доступны только классу, которому пренадлежит метод. С объектами тоже самое.

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

Это уже тема для отдельной статьи:)

UFO landed and left these words here

Нельзя объяснять про bool, его же в языке нет.

UFO landed and left these words here

Так сказано в официальной документации:

not

logical NOT: not a is true if a is false and false if a is true.

UFO landed and left these words here

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

Спасибо за это замечание! Если Вы видите еще какие-то недочеты, дайте знать:)

Немного неочевидный для меня момент - чем это отличается от обрезанного питона кроме js-ных `smth.arg === smth["arg"]` и небольших изменений в синтаксисе?

Привидите хотя бы пример ЯП который является "обрезанной версией" Python, который можно сравнить с microScript.

microScript может напоминать чем то Python, но только на первый взгляд. Да и чего стоит только придирчивость Python к отступам.

Скорее microScript напоминает чем то Lua. По словам автора, он вдохновлялся именно этим языком при создании microScript. А также, если брать во внимание синтаксис, то можно сравнить и с MiniScript.

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

В сущности оно так и есть, как я и сказал в статье: "...microScript - это локальный язык. В настоящее время он используется только в пределах microStudio." Ну а microStudio это среда разработки игр.

Совершенно точно подмечено, да, думаю что можно добавить этот пункт в статью.

Sign up to leave a comment.

Articles