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

elixirc命令正在编译和执行代码,elixir,Elixir,我写了一个程序用Elixir打印两个数字的和。我将文件保存为solution.ex,当我使用elixirc as elixirc solution.ex编译它时,它会编译并执行代码。我认为elixirc只会编译代码并生成一个二进制文件,使用elixir运行二进制文件将执行它。任何帮助都将不胜感激 defmodule Solution do defp sum(a, b), do: a + b def main() do a = IO.gets("") |> String.s

我写了一个程序用Elixir打印两个数字的和。我将文件保存为solution.ex,当我使用elixirc as 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()

Elixir必须运行代码来编译它;这就是它的工作原理。编译该文件将正确生成
Solution.beam
(用于
Solution
模块的字节码),因为它执行
defmodule
宏。之后,它将盲目运行
Solution.main()
。(仅对Clarity而言,
def
s中的代码不是在编译时运行的)

如果您想在此基础上构建一个可以调用的可执行文件,比如
$elixir sum
,那么您可能需要查看哪些是可执行的Erlang(因此也是elixir)脚本(仍然需要安装Erlang VM才能运行)。您可以在的文档或一堆博客文章(如)中阅读有关它们的更多信息

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


这样,生成的脚本将调用
Solution
模块的
main/1
函数,并将命令行参数传递给它。请注意,您没有这样的函数,您只有
main/0
(不带参数),因此您需要定义
main/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()
,要么删除它


编辑:原始海报的进一步评论让我认为他或她想要的是将编译好的二进制文件带到另一台机器并运行它的能力。如果是这样的话,那么你可能想要的是

Elixir(实际上还有Erlang)并不是简单地构建一个二进制映像。它们都依赖于运行时二进制文件来执行。Exrm将计算出您需要的所有运行时文件,并将它们捆绑到一个压缩文件中,您可以将其移动到要执行的机器上


但是没有一个二进制文件可以简单地部署在不同的机器上。至少您还需要Erlang和Elixir运行时。

我想做的是使整个过程自动化。编译elixir代码,获取二进制文件并在文件中提供输入的地方执行它。简单明了地说,我想要一个编译并给出二进制文件的命令,然后是执行并打印输出的命令。然后用elixir代替elixir。但是elixir编译并运行它。编译后我需要一个可执行文件。如果我们的答案中有一个已经回答了你的问题@SaiKiran,你会接受其中一个吗?如果不是的话,也许你可以详细说明我们两人都错过了什么?@OnorioCatenacci很抱歉我忙于工作。我还没有看过,但一旦看过,我肯定会接受其中一本。只是需要一些时间来看看你说了什么。
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()