24966


Lispはコードを`quote`するとデータ（リスト）が得られ、そのデータはコードと表現が同じです。

[code]

    [1]> (+ 1 2 3)
    6
    [2]> (quote (+ 1 2 3))
    (+ 1 2 3)
    
[/code]

Elixirは少し様子が違います。

[code]

    iex(1)> 1 + 2 + 3
    6
    iex(2)> quote do: 1 + 2 + 3
    {:+, [context: Elixir, import: Kernel],
     [{:+, [context: Elixir, import: Kernel], [1, 2]}, 3]}
    
[/code]

出て来たASTは確かにElixrで扱えるデータ（タプル）ではあります。  
しかしプログラマが書くコードとは形が大分異なる物です。これをコードとして実行する事は出来ません。  
この点が私の「同図像性」という言葉のイメージと違っていたので質問しました。

Elixirには同図像性があるのでしょうか。  
あるとすれば、Elixirのどの性質が同図像性を持つと言い得る条件を満たしているのでしょうか。


CC BY-SA 3.0
2016-05-17T14:05:40.647
24939
2016-05-18T08:51:57.227
3054
question
elixir
Elixirには同図像性(homoiconicity)があるのか


どの言語が homoiconic であるかについては、いろいろと議論があるようです。たしかに、Elixir
には同図像性があると主張する人もいますが、その一方で、Elixir のオフィシャルなドキュメントには、"homoiconic"
という言葉は出てこないようです。

同図像性の定義ですが、私には、こちらに書かれているものが分かりやすかったです。

  * <http://c2.com/cgi/wiki?HomoiconicLanguages>

要約すると、こうなります。

**定義：**

  * プログラムコードを、その言語の基本データ型で表現できる言語は、「同図像性」があるという。

**同図像性がある言語の利点：**

  * そのような言語では、コードとデータを相互に変換できる。そのため、プログラムの実行時に、そのプログラム自身が、新しいコードを生成したり、コードを変更したりすることができる。

もしこの定義に従うなら、Elixir は、以下のようにコードとデータを相互に変換できるため、同図像性があるといえそうです。

**プログラムコード（テキスト表現）から、データ（AST）への変換：**

[code]

    iex(1)> 1 + 2 + 3
    6
    iex(2)> sum_prog = quote do: 1 + 2 + 3
    {:+, [context: Elixir, import: Kernel],
     [{:+, [context: Elixir, import: Kernel], [1, 2]}, 3]}
    
[/code]

**データ（AST）をプログラムとみなして実行：**

[code]

    iex(3)> Code.eval_quoted(sum_prog)
    {6, []}
    iex(4)> Code.eval_quoted(sum_prog) |> elem(0)
    6
    
[/code]

**データ（AST）から、プログラムコード（テキスト表現）への変換：**

[code]

    iex(5)> Macro.to_string(sum_prog)
    "1 + 2 + 3"
    
[/code]

このように、プログラムの実行時に、コードとデータの相互変換が可能です。また、ASTはElixirの基本型で構成されていますので、普通のElixirコードが、その実行時に、新しいコードを生成することができます。

ただ、 **バイトコード（beamファイル）へコンパイル済みの**
コードから、ElixirのASTに逆コンパイルすることはできないようです。一応、beamファイルにデバッグ情報が付いている時だけ、ErlangのASTとコード（テキスト表現）までは戻せます。

  * [Elixir や Erlang の beam ファイルを逆アセンブル、逆コンパイルする方法 -- おまけ：Erlang コードへ逆コンパイル](http://qiita.com/tatsuya6502/items/fa142cb51824bb72c910#%E3%81%8A%E3%81%BE%E3%81%91erlang-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%B8%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)


CC BY-SA 3.0
2016-05-18T08:30:51.870
24966
2016-05-18T08:51:57.227
2016-05-18T08:51:57.227
14101
14101
24939
answer