#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
エエロ
#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にちなんで命名されました。 私はフィンランド語には強くありませんが、明らかに、最初の音節に重点を置いて、名前は「エロ」のように聞こえるはずです。
構文
ドキュメントは高品質で読みやすい方法で書かれており、言語の各機能の動機が示されており、なぜそれを行うことに決めたのか、基本的には読みやすさ、セキュリティ、 DRY 、 WYSIWYGです。 言語には多くの興味深い詳細があります。すべてを検討するのではなく、小さな主観的なリストに限定します。
まず、Eeroでは、Pythonのように中括弧の代わりにインデントを使用してブロックを強調表示します。 指示および定義の最後のセミコロンはオプションです。
int count = 0 while ( count < 100 ) something = false count++ i++; j++
Eeroでは、メッセージの送信はドット表記で記録されます;引数のないメッセージの場合、これはプロパティの表記に似ています。 引数はコロンの後に渡され、いくつかの引数はコンマで区切られます。
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は名前空間のような素晴らしいものを実装しています 。 接頭辞「NS」はデフォルトで接続されています。 Foundationフレームワークのすべてのタイプは、プレフィックスなしで使用できます。
mystring := String.stringWithUTF8String: "Hello, World"
コンパイラは、最初にエンティティ名をコードに表示されているとおりにチェックし、名前が見つからない場合、登録されたプレフィックスを追加します。
using prefix
ディレクティブ
using prefix
追加のプレフィックスを
using prefix
ます。
using prefix AB ... theAddressBook := AddressBook.sharedAddressBook
ただし、現在の実装には重大な欠点があります。プレフィックスを省略した結果としての競合の発生は監視されず、最初の適切なオプションが単純に使用されます。
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では、メソッド引数の名前を指定する必要はありません;省略した場合、セレクターから自動的に決定されます。 たとえば、次のメソッドでは、引数の名前はbytes 、 length、および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'
クラスでは、次の演算子をオーバーロードできます。
オペレーター | セレクター | ご注意 |
+ | プラス: | 演算子を含む+ = |
- | マイナス: | 演算子を含む-= |
* | 乗数: | 演算子を含む* = |
/ | splitBy: | 演算子/ =を含む |
% | モジュロ: | operator%=を含む |
< | isLessThan: | |
<= | isLessThanOrEqualTo: | |
> | isGreaterThan: | |
> = | isGreaterThanOrEqualTo: | |
<< | shiftLeft: | |
>> | shiftRight: |
最後に、
goto
コンパイラレベルの言語で
goto
禁止されています。 :)
インストールと使用
このセクションは、ビルド2013-12-08、XCode 5.0.2、およびMac OS X 10.8.5でEeroを使用した経験に基づいています。
Eeroの配置は非常に簡単です。 Xcodeのプラグインをダウンロードしてインストールするだけで、LLVMコンパイラフォークのアセンブリが既に含まれています。 インストールでは、Xcodeテンプレートも追加して、新しい.eeroファイルと.eehファイルを作成します。 インストール後、Xcodeを再起動するだけで十分です。作業を開始できます。
構文の強調表示、自動補完が機能します。 ただし、クラスナビゲーションのドロップダウンリストは機能せず、代わりに静的な碑文「選択なし」です。
より正確には、Xcodeはファイルで定義されたクラスとメソッドを表示しませんが、
#pragma mark ...
の指示を使用できます
#pragma mark ...
これらはドロップダウンリストに表示されます。
デバッガー(デバッガーとも呼ばれます)の動作を確認しましたが、すべて正常です。 ただし、ハイライト表示されたコードのクイックヘルプを表示しようとすると、残念ながらXcodeがクラッシュしました。 自動インデントは常に正しく機能するとは限りませんが、これは些細なことです。 これ以上問題は見つかりませんでした。
おわりに
個人的には、Eeroは私にとって最も楽しい印象を与えました。 はい、言語は非常に若いです( eerolanguage.orgドメインは 2011年1月に登録され、プロジェクトはその年の12月にgithubに登場しました) 。したがって、この開発段階に特徴的な欠点があります(主にIDEとの統合) 。 しかし、不溶性の重大な問題は目に見えないため、将来のプロジェクトで試してみたいという強い希望がありました。
参照資料
1)現時点では、変換関数Eero-> Objective-Cは湿っているので、基本的な例のみに成功しています。