命令elixirc正在编译并执行代码

时间:2016-03-01 11:55:37

标签: elixir

我写了一个程序来打印Elixir中两个数字的总和。我将文件保存为solution.ex,当我使用elixirc编译elixirc solution.ex时,它编译并执行代码。我认为elixirc只会编译代码并生成二进制文件,并使用elixir运行二进制文件将执行它。任何帮助将不胜感激。

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()

2 个答案:

答案 0 :(得分:2)

Elixir必须运行代码来编译它;它是如何运作的。编译该文件将正确生成Solution.beamSolution模块的字节码),因为它执行defmodule宏。之后,它将盲目地运行Solution.main()。 (仅用于clairty,def内的代码不在编译时运行)

如果您想构建一个可执行的可执行文件,您可以调用$ elixir-sum,那么您可能需要查看escripts,它们是可执行的Erlang(以及Elixir)脚本(仍然是需要安装Erlang VM才能运行)。您可以在mix escript.build task的文档或this one等博客帖子中阅读有关它们的更多信息。

粗略地说,您需要将其添加到项目配置中(由project/0文件中的mix.exs返回):

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

这样,生成的脚本将调用main/1模块的Solution函数,将命令行参数传递给它。请注意,您没有这样的功能,只有main/0(不带参数),因此您需要定义main/1(您可以忽略这些参数) )。

答案 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运行时。