การใช้งานร่วมกับ Erlang
หนึ่งในประโยชน์ของการสร้างบน Erlang VM (BEAM) คือมี library ให้เลือกใช้มากมายก่ายกอง ความสามารถในการทำงานร่วมกับ Erlang ทำให้เราเราสามารถใช้ library และ Erlang standard lib ได้ใน code Elixir
ในบทนี้เราจะมาดูวิธีการใช้งาน funtion ใน standard lib ไปพร้อมๆ กับ แพ็คเกจ third-party ของ Erlang
Standard Library
standard library เสริมของ ของ Erlang สามารถใช้งานได้ทุกที่ใน code Elixir ของ application เรา โมดูล Erlang จะอยู่ในรูปของ atom แบบ lowercase เช่น :os
และ :timer
ลองใช้ :timer.tc
เพื่อดูเวลาการทำงานของ function ที่ใช้
defmodule Example do
def timed(fun, args) do
{time, result} = :timer.tc(fun, args)
IO.puts("Time: #{time} μs")
IO.puts("Result: #{result}")
end
end
iex> Example.timed(fn (n) -> (n * n) * n end, [100])
Time: 8 μs
Result: 1000000
ดู list ของ module ที่ใช้ได้ทั้งหมดที่ Erlang Reference Manual
Erlang Packages
ในบทก่อน เราได้พูดถึง Mix และการจัดการกับ dependency ไปแล้ว library ของ Erlang ก็ทำงานเช่นเดียวกัน ในสถานการณ์ที่ library ขอ Erlang ไม่ได้อยู่ใน Hex คุณสามารถดึงมันจาก git repository แทนได้
def deps do
[{:png, github: "yuce/png"}]
end
คราวนี้เราก็สามารถใช้งาน library Erlang ได้แล้ว
png =
:png.create(%{:size => {30, 30}, :mode => {:indexed, 8}, :file => file, :palette => palette})
Notable Differences
ตอนนี้เรารู้แล้วว่าเราจะใช้ Erlang ยังไง เราควรจะรู้ลูกเล่นอื่นๆ ที่มาพร้อมกับ Erlang interoperability
Atoms
atom ของ Erlang ดูเหมือนคล้ายกับ Elixir ต่างกันตรงที่มันไม่มี colon (:
) มันจะอยู่ในรูปของอักษร lowercase และ underscore
Elixir:
:example
Erlang:
example.
Strings
ใน Elixir เมื่อเราพูดถึง string เราจะหมายถึง UTF-8 encoded binaries แต่ใน Erlang string ยังใช้ double quote แต่จะหมายถึง char list แทน
Elixir:
iex> is_list('Example')
true
iex> is_list("Example")
false
iex> is_binary("Example")
true
iex> <<"Example">> === "Example"
true
Erlang:
1> is_list('Example').
false
2> is_list("Example").
true
3> is_binary("Example").
false
4> is_binary(<<"Example">>).
true
เรื่องสำคัญที่ควรจำคือ library ของ Erlang เก่าๆ หลายตัวที่ไม่ได้รองรับ binary ดังนั้นเราต้องแปลง string ของ Elixir ให้กลายเป็น chat list ก่อน และแน่นอนว่าต้องขอบคุณที่มีวิธีง่ายๆ ในการทำอย่างนั้น นั่นคือ function to_charlist/1
:
iex> :string.words("Hello World")
** (FunctionClauseError) no function clause matching in :string.strip_left/2
(stdlib) string.erl:380: :string.strip_left("Hello World", 32)
(stdlib) string.erl:378: :string.strip/3
(stdlib) string.erl:316: :string.words/2
iex> "Hello World" |> to_charlist |> :string.words
2
Variables
Elixir:
iex> x = 10
10
iex> x1 = x + 10
20
Erlang:
1> X = 10.
10
2> X1 = X + 1.
11
แค่นั้นเลย การใช้ประโยชน์ Erlang ในแอพ Elixir ของเรา ช่างง่ายและยังเพิ่มจำนวน library ให้เราใช้งานได้อย่างมีประสิทธิภาพอีกด้วย
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!