2016-03-01 65 views
1

我寫了一個程序來打印Elixir中兩個數字的總和。我將文件保存爲solution.ex,當我使用elixirc編譯爲elixirc solution.ex時,它將編譯並執行代碼。我認爲elixirc只會編譯代碼並生成一個二進制文件,使用elixir運行二進制文件將執行它。任何幫助將不勝感激。命令elixirc正在編譯和執行代碼

defmodule Solution do 
    defp sum(a, b), do: a + b 

    def main() do 
    a = IO.gets("") |> String.strip |> String.to_integer 
    b = IO.gets("") |> String.strip |> String.to_integer 
    sum(a, b) |> IO.puts 
    end 
end 

Solution.main() 
+0

如果我們的答案中的任何一個回答了您的問題@SaiKiran您會接受其中的一個嗎?如果不是,也許你可以詳細說明我們倆都錯過了什麼? –

+0

@OnorioCatenacci對不起,我被趕上了工作。我沒有審查過,但一旦我做了,我一定會接受其中之一。只需要一些時間來看看你所告訴的。 –

回答

2

藥劑具有運行的代碼進行編譯;這就是它的工作原理。編譯該文件將正確生成Solution.beamSolution模塊的字節碼),因爲它會執行defmodule宏。之後,它會盲目運行Solution.main()。如果你想建立一個可執行的出這一點,你可以調用像$ elixir-sum(只是clairty,裏面def是代碼在編譯時運行)

,那麼你可能想看看escripts,這是可執行的Erlang(以及Elixir)腳本(仍然需要安裝Erlang VM才能運行)。您可以在mix escript.build task的文檔中或在諸如this one之類的博文中閱讀關於它們的更多信息。

粗略地說,你需要這個(在你的mix.exs文件由project/0返回)添加到項目的配置:

def project() do 
    [..., 
    main_module: Solution] 
end 

這樣,生成的腳本將調用Solutionmain/1功能模塊將命令行參數傳遞給它。請注意,你沒有這樣的功能,你只有main/0(不帶參數),所以你需要定義main/1(你可以忽略參數)。

1

萬一你的問題是如何保持elixirc運行的代碼,這就是答案:

defmodule Solution do 
    defp sum(a, b), do: a + b 

    def main() do 
    a = IO.gets("") |> String.strip |> String.to_integer 
    b = IO.gets("") |> String.strip |> String.to_integer 
    sum(a, b) |> IO.puts 
    end 
end 

#Solution.main() 

由於@whatyouhide說,代碼將得到無論運行。但是如果在代碼末尾沒有Solution.main(),它將簡單地編譯代碼並且沒有任何東西可以執行,因此它將退出。所以要麼註釋掉Solution.main()要麼刪除它。


編輯:由原始的海報進一步評論讓我覺得他或她正在尋找的是採取編譯的二進制到不同的機器上並運行它的能力。如果是這種情況,那麼你可能想要的是exrm

Elixir(甚至Erlang)不會簡單地構建一個二進制圖像。它們都依賴於運行時二進制文件來執行。 Exrm將找出所需的所有運行時文件並將它們捆綁到一個壓縮文件中,然後您可以將它們移動到要執行的機器上。

但是沒有一個二進制文件可以簡單地部署在不同的機器上。至少你還需要Erlang和Elixir運行時。

+0

我想要做的是自動化整個事情。編譯elixir代碼,獲取二進制文件並在文件中輸入的地方執行它。簡單而簡單,我想要一個編譯並給出二進制命令,然後執行它並打印輸出的命令。 –

+0

然後,而不是elixirc使用仙丹。 –

+0

但elixir編譯並運行它。編譯後我需要獲得一個可執行文件。 –