рдирдорд╕реНрдХрд╛рд░, рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ BeamVM (рдпрд╛ ErlangVM) рдХреЗ рд▓рд┐рдП рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред
рдкрд╣рд▓рд╛ рднрд╛рдЧ рдореВрд▓ рдмрд╛рддреЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреВрд░реНрдг рдкрд░рд┐рдЪрдп рд╣реИ, рдФрд░ рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рднрд╛рд╖рд╛ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ erlang рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдирдИ рд╣реИрдВред
рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЕрдореГрдд рдХрд╛ 0.1 рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╣реНрд░рд╛рд╕реЛрд╕рд┐рдЯреА рдХреЗ
рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЙрджреНрдзрд░рдг:
тАЬрдПрд░реНрд▓реИрдВрдЧ рдЕрдкрдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рдПрдХ рдЕрдиреВрдард╛ рдордВрдЪ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рднрд╛рд╖рд╛ рдЕрднреА рднреА рд╡рд┐рджреЗрд╢реА рд╣реИред рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдВрдЧ рдЕрдВрдХрдЧрдгрд┐рдд, рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ред рдпреЗ рджреЛрд╖ рдирд╣реАрдВ рд╣реИрдВред рдпреЗ рдХреЗрд╡рд▓ рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред тАЭ
рдЗрд╕ рд╕рдордп, BeamVM рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдЕрдореГрдд рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ (рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд░рд▓реИрдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдмрди рдЧрдИ рд╣реИред рд▓реЗрдЦрдХ рдЬреЛ рдЖрд░реНрдорд╕реНрдЯреНрд░рд╛рдВрдЧ рдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╣рдж рддрдХ рдХрд┐ рдбреЗрд╡ рдереЙрдорд╕ рдиреЗ рдПрдХ рдХрд┐рддрд╛рдм рд▓рд┐рдЦреА рд╣реИред рджреЛ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рднрд╛рд╖рд╛ рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг 1.0 рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ рдЕрдореГрдд рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛, рдПрдХ рд░реВрдмреА рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрдирд╛ рд░рд╣рд╛, рд▓реЗрдХрд┐рди рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдФрд░ рдкреЙрд▓реАрдореЛрд░реНрдлрд┐рдЬреНрдо рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдЬреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ, рдСрдмреНрдЬреЗрдХреНрдЯ-рдЙрдиреНрдореБрдЦ рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмреАрдЯреАрдПрдо рд╡реАрдПрдо рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВред
рдЕрдореГрдд тАЛтАЛрдореЗрдВ рдирдпрд╛:
- рд░реВрдмреА рдХреА рддрд░рд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ (рд░реВрдмреА рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╢рдмреНрджрд╛рд░реНрде)
- рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрд╣реБрд░реВрдкрддрд╛
- metaprogramming
- рдорд╛рдирдХреАрдХреГрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп
- "рдлрд░реНрд╕реНрдЯ рдХреНрд▓рд╛рд╕ рд╢реЗрд▓"
- рдФрд░ рдмрд╣реБрдд, рдмрд╣реБрдд рдЕрдзрд┐рдХ
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдпрд╣ рдПрд░рд▓рд╛рдВрдЧ рдмреАрдо-рдХреЛрдб рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЕрдореГрдд тАЛтАЛрднреА рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдЗрд░рд▓реИрдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд░рд╛рд▓рд╛рдВрдЧ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдкреНрд░рджрд░реНрд╢рди рдЬреБрд░реНрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдЧреАрдереВрдм рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ git clone https://github.com/elixir-lang/elixir.git $ cd elixir $ make test
рдпрд╛
precompiled рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдФрд░ рдлреЗрдбреЛрд░рд╛, рдореИрдХ рдУрдПрд╕ рдпрд╛ рдЖрд░реНрдХ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдореГрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрдордмреНрд░реЗ
$ brew tap homebrew/versions $ brew install erlang-r16
- рдпрджрд┐ erlang рдХрд╛ рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рдЖрдкрдХреЛ erlang рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$ brew uninstall erlang $ brew link erlang-r16
- рдЕрдореГрдд тАЛтАЛрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
$ brew update $ brew install elixir
- рдлреЗрдбреЛрд░рд╛ 17+ рдФрд░ рдлреЗрдбреЛрд░рд╛ рд░реЙрд╣рд╛рдЗрдб: рд╕реБрдбреЛрдо рдпрдо-рдПрд▓ рдЕрдореГрдд
- рдЖрд░реНрдХ рд▓рд┐рдирдХреНрд╕: рдЕрдореГрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдЕрдореГрдд: yaourt -S рдЕрдореГрдд
рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдпрд╛рдиреА рдПрдХреНрд╕рдХреНрд╕ рдХрдВрд╕реЛрд▓ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рддреБрд░рдВрдд рд╕рдм рдХреБрдЫ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрд░реНрд▓реИрдВрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдЕрдореГрдд рдХрдВрд╕реЛрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЯрд┐рдкреНрдкрдгреА:
# This is a commented line
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "# =>" рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрд░реНрде рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
1 + 1 # => 2
рдХрдВрд╕реЛрд▓ рд╕реЗ рдЙрджрд╛рд╣рд░рдг:
$ bin/iex defmodule Hello do def world do IO.puts "Hello World" end end Hello.world
рдЕрдореГрдд тАЛтАЛрдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ erlang рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ:
1 # integer 0x1F # integer 1.0 # float :atom # atom / symbol {1,2,3} # tuple [1,2,3] # list <<1,2,3>> # binary
рдПрд▓реАрдВрдЧрд┐рд░ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рдЬреИрд╕рд╛ рдХрд┐ рдПрд▓рд╛рдВрдЧ-рдИ рдореЗрдВ рд╣реИ, рдХреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдпрд╛ рдмрд╛рдЗрдирд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
'I am a list' "I am a binary or a string" name = "World" "Hello, #{name}"
рдПрд░реНрд▓реИрдВрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдореГрдд рд╣рд░ рдЬрдЧрд╣ рдмрд╛рдЗрдирд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╖рд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рдЗрд╕рдХреА рдЧрддрд┐ рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯрдиреЗрд╕ рдХреЗ рдХрд╛рд░рдг рдПрдХ рдорд╛рдирдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВред
A рдореЗрдВ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рднреА рд╣реИрдВ:
""" This is a binary spawning several lines. """
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐, рдХреЛрд╖реНрдардХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ:
div(10, 2) div 10, 2
рдЕрдореГрдд тАЛтАЛрдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрджрд┐ рдЖрдк рдХреЛрд╖реНрдардХ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдбрд┐рдВрдЧ рд╕реНрдЯрд╛рдЗрд▓ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдореГрдд тАЛтАЛрдореЗрдВ рдЪрд░ рдЕрднреА рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
x = 1 x = 2
рдЪрд░ рдХреЗрд╡рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдпрд╣ рдЕрднреА рднреА рдореИрдЪ рд╣реЛрдЧрд╛ред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд░рд▓реИрдВрдЧ рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрдкреВрд░реНрдг рдкреИрдЯрд░реНрди рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЖрдк ^ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд░рд▓реИрдВрдЧ рдореЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
{x, x} = {1,2} # => ** (MatchError) no match of right hand side value: {1,2} {a, b, [c | _]} = {1,2,["a", "b", "c"]} # => a = 1 b = 2 c = "a" a = 1 # => 1 a = 2 # => 2 ^a = 3 # => ** (MatchError) no match of right hand side value: 3
рдЖрдк рдпрд╣рд╛рдВ рдЕрдореГрдд рдХреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛, рдХреНрд╖рдорддрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ:
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд░реИрд╢ рдХреЛрд░реНрд╕рдЕрдореГрдд тАЛтАЛрдХреЗ рд╕рд╛рде рд╕рдкреНрддрд╛рд╣ред рдЬреЛ рдЖрд░реНрдорд╕реНрдЯреНрд░рд╛рдВрдЧ рдЕрдореГрдд рд▓реЗрдЦрдбреЗрд╡ рдереЙрдорд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдореГрдд, рдкреБрд╕реНрддрдХ рд╕реЗ рджреЛ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рдХрдИ рдЕрдВрд╢ рд╣реИрдВрдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрдЬрдм рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдЕрдореГрдд рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХреА, рддрдм рдПрд░рд▓реИрдВрдЧ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕реЗ рдЕрдХреНрд╕рд░ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдРрд╕реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд▓рдЧрднрдЧ рд╣рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓реА рд╣реИ) рдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрдЯрд░реНрди рдХреА рдирд┐рд░рдВрддрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рдЬреЛ рдХреЛрдб рдмрдврд╝рд╛рдПрдВ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЕрдореГрдд рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдФрд░ рдЕрдм рдореИрдВ erlang рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддреН рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдЬрд╝реНрдо, рд╕рд╛рде рд╣реА рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА, рдЬреЛ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
рдЖрдЗрдП рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдореГрдд тАЛтАЛрдореЗрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ ("рд╕рдм рдХреБрдЫ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ")ред
рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг, рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рдореЙрдбреНрдпреВрд▓ рд▓реЗрдВрдЧреЗред
defmodule Hello do def world do IO.puts "Hello World" end end
рд╣рдо рдЗрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
$ elixirc hello.ex
рдпрд╛ рд╣рдо рдХрдВрд╕реЛрд▓ рдкрд░ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рд╡рд╣рд╛рдВ рд╕рдВрдХрд▓рд┐рдд рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВред
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓реЗрдВ:
defmodule Hello do IO.puts "Hello Compiler" def world do IO.puts "Hello World" end end
рдЕрдм, рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди, рд╣рдо "рд╣реЗрд▓реЛ рдХрдВрдкрд╛рдЗрд▓рд░" рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╕рдВрдХрд▓рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:
defmodule Hello do if System.get_env("MY_ENV") == "1" do def world do IO.puts "Hello World with my Variable = 1" end else def world do IO.puts "Hello World" end end end
рдЕрдм, рдпрджрд┐ рд╣рдо рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
$ elixirc hello.ex $ iex iex> Hello.world
рдпрд╛, рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдорд┐рд▓рддреА рд╣реИ:
$ MY_ENV=1 elixirc hello.ex $ iex iex> Hello.world
рдФрд░ рдЕрдм, рдЪрд▓реЛ рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред
Erlang рдХреЛрдб рдореЗрдВ рдЖрдк рдЕрдХреНрд╕рд░ рдпрд╣ рдпрд╛ рд╕рдорд╛рди рдХреЛрдб рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
my_function(bad_type) -> 1; my_function(bad_stat) -> 2; ....... my_function(1) -> bad_type; my_function(2) -> bad_stat; .....
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
Hello.mapper(:bad_type)
рдЕрдореГрдд тАЛтАЛрдореЗрдВ, рд╣рдо рджреЛрд╣рд░рд╛рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ:
list = [{:bad_type, 1}, {:bad_stat, 2}] lc {type, num} inlist list do def my_function(unquote(type)), do: unquote(num) def my_function(unquote(num)), do: unquote(type) end)
lc inlist do рдПрдХ рд╕реВрдЪреА рд╕рдВрдкреАрдбрд╝рди рд╣реИ рдЕрдореГрдд рднрд╛рд╖рд╛ рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
lc a inlist [1,2,3], do: a * 2
рдЕрдм, рд╕реВрдЪреА рд╕рдВрдкреАрдбрд╝рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдордиреЗ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрдиреНрди рдХрд┐рдП рд╣реИрдВ (рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ)ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдПрдХ рддрд░реАрдХрд╛ рдФрд░
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛рдФрд░ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ, рдЕрдореГрдд рдкрд░рд╕реНрд╡рдпрдВ рдЕрдореГрдд рдореЗрдВ, рдЖрдк рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ:
github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/string.ex#L478-L486рдореИрдХреНрдЬрд╝ рдЗрди рдПрд▓рд┐рдХреНрдЬрд╝рд┐рд░-рдП рдПрдХреНрдЯ рдЗрди рдХреНрд▓реЛрдЬрд░ (рд▓рд┐рд╕реНрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдШрд░ рдкрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ), рдЖрдк рдХрд┐рд╕реА рднреА рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдПрд╕рдЯреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
quote do: 1+1 # => {:+,[context: Elixir, import: Kernel],[1,1]} quote do: {1,2,3,4} # => {:"{}",[],[1,2,3,4]} quote do: sum(1,2) # => {:sum,[],[1,2]} quote do: sum(1, 2 + 3, 4) # => {:sum,[],[1,{:+,[context: Elixir, import: Kernel],[2,3]},4]}
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдПрд╕рдЯреА рдореЗрдВ рддреАрди рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ: {рдирд╛рдо, рдореЗрдЯрд╛, рджрд▓реАрд▓реЗрдВ}
рдЕрдм, рд╣рдорд╛рд░реА рдкрд╣рд▓реА рдореИрдХреНрд░реЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
defmodule MyMacro do defmacro unless(clause, options) do quote do: if(!unquote(clause), unquote(options)) end end
рдЕрдм рд╣рдорд╛рд░реЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
require MyMacro MyMacro.unless 2 < 1, do: 1 + 2
рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдПред
рдпрджрд┐ рд╣рдо рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
defmodule TestRegex do def myregex_test do :re.run("abc", "([az]+)", [{:capture, :all_but_first, :list}]) end end
рдФрд░ рдЕрдм, рдКрдкрд░ рд╣рдорд╛рд░реЗ рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд░реЗрдЧреЗрдХреНрд╕ рд╕рдВрдХрд▓рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╣рдорд╛рд░рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЛрдб рддреЗрдЬреА рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
defmodule TestRegexOptimized do {:ok, regex} = :re.compile("([az]+)") escaped_regex = Macro.escape(regex) def myregex_test do :re.run("abc", unquote(escaped_regex), [{:capture, :all_but_first, :list}]) end end
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреА рд╣реИред Macro.escape рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдореИрдХреНрд░реЛ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рд╣реИрдВ) рд╣рдордиреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдореНрдорд┐рд▓рд┐рдд рдХреА, рдлрд┐рд░ рднреА рдХреЛрдб рдореЗрдВ рдПрдХ рдкрдардиреАрдп рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рд▓реЗ рдПрдХ рдЕрдореГрдд рдореЗрдВ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐% r рдореИрдХреНрд░реЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рддреБрд░рдВрдд рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
Enum.map(1..1000, fn(_) -> elem(:timer.tc(TestRegex, :myregex_test, []), 0) end) |> List.foldl(0, &1 + &2) # => 4613 Enum.map(1..1000, fn(_) -> elem(:timer.tc(TestRegexOptimized, :myregex_test, []), 0) end) |> List.foldl(0, &1 + &2)
рдмрд╣реБрд░реВрдкрддрд╛:
list = [{:a, 1}, {:b, 2}, {:c, 3}, {:d, 4}, {:e, 5}, {:f, 6}, {:g, 7}, {:h, 8}, {:k, 9}] Enum.map(list, fn({a, x}) -> {a, x * 2} end) dict = HashDict.New(list) Enum.map(dict, fn({a, x}) -> {a, x * 2} end) file = File.iterator!("README.md") lines = Enum.map(file, fn(line) -> Regex.replace(%r/"/, line, "'") end) File.write("README.md", lines)
рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо Enumerable рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░ Enum рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рд╕реНрдерд┐рдд рд╣реИ рдЬрд╣рд╛рдВ рдмреАрдИрдПрдорд╡реАрдПрдо рдЗрд╕реЗ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐: source.get_path рдореЗрдВ рд╣реИ)ред рдпрд╛рдиреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ - рд╢реАрд░реНрд╖ рд╕реВрдЪреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХ-рдореВрд▓реНрдп рд▓реЗрдВ:
list = [{:a, 1}, {:b, 2}, {:c, 3}, {:d, 4}, {:e, 5}, {:f, 6}, {:g, 7}, {:h, 8}, {:k, 9}] list[:a]
рд╣рдо рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдВрдЧреЗ, рдЬреЛ рдЯреНрд░реА рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рд╣реЛрдЧрд╛, рдФрд░ рд╣рдорд╛рд░реЗ рдЯреНрд░реА рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред
defmodule TreeM do def has_value(nil, val), do: nil def has_value({{key, val}, _, _}, key), do: val def has_value({_, left, right}, key) do has_value(left, key) || has_value(right, key) end end defrecord Tree, first_node: nil defimpl Access, for: Tree do def access(tree, key), do: TreeM.has_value(tree.first_node, key) end
рдЕрдм, рдЙрд╕реА рддрд░рд╣, рд╣рдо рдПрдХреНрд╕реЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
tree = Tree.new(first_node: {{:a, 1}, {{:b, 2}, nil, nil}, {{:c, 3}, nil, nil}}) tree[:a]
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрд╣реБрд░реВрдкрддрд╛ рджреЗрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм, рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рд┐рдиреНрд╕реЗрдЯреИрдХреНрдЯ рдЪреАрдиреА, рдЬреЛ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
[{: a, 1}] рдХреЛ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: [a: 1]
рдЙрд╕реА рддрд░рд╣, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдирд┐рд░реНрдорд╛рдг рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреИрд╕реЗ:
func3 (func2 (func1 (list))), рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ func1 рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рдкрд╣рд▓реЗ func3 рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрд░ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
file = File.iterator!("README.md") lines = Enum.map(file, fn(line) -> Regex.replace(%r/"/, line, "'") end) File.write("README.md", lines)
рдкрд╛рдЗрдкрд▓рд╛рдЗрди (|>>) рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
lines = File.iterator!("README.md") |> Enum.map(fn(line) -> Regex.replace(%r/"/, line, "'") end) File.write("README.md", lines)
рдЕрдореГрдд тАЛтАЛрдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдорд╛рдирдХреАрдХреГрдд рд╡рд┐рд╖рдп рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣реИред рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред>> рдСрдкрд░реЗрдЯрд░ рдХреА рдорджрдж рд╕реЗ, рдЬреЛ рдЕрдЧрд▓реА рдХреЙрд▓ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдЫрд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдордЭрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп, рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд░реА рдпрд╛ рд╣рд┐рд╕реНрд╕реЗрджрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
lines = File.iterator!("README.md") |> Enum.map( Regex.replace(%r/"/, &1, "'") ) File.write("README.md", lines)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдореГрдд рдЙрди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╣рд┐рдд рдореЗрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рднреА рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рд▓реЛрдЧ рдмреАрдИрдПрдорд╡реАрдПрдо рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдПрд░рдВрдЧреИрдВрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рднреНрд░рдо рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣рд┐рдореНрдордд рдирд╣реАрдВ рд╣реБрдИред рдпрд╣рд╛рдВ, рдЕрдореГрдд рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдорд╛рдирдХреАрдХреГрдд рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕реНрдЯреИрдВрдбрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред