Bu muhtemelen @ için daha fazla bir yorum olmalıdır Dogbert en yukarıdaki cevabı, ama biçimlendirme uğruna ayrı cevap olarak yayınlamayın olacaktır. Onları ışınlarının üretilmesi için üzerinde
Bir derleyici .ex
dosyaları oluşturmak ve çağırmak gerekmez: şimdi (biz bu arada bytecode
değişken sakladığınız yazılmış bir kiriş dosyası girmiş olabileceğini
{:module, _, bytecode, _} =
defmodule Elixir.Test do
def t1(a), do: a
def t1(a, b \\ 2), do: a + b
end
# File.write!("Elixir.Test.beam", bytecode)
.)
Not:.
Ayrıca varsayılan olarak yapmakbeam_lib:chunks/2
çalışır ve sadece ışın şifresiz ayıklama bilgileri içeriyorsa (iksir kirişler), Eğer yazma bozulamaz erlang koduna gerek yoktur, sadece Elixir
doğrudan, orada bir ikili geçebilirim:
:beam_lib.chunks(bytecode, [:abstract_code])
kodun kendisini ayıklamak için:
{:ok,{_,[abstract_code: {_, code}]}} =
bytecode |> :beam_lib.chunks([:abstract_code])
Şimdi code
kodu içeren Bunu incelemek için yeterli olmalı, ancak hala erlang yapılarını kullanmakta özgürsünüz:
veya: Tam olarak Dogbert cevabı @ olduğu gibi erlang kodu içeren, size ikili charlist verecektir
code |> :erl_syntax.form_list |> :erl_prettypr.format
ikincisi. Çıktısı almak için IO.puts
kullanın.
Yalnızca "a" almaya çalışıyorsanız, ikinci parametre olarak bir "0" iletmeniz gerekir.Eğer ikinci bir parametreyi geçmezseniz, 'a + 2' –
elde edersiniz Eğer doğru anladıysan, yanılıyorsunuz demektir. Eğer Test.t1 (0) 'diyorsanız, çıkış" 0 "dır, fakat eğer" Test.t1 "(0, 4) 'i çağırırsanız, sonuç" 4 "olur. Temel olarak, her defasında bir argüman ile fonksiyonu çağırırsanız, ilkini çağırırsınız. Btw, elixir'dayım 1.3.4 – ipinak