EFFE Script — упростить синтаксис C# без потери качества

в 12:14, , рубрики: .net, monogame, xna, ненормальное программирование, Программирование, скриптовый язык

EFFE Script — упростить синтаксис C# без потери качества

Здравствуйте. Я программист инди игр. И мне всегда нравилось создавать игры в одиночку (по многим причинам). Так как мой первый язык программирования был C#, я начал делать игры на платформе XNA (сейчас перешел на MonoGame). Однако за два года создания игр я понял, что даже на самом удобном (для меня) языке C# и не сложной платформе XNA мне было сложно писать одному большие инди проекты.

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

EFFE Script

EFFE Script (далее — «скрипт») — упрощенный, сокращенный и облегчённый синтаксис для MonoGame, имеющий свою логику построение полей, методов, а так же ООП, и их использование. Создан с целью максимально упростить синтаксис написания кода C# без потери оптимизации.

Скрипт, потому что у него вместо компилятора — конвертация в C#. Да, всё верно. Сначала ваш скрипт конвертируется в C# код, а потом уже компилируется в приложение. Но не спешите говорить: «Что? Он должен ещё и конвертироваться?». Давайте сначала разберем возможности и недостатки данного скрипта.

Плюсы скрипта в том что ваш готовый проект, вне разработки, не будет зависеть от библиотек скрипта. Это относится и к дополнениям скрипта, который он может иметь типа встроенных классов для создания графики или проверку столкновений. Код просто будет сконвертирован и импортирован в C# проект.

Основная цель скрипта — облегчить написания большого количества кода, используя шаблоны, сокращения, готовые методы, нарушение строгой типизации. В какой-то степени вы можете сами себе создать строку кода, который будет иметь упрощенный вид оригинала. Разница в том, что скрипт не будет создавать отдельные методы под ваш код, он просто трансформируется или откроется. Давайте сразу перейдем к примерам, что бы понять, о чем речь.

Примеры

Сравнивать буду конечно же с языком C#. Начну с классики:

C#

class Program
{
  void Main()
  {
    Console.Write("This is EFFE Script");
  }
}

EFFE

~EFFE Program

MET Main
Console.Write "This is EFFE Script"

~END

Слова '~EFFE' и '~END' — лейблы, структура скрипта. Всё что будет написано вне — комментарии. Тип «класс» является значением по умолчанию, потому его можно не писать.

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

Слабая типизация позволяет легко скопировать код C# в скрипт, без необходимости изменять каждую строку.

Переменные и методы

Основная «фишка» скрипта, это логика построения методов. Методы не открываются/закрываются фигурными скобками. Всё проще по иному — новый метод закрывает выше имеющийся.

C#

//var
public static int[] map;
private readonly string Name;

// methods
void Meth1() { x = 0; }

int Meth2() { return x++; }

EFFE

' var
VAR
> S int[] map
R str Name

' methods in effe
MET Meth1
x = 0

MET int Meth2
^ x++

MET — это лейбл метода. VAR — тоже лейбл. Он может закрыть выше имеющийся метод, для объявления переменных вне метода.

Большинство часто используемых слов (типа public, return...), имеют свой специальный символ.

Тут так же важна позиция этого символа (как например с return — это знак ^ в начале, иначе это просто возведение в степень), а метод void не пишется. Однако напомню, что вы можете писать и return вместо знака ^.

Знак в начале строки ('одинарная ковычка) — комментарий для скрипта.

Создания нового экземпляра класа/структуры (для не локального атрибута):

EFFE

SomeClass some

MET Main
new some

Тоже самое, что и в C#

SomeClass some;

void Main()
{
  some = new SomeClass();
}
Метод=Метод

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

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

MET Update
actor
tile

Оба класса будут вызывать метод Update, потому что они находятся в методе Update (не важна где) и они были просто объявлены (без уточнения).

FastFlag

Можно быстро изменить значение переменно типа bool, но только в методах в методах.

C#

flag = true;
mouse = false;
invert = !invert;

EFFE

+flag
-mouse
!invert

Шаблонное сокращение

EFFE Script позволяет создавать пользовательское сокращение кода — Шаблон кода.

Шаблон кода создается путем определения имени, которая будет хранить этот шаблон в буфере(её не будет видно в исходном C# коде). После, чтобы создать Шаблон, нужно определить новый шаблон знаками '<-', т.е. импорт.

То, то будет хранить шаблон (после знака '<-') — абсолютно любой код. То, что стоит учесть — это знак вопроса '?'. Этот знак служит как параметр, который будет заменен при вызове шаблона. Заполняются по порядку. И что бы 'развернуть' шаблон, нужно использовать знак '->'.

C#

Vertices[0].pos.x = -1.5f;
Vertices[1].pos.y = 1.5f;
Vertices[2].pos.z = 1.0f;

EFFE

v <- Vertices[ ? ].pos. ? = ? f

v -> 0,x, 5.0
v -> 1,y, 1.8
v -> 2,z, 0.2

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

Мгновенный цикл

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

EFFE

new int[50] map
...
map[0 50] = 1

Здесь будет создан цикл от 0 до 50, и каждая ячейка массива 'map' будет иметь значение 1. Это делается путем использования двух чисел/атрибутов int, разделенных пробелом. Отчет начинается с перового до второго по единице (увеличивается, если второе число больше, и на оборот). Можно так же этот способ расширить:

C#

for(int i = 20; i > 5; i -= 2)
  map[i] = i * i;

EFFE

// поле i не было где либо объявлено
map[i 20 5 -2] = i * i
swich case

swich так же имеет ряд дополнений, которые сократят написание кода.

swich number
{
  case 0
  ^ "Число ноль"
  
  case 1 = 10
  ^ "Число от 1 до 10"
  
  case 11 14 17 20
  ^ "Одно из чисел - 11, 14, 17, 20"    
}
Память оператора if

Память в том смысле, что оператор if запоминает последнюю объявленную в нем переменную.

Допустим есть такая конструкция if:

C#

if(x < 0 || x > 40 && x != y)

В EFFE будет так:

if x < 0 || > 40 && != y

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

Мелкие возможности

  • Доступ ко всем полям C#
  • Пользовательское сокращение кода
  • Нет необходимости использовать using
  • Писать как сокращенные, так и оригинальные ключевые слова
  • Встроенные методы (по выбору). Camera, Actor, SceneManager, Tile и т.д.
  • Слабая типизация кода
  • Дополнительные циклы/формулы (LOOP, [n n], MET=MET)
  • MonoGame лейблы
Слабая типизация кода

И ещё раз по поводу слабой типизации кода. Вы можете как писать, так и не писать символы точки с запятой и круглые скобки при вызове метода. Однако скобки нужно будет использовать, если будет случай типа '(int).ToString ...'. Тоже самое относится и к сокращенным типам переменных (S — static, > — public, < — private, C — const, ...).

Заключение

Это ещё не всё, что может скрипт. И не всё, что будет в финальной версии. Сейчас проект в закрытой разработке. Обновляется только wiki проекта на сайте github. Будет открыт только в момент первой (0.1) рабочей версии (в третьем квартале этого года). В основном были показаны возможности скрипта, не касаясь платформы MonoGame. На нем будет делаться упор во второй (0.2) версии.

Я напомню, что проект не коммерческий. И любой может (не)использовать данный скрипт. У каждого свои вкусы и нравы. Мне больше интересно ваше мнение касательно синтаксиса. Приму любую критику и поддержку в качестве развития синтаксиса.

Автор: HarkBack

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js