này có lẽ nên được nhiều hơn một bình luận cho @ Dogbert của câu trả lời ở trên, nhưng tôi sẽ gửi nó như một câu trả lời riêng biệt vì lợi ích của định dạng.
Một không cần phải tạo ra .ex
tập tin và gọi trình biên dịch vào chúng để sản xuất dầm:
{: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)
bây giờ bạn có thể có một tập tin chùm bằng văn bản (chúng tôi có nó được lưu trữ trong biến bytecode
bằng cách này .)
NB:.beam_lib:chunks/2
công trình khi và chỉ chùm chứa thông tin gỡ lỗi mã hóa (dầm elixir theo mặc định làm)
Ngoài ra, bạn không cần phải ghi decompiled đang erlang, bạn có thể chỉ đơn giản là vượt qua một nhị phân đó, trực tiếp trong Elixir
:
:beam_lib.chunks(bytecode, [:abstract_code])
Để trích xuất mã riêng của mình:
{:ok,{_,[abstract_code: {_, code}]}} =
bytecode |> :beam_lib.chunks([:abstract_code])
Bây giờ code
chứa mã , cần đủ để kiểm tra, nhưng bạn vẫn được tự do sử dụng các công cụ xây dựng erlang:
code |> :erl_syntax.form_list
hoặc:
code |> :erl_syntax.form_list |> :erl_prettypr.format
Sau này sẽ cung cấp cho bạn charlist nhị phân, chứa mã erlang, chính xác như trong câu trả lời @ Dogbert của. Sử dụng IO.puts
để xuất.
Nếu bạn đang cố gắng nhận 'a' chỉ, bạn sẽ phải chuyển' 0' làm thông số thứ hai.Nếu bạn không vượt qua tham số thứ hai, bạn sẽ nhận được 'a + 2' –
Nếu tôi hiểu bạn đúng, thì bạn đã sai. Nếu bạn gọi 'Test.t1 (0)' thì đầu ra là '0', nhưng nếu bạn gọi' Test.t1 (0, 4) 'thì kết quả là' 4'. Về cơ bản mỗi khi bạn gọi hàm với một đối số, bạn sẽ gọi hàm đầu tiên. Btw, tôi đang trên elixir 1.3.4 – ipinak