2016-04-01 7 views
1

私の同僚の集まりで、私は新しいプログラミング言語を設計しています。私たちはターゲット言語としてエリクシルを検討しています。しかし、言語は主にScalaの構文とセマンティクスに基づいているため、何らかの方法で継承を許可する必要があります。エリクシルでの俳優継承のシミュレーション

しかし、クラスではなく、その場所にアクターを使用することが考えられますが、興味深い問題が生じます。エリクシルの関数を使って、クラスライクな継承をどのようにシミュレートしますか?つまり、何らかの形で他の関数のreceiverパターンを継承することは可能でしょうか?

A-ラこの:

def io_port do 
    receive do 
    {:transmit, data} -> # do stuff with data 
    {:receive, data} -> # do other stuff with data 
    end 
end 

def thunderbolt, extends: io_port do 
    receive do # also accepts all the same messages io_port does 
    {:display, data} -> # same story again 
    end 
end 
+2

私はあなたがエリクサーのプロトコルを見ることをお勧めします。 http://elixir-lang.org/getting-started/protocols.html –

+2

さらに、Elixirの 'use'マクロをチェックしてください:http://elixir-lang.org/getting-started/alias-require-and-import.html #つかいます。 Rubyの継承やミックスインとよく似ています。言い換えれば、 'use'マクロの実装を見て、あなたが望む言語機能を与える独自のマクロを実装するためのアイディアを得ることができます。 –

+0

私は 'use'マクロもお勧めします。 –

答えて

1

エリクサーはあなたが一致するレベルのようにマクロを挿入することはできません:

receive do 
    macro1() 
    macro2() 
end 

だから、あなたは本当にメッセージのダイナミックなマッチングを行うことはできません。
しかし、あなたは次のように を継承するために同様のものを作るためにOTPのコンポーネントを使用することができます。

defmodule IOPort do 
    use Actor 

    defmacro receiver do 
    quote do 
     def handle_call({:transmit, data}), do: # do stuff with data 
    end 
    end 
end 

defmodule Thunderbolt do 
    use Actor, extend: IOPort 

    defmacro receiver do 
    quote do 
     def handle_call({:display, data}), do: # do stuff with data 
    end 
    end 
end 

そして、それはただのコンセプトだ。もちろん、

defmodule Actor 

    defmacro __using__([]) do 
    __MODULE__.receiver 
    end 

    defmacro __using__([extends: mod]) do 
    mod.receiver 
    __MODULE__.receiver 
    end 

end 

のようなものを書き、実際にテストされていません。しかし、GenServerの場合と同様に動作し、OTPを使用すると、ホイールの再発明がたくさんできます。

PS。 あなたのこのプログラミング言語について私に教えてください。私が喜んで助けてくれる価値があるなら

+0

私は一度私は私の試験を経験したことについてあなたに書きます。これまでのところまだ学生向けのプロジェクトです –