пятница, 2 декабря 2016 г.

EO синтаксис:

Пример: Hello world!
import org.eolang.cli
import org.eolang.printed
import org.eolang.string
cli:
  printed:
    string:
      "Hello, world!"
Этот код будет скомпилирован в класс .java, который затем будет скомпилирован в .class байт-код и при выполнении выведет сообщение "Привет, мир!"

Что в себя включает синтаксис языка EO:


Типы (types):

Тип - это контракт, которому объект должен подчиниться, аналог интерфейсу из Java 1.0. У типа есть имя и список задекларированных методов.

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

Каждый метод должен принимать ровно одну строку, без какого-либо завершающего символа в конце.
type Book:
  String asText()
type Car:
  Money cost()
  Bytes picture()
  Car moveTo(Coordinates coords)
type Pixel extends Point:
  Pixel moveTo(Int x, Int y)
  Bytes drawTo(Canvas canvas)
В EO существует только один встроенный тип (это Bytes), который очень похож на Bytes[] в Java.

Тип может стать подтипом другого типа с помощью ключевого слова extends.

Тип может иметь от одного до четырех методов.

Имя типа должно составляться из букв и цифр [A-Z] [A-Za-z0-9] {2,15}.

Наиболее популярные типы:
Int
Boolean
Double
String

Объекты (objects):

Объект - это активная сущность, которая имплементирует (содержит, включает) 1 или несколько типов.

Объект в EO может быть или создан, или скопирован. Когда объект создается все его методы должны быть реализованы (alphabet это имя объекта):
object alphabet("978-1-51916-691-3", "The Alphabet") as Book:
  String @isbn
  String @title
  ctor(String i, String t):
    @isbn = i
    @title = t
  String asText():
    sprintf:
      "ISBN is %s, title is '%s'",
      @isbn,
      @title
Объект может быть создан через копирование уже существующего объекта. Но с другим (или аналогичным) набором аргументов для одного из конструкторов, например (ot это имя объекта):
ot: "978-0-73561-965-4", "Object Thinking"
То же самое можно записать в несколько строк (запятая в конце обязательно):
ot:
  "978-0-73561-965-4",
  "Object Thinking"
Объект может быть анонимным (безымянным):
Person person():
  object ("John") as Person:
    String @name
    ctor(name)
    String name():
      @name
Создание объекта и копирование могут быть объединены любым возможным способом, например:
Ticket ticket(Person passenger):
  object (passenger) as Ticket:
    Person @p
    ctor(Passenger p)
    String name():
      concat:
        "506-",
        @p.name()
    Money price():
      if:
        @p.vip(),
        money("$50"),
        object () as Money
          Int value():
            25
Символы имени объекта должно соответствовать [A-Z] [а-z0-9] {2,15}.

Наиболее популярные объекты:
if
equals as Boolean
not as Boolean
firstIsLess as Boolean
firstIsGreater as Boolean
plus
minus
mul
div


Атрибуты (attributes):


Атрибут - это координата инкапсулированного объекта.

Объект может иметь ряд атрибутов, перечисленных сразу после первой строки декларации объекта:
object zero(0, "USD") as Money:
  Int @amount
  Text @currency
Все атрибуты являются private; нет такого понятия, как общедоступные (public) или защищенные (protected) атрибуты.

Объект может иметь до пяти атрибутов.

Имя атрибута начинается спец.символом @ и должно соответствовать [A-Z] [а-z0-9] {2,15}.


Конструкторы (constructors) и деструкторы (destructors):

Объект должен иметь primary (первичный, главный) конструктор (который должен иметь, по меньшей мере, один параметр, то есть объект должен инкапсулировать что-то), и может иметь любое количество вторичных конструкторов и одного деструктора. Первичным конструктором будет тот, кто инициализирует атрибуты объекта и не имеет тела, например:
object zero() as Money, Int:
  Int @amount
  Text @currency
  ctor(): # secondary constructor
    zero: 0
  ctor(Int a): # secondary constructor
    zero: a, "USD"
  ctor(Int amount, Text currency) # primary constructor
  dtor(): # destructor
    printed: "I'm dying..."
Очевидно, что имена параметров в основном конструкторе должны совпадать с именами атрибутов объекта.

Вторичные Конструкторы должны возвращать объекты, которые реализуют по крайней мере, все типы, указанные в декларации текущего объекта.

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

Конструкторы должны быть перечислены после атрибутов. Первичный (primary) конструктор должен быть последним. Деструктор, если он присутствует, идет сразу же после первичного конструктора.

Для конструкторов используется ключевое слово ctor, а деструкторов, ключевое слово dtor.


Методы (methods):

Метод - поведение, показывающий предназначение объекта.

Тело метода должно создавать и возвращать ровно один объект, используя одно "объявление", например:
Int max(Int a, Int b):
  if:
    firstIsLess:
      a,
      b
    b,
    a
Метод должен возвращать что-то; нет такого понятия, как null, который есть в Java / C ++.

Метод не может существовать в объекте, если он не определен в одном из его типов.

Все методы являются public; нет такого понятия, как private и protected методы.

Метод может иметь от нуля до четырех аргументов.

Каждый аргумент должен иметь необязательный тип и имя. Если тип не условии, что он должен быть заменен? знак, например:
Int power(? x, Int p):
  if:
    equals: p, 0,
    1,
    mul:
      x,
      power: x, minus: p, 1
Этот код приведет к ошибке во время компиляции, если х не реализует Int.

Имя метода должно соответствовать [A-Z] [а-z0-9] {2,15}.

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


Исключения (exceptions):

Чтобы исключения обрабатывались у вас должна быть библиотека org.eolang.error (импортируется по умолчанию):
import org.eolang.error # you can omit this line
Int price(Int total, Int amount):
  if:
    equals: amount, 0
    error: "Division by zero"
    div: total, amount


а также:

 аргументы (arguments) и декораторы (decorators).


Что исключено из синтаксиса EO:

Классы (classes), переменные (variables), операторы (operators), statements, аннотации (annotations), рефлексия (reflection), приведение типов (type casting), дженерики (generics), NULL, статические методы (static methods), функции (functions), лямбды (lambdas).



Пример: фибоначи

object fibonacci(1) as Int:
  Int @n            
  ctor():                
    fibonacci: 1        
  ctor(Int n)           
  Int int():            
    if:                   
      firstIsLess: @n, 2
      1,
      plus:               
        @n
        fibonacci:
          minus: @n, 1 
Здесь, объекты iffirstIsLessplus, и minus копируются.

Комментариев нет:

Отправить комментарий