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的規范,最好自己能夠區分。