Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Eero — Objective-C без скобочек

Anna | 2.07.2014 | нет комментариев

#import <Foundation/Foundation.h>

int main()
  parts := ['hello', 'world']
  greeting := ''
  for String part in parts
    if part == parts[0]
      Locale myLocale = Locale.currentLocale
      greeting << part.capitalizedString
    else
      greeting << ' '
      greeting << part

  Log('%@', greeting   '!')
  return 0

На днях из любопытства решил посмотреть, на какой стадии находится план Eero — диалект Objective-C с альтернативным легким синтаксисом. Оказалось, что проделан теснее огромный фронт работ и Eero представляет из себя дюже увлекательную разработку.

Пример кода

Для затравки традиционное сопоставление небольшого участка кода на Eero и на Objective-C.

Objective-C

#import <Foundation/Foundation.h>

@interface FileHelper : NSObject

@property (readonly) NSString* name;
@property (readonly) NSString* format;

-(NSFileHandle*) openFile: (NSString*) path;

-(NSFileHandle*) openFile: (NSString*) path
          withPermissions: (NSString*) permissions;

@end

@implementation FileHelper

-(NSString*) name {
  return @"Macintosh";
}

-(NSString*) format {
  return @"HFS ";
}

-(NSFileHandle*) openFile: (NSString*) path {
  return [NSFileHandle fileHandleForReadingAtPath: path];
}

-(NSFileHandle*) openFile: (NSString*) path
          withPermissions: (NSString*) permissions {

  NSFileHandle* handle = nil;

  if ([permissions isEqualTo: @"readonly"] || [permissions isEqualTo: @"r"]) {
    handle = [NSFileHandle fileHandleForReadingAtPath: path];

  } else if ([permissions isEqualTo: @"readwrite"] || [permissions isEqualTo: @"rw"]) {
    handle = [NSFileHandle fileHandleForUpdatingAtPath: path];
  }

  return handle;
}

@end

Eero

#import <Foundation/Foundation.h>

interface FileHelper

  String name   {readonly}
  String format {readonly}

  openFile: String, [withPermissions: String], return FileHandle

end

implementation FileHelper

  name,   return String = 'Macintosh'
  format, return String = 'HFS '

  openFile: String path, withPermissions: String = 'readonly', return FileHandle = nil

    if permissions == 'readonly' or permissions == 'r'
      return FileHandle.fileHandleForReadingAtPath: path

    else if permissions == 'readwrite' or permissions == 'rw'
      return FileHandle.fileHandleForUpdatingAtPath: path

end

Вступление

Eero это всецело интерфейсно и бинарно совместимый диалект Objective-C. Реализован с поддержкой форка LLVM/clang компилятора, т.е. генерирует бинарный код напрямую, вследствие чему с ним работают типовые инструменты разработки LLVM/Clang, включая отладчик, статический анализатор и прочие. Также заявлена экспериментальная конвертация Eero кода в типовой Objective-C код 1.

В Eero дозволено напрямую применять все Cocoa-фреймворки и всякий Objective-C/C код, довольно лишь подключить надобные заголовочные файлы. Также легок и обратный процесс: если для Eero-класса интерфейс определить на Objective-C, то его дозволено применять напрямую, бинарные файлы всецело совместимы.

По существу, Eero является сильным синтаксическим сахаром для Objective-C, повышая читаемость, безопасность и уменьшая объём кода. По словам автора (Andy Arvanitis), первоначально он каждого лишь хотел избавиться от скобочек в Objective-C, а наименование языка предпочел, когда увидел модель стола-пьедестала, тот, что удачно исполнял свои функции без лишних мешающихся ножек. Выходит, язык назван в честь финского зодчего стола Eero Saarinen. Я не силён в финском, но судя по каждому, наименование должно звучать приблизительно как «эро» с ударением на 1-й слог.

Синтаксис

Документация написана высококачественно и легко читается, для всякой особенности языка указывается мотивация, отчего решили сделать именно так, в основном это: читаемость, безопасноть, DRYWYSIWYG. Увлекательных деталей в языке много, я не буду рассматривать все, а ограничусь небольшим субъективным списком.

Во-первых, в Eero для выделения блоков взамен фигурных скобок применяются отступы, как в Python. Точка с запятой в конце инструкций и определений не непременна.

int count = 0
while ( count < 100 )
  something = false
  count  
  i  ; j  

В Eero отправка сообщений записывается через нотацию с точкой, для сообщений без доводов это подобно нотации для свойств (property). Доводы передаются позже двоеточия, несколько доводов разделяются запятыми.

id myarray = NSMutableArray.new
myarray.addObject: myobject
myarray.insertObject: myobject, atIndex: 0

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

NSString mystring = myobject.description
NSString otherString = (NSString) someObject

При декларации локальных переменных дозволено не указывать их тип, он будет механически выведен из присваиваемого выражения. Для этого применяется особый оператор “:=”.

i := 100
mystring := myobject.description

В Eero реализована такая восхитительная вещь, как пространства имён (namespaces). Префикс «NS» подключен по-умолчанию, т.е. все типы из фреймворка Foundation дозволено применять без префикса.

mystring := String.stringWithUTF8String: "Hello, World"

Компилятор вначале проверяет имена сущностей в том виде, как они указаны в коде, и, если имя не обнаружено, добавляет зарегистрированные префиксы. Декларация дополнительных префиксов осуществляется с поддержкой директивы using prefix.

using prefix AB
...
theAddressBook := AddressBook.sharedAddressBook

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

void AAPrint(String str)
  NSLog('AA: %@', str);

void BBPrint(String str)
  NSLog('BB: %@', str);

using prefix AA
using prefix BB
...
Print('test') // AA: test

В Eero не непременно указывать имена доводов способа, в случае опущения, они механически определяются из селектора. Скажем, в дальнейшем способе доводы получат имена byteslength иencoding:

initWithBytes: const void*,
       length: UInteger,
     encoding: StringEncoding

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

initWithBytes: const void*,
       length: UInteger,
     encoding: StringEncoding,
        return id

В Objective-C в случае, когда у способа есть опциональные параметры, принято определять несколько способов с различным числом доводов. В Eero дозволено декларировать способы с необязательными параметрами.

interface MyClass
  openFile String, [withPermissions: String], return FileHandle
end

В имплементации дефолтное значение опционального довода обозначается с поддержкой знака “=”.

implementation MyClass
  openFile: String, withPermissions: String = 'r', return FileHandle
    handle := nil
      if permissions == 'r'
        handle = FileHandle.fileHandleForReadingAtPath: file
      else if permissions == 'w' or permissions == 'rw'
        handle = FileHandle.fileHandleForUpdatingAtPath: file
      return handle
end

Дозволено указать дефолтное возвращаемое значение, что скажем разрешает определять дюже суперкомпактные геттеры:

implementation MyClass 
  model, return String = 'G35'
  serialNumber, return String = 'X344434AABC'
end

Свойства декларируются дюже легко. Признаки при необходимости задаются в фигурных скобках.

interface MyClass
  String name {nonatomic, copy}
  String desc {readonly}
end

При определении блоков применяются отступы, и не применяется знак каретки “^”. По сопоставлению с синтаксисом Objective-C, блоки выглядят дюже легко:

myblock := (int x, int y)
  if x < 0
    printf( "value was negative! (%d)\n", x )
    x = 0
  return x   y

Также поддерживается суперкомпактная форма записи для примитивных блоков, состоящих только из возвращаемого выражения:

xyblock := (int x, int y | return x   y)

descriptions := mylist.mapWith: (id element | return element.description)

В Eero реализована перегрузка операторов. Во-первых, для всех объектов оператор “==” является алиасом для способа isEqual. Что актуально в первую очередь для читабельного и безвредного сопоставления строк:

mystring := MutableString.new
mystring.appendString: 'Hello, World'

if mystring == 'Hello, World'
  // попадаем сюда, т.к. выражение выше правдиво

При применении бинарного оператора ” ” сообщение stringByAppendingString будет послано каждому объектам, которые могут на него ответить (предпочтительно NSString и его субклассы):

helloString := 'Hello'
worldString := 'World'

helloWorldString := helloString   ', '   worldString

Подобно оператор “<<” посылает сообщение appendString:

mystring := ''
mystring << 'Hello, World'

Для своих классов дозволено перегружать следующие операторы:

Оператор Селектор Примечание
plus: Включая оператор =
- minus: Включая оператор -=
* multipliedBy: Включая оператор *=
/ dividedBy: Включая оператор /=
% modulo: Включая оператор %=
< isLessThan:
<= isLessThanOrEqualTo:
> isGreaterThan:
>= isGreaterThanOrEqualTo:
<< shiftLeft:
>> shiftRight:


Ну, и наконец, в языке на ярусе компилятора запрещен goto. :)

Установка и применение

Данный раздел написан по навыку применения Eero в сборке 2013-12-08, XCode 5.0.2 и Mac OS X 10.8.5.

Ставится Eero дюже легко. Довольно скачать и установить плагин для XCode, тот, что теснее содержит сборку форка компилятора LLVM. При установке также добавятся образцы XCode для создания новых .eero и .eehфайлов. Позже установки довольно перезапустить XCode и всё, — дозволено приступать к работе.

Работает подсветка синтаксиса, автодополнение. Впрочем, не работает выпадающий список с навигацией по классу, взамен него неподвижная надпись «No Selection».

Вернее говоря, XCode не видит классы и способы, определенные в файле, но дозволено воспользоваться инструкциями #pragma mark ..., — они в выпадающем списке видны.

Проверил работу отладчика (он же debugger), всё в порядке. Впрочем, к сожалению XCode падал при попытке просмотра quick help к выделенному коду. Ещё не неизменно правильно работают авто-отступы, но это вовсе мелочь. Огромнее задач не найдено.

Завершение

Лично на меня Eero произвел самое славное ощущение. Да, язык довольно молод (домен eerolanguage.orgзарегистрирован в январе 2011, а на гитхабе план возник в декабре того же года), и потому присутствуют недочеты, характерные для данной стадии становления (в основном с интеграцией с IDE). Впрочем, неразрешимих и критичных задач не видно, а потому у меня возникло упрямое желание испробовать его в грядущих планах.

Ссылки

1) На данный момент функция конвертирования Eero -> Objective-C сыровата, у меня успешно отработала только на элементарных примерах.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB