我写了一个程序来打印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()
答案 0 :(得分:2)
Elixir必须运行代码来编译它;它是如何运作的。编译该文件将正确生成Solution.beam
(Solution
模块的字节码),因为它执行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()
或删除它。
Elixir(实际上是Erlang)并不是简单地构建单个二进制映像。它们都依赖于运行时二进制文件来执行。 Exrm将找出您需要的所有运行时文件,并将它们捆绑到一个压缩文件中,您可以将其移动到要执行的计算机上。
但是没有一个二进制文件可以简单地部署在不同的机器上。至少你还需要Erlang和Elixir运行时。