Elixir 简明笔记(二)--- 运行模式
Elixir是一门函数式语言,那么它属于静态语言还是动态语言呢?
又或是动静结合?elixir既可以编译执行,也可以写成脚本的方式执行。所以暂且不去追根究底。下面介绍elixir的文件和运行模式。
安装好elixir之后,会得到三个可执行文件:iex
,elixir
和elixirc
。前面我们接触了 iex,这是一个 elixir的交互解释器。
Elixir文件有三种扩展名:
- ex - 表示源代码文件
- exs - 表示脚本
- beam - 表示编译后的字节码文件
通常ex文件用来写elixir程序源代码,并且通过编译成为字节码文件。exs则用来写一写类似脚本的文件,例如测试文件。现在可以无需追究更多的细节。
创建一个文件 hello.exs
IO.puts "Hello Elixir"
defmodule Hello do
def say do
IO.puts "Hello"
end
end
这段代码第一行使用IO模块的puts方法打印一个字符串。类似其他语言的print操作。然后使用elixir命令执行这个脚本。
$ > elixir hello.exs
Hello Elixir
再新建一个文件hello.ex。这一次可以使用elixirc命令先编译文件,然后再执行:
$ > elixirc hello.ex
在该文件同一目录,会编译生成一个Elixir.Hello.beam
字节码文件。然后在同一目录打开iex,此时即可使用刚才编译好的Hello模块了。
除了使用elixir命令编译代码文件。iex也可以通过c函数来编译源代码,例如:
$ > iex
Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.0.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> c "hello.ex"
hello elixir
[Hello]
iex(2)> Hello.say
Hello
:ok
iex(3)>
在 iex 里面执行了 函数 c
,编译了 hello.exs
文件,并且生成了Elixir.Hello.beam
文件。默认的模块都是在Elixir下的,类似命名空间。更多模块的内容在以后再做介绍。
通常,把代码编写在源文件中,我们希望执行之后还能接着调试。例如 python -i some_file.py
。 python的交互解释器会执行运行some_file.py
并载入上下文。iex也可以做到,不过有点特别。直接iex some_file.ex
文件,只有 some_file.ex 中的模块会在iex中编译,普通的变量是无法绑定的。因此这个上下文会丢掉,一个解决方法就是在iex中调用 import_file
。iex会执行some_file.ex的内容,同时导入代码文件上下文:
defmodule Hello do
def greet do
IO.puts "Greet !"
end
end
hello = fn -> IO.puts "Hello world" end
hello.()
☁ elixir iex
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
Interactive Elixir (1.2.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> import_file "main.ex"
Hello world
:ok
iex(2)> Hello.greet
Greet !
:ok
iex(3)> hello.()
Hello world
:ok
至此,elixir的基本运行模式介绍完毕。elixir还提供了一个mix命令,通过mix可以对elixir进行应用的构建,测试等强大功能。目前我们只需要知道,使用ex文件保存elixir源码,使用exs用来写一些类似脚本的代码。可以使用elixir执行脚本文件,也可以使用elixirc 和 iex 编译执行。
实际上这些区分不是硬性的。exs文件也是可以被编译,和ex文件没有本质差别。为了符合elixir的规范,最好自己能够区分。