2017年3月12日日曜日

Elixir初心者向けハンズオンに行ってきました

Elixir初心者向けハンズオンに行ってきました。

https://beam-lang.connpass.com/event/47050/

Elixirについては、随分前から興味はあったのですが、文法がRubyっぽいため、
あまり触ろうとは思っていなかったのでした。


内容としては、以下。

  • mixを使ってプロジェクト作成
  • cow_boyを使った簡単なHelloWorldを表示
  • PheonixのPubSub を使った簡易チャットツール

半日にしては十分な題材かなと。
表面的な手の動かし方としては、RoR系と同じなため、特に違和感なく。


言語仕様的な側面で感じたことは、抽象化の概念があまりない。
リストから要素を取り出す場合、リスト型のメソッドを呼び出すのではなく、リストから要素を取り出すユーティリティ(Enum)が存在する。

OTPの仕組みの部分は深く知っておくと色々他のところにも使えそうなので、調べてみたいなぁ。


今後調べてみようと思うキーワード
  • cow_boy
  • phoenix
  • Supervior
  • behaviours



ゲーム系のリアルタイム性&信頼性が要求されるところで結構使われているらしい。
こっち系は完全に無知になりつつあるなぁ。




EClassの識別を属性名name以外に設定する場合の注意点

 xtextのデフォルトのインスタンスの識別は属性名nameで判断している。
そのため、属性名name以外で判断したい場合は、変更する必要がある。

  • 対象 
    •  bindIQualifiedNameProvider 
      • QualifiedNameを解釈するための定義
      • デフォルトでは、DefaultDeclarativeQualifiedNameProviderを使っている。


  • 拡張方法
    • DefaultDeclarativeQualifiedNameProviderを継承したクラスを作成する。
    • QualifiedNameを取得する方法をname->別名に変更する 
    • MyDslRuntimeModule.xtendでbindするクラスをoverrideで変更する。


/*
 * generated by Xtext 2.9.1
 */
package org.xtext.example.mydsl

import org.eclipse.xtext.naming.IQualifiedNameProvider

/**
 * Use this class to register components to be used at runtime / without the Equinox extension registry.
 */
class MyDslRuntimeModule extends AbstractMyDslRuntimeModule {
  

 override Class bindIQualifiedNameProvider() {
  return MyDslQNP;
 }
 
}

MyDslQNP.java
package org.xtext.example.mydsl;

import org.eclipse.sirius.sample.basicfamily.Identifier;
import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
import org.eclipse.xtext.naming.QualifiedName;
 
public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider{
 
    QualifiedName qualifiedName(Identifier e) {
        return QualifiedName.create(e.getShortName());
    }
 
}


Outlineの表示もカスタマイズが必要になる。

MyDslOutlineTreeProvider


class MyDslOutlineTreeProvider extends DefaultOutlineTreeProvider {
 
 override protected _text(Object modelElement) {
  if( modelElement instanceof Identifiable){
   return (modelElement as Identifiable).shortName
  }
 }
 
}