programming erlang ch5 - andstudy/forge GitHub Wiki

Key Point

  • BIF - Built In Function
  • Binary
  • Bit
  • Etc

BIF

  • ์–ผ๋žญ์— ๋‚ด์žฅ๋œ ํ•จ์ˆ˜. ์–ผ๋žญ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

      tuple_to_list({12,cat,"hello"}). 
      time().
    
    • tuple_to_list /1 : ํŠœํ”Œ์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜
    • time/0 : ์˜ค๋Š˜ ํ˜„์žฌ ์‹œ๊ฐ„์„ ์‹œ,๋ถ„,์ดˆ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.( ํŠœํ”Œ์ž๋ฃŒํ˜•์œผ๋กœ )
  • ๋ชจ๋“  BIF๋Š” ๋งˆ์น˜ erlang๋ชจ๋“ˆ์— ์†ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์›€์ง์ธ๋‹ค.

    • ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” BIF๋“ค์€ ์ž๋™์œผ๋กœ import๋จ.
  • http://www.erlang.org/doc/man/erlang.html ์—์„œ BIF์˜ ๋ชฉ๋ก์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

Binary

  • ๋ฐ์ดํ„ฐ๊ตฌ์กฐ

  • ์ž‘์€ ๋ถ€๋“ฑํ˜ธ ๋‘๊ฐœ์™€ ํฐ ๋ถ€๋“ฑํ˜ธ ๋‘๊ฐœ๋กœ ๋‘˜๋Ÿฌ์‹ผ ์ผ๋ จ์˜ ์ •์ˆ˜ ๋˜๋Š” ๋ฌธ์ž์—ด๋กœ ์ž‘์„ฑ๋˜๊ณ  ์ถœ๋ ฅ๋จ

      <<5,10,20>>.
      <<"hello">>.
    
  • ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์ •์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ •์ˆ˜ ๊ฐ๊ฐ์€ 0~255๋ฒ”์œ„. ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ 0๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

    • ๋ฌธ์ž์—ด์€ ์•„์Šคํ‚ค๋ฌธ์ž์ฝ”๋“œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ.
  • ๋ฐ”์ด๋„ˆ๋ฆฌ ์กฐ์ž‘ BIF

      @spec list_to_binary(IoList) -> binary()
      @spec split_binary(Bin,Pos) -> {Bin1, Bin2}
      @spec term_to_binary(Term) -> Bin                                external term format? http://www.erlang.org/doc/apps/erts/erl_ext_dist.html
      @spec binary_to_term(Bin) -> Term
      
      B = term_to_binary({binarise,"are",useful}).
      <<131,104,3,100,0,8,98,105,110,97,114,105,101,115,107,0,3,97,114,101,100,0,6,117,115,101,102,117,108>>.
      binary_to_term(B).
      {binaries,"are",useful}
      
      @spec size(Bin) -> Int
    

Bit

  • ๋น„ํŠธ ๊ตฌ๋ฌธ์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ์— ๋“ค์–ด ์žˆ๋Š” ๊ฐœ๋ณ„ ๋น„ํŠธ ๋˜๋Š” ์—ฐ์†ํ•œ ๋น„ํŠธ๋“ค์„ ์ถ”์ถœํ•˜๊ณ  ๋ฌถ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด ๋งค์นญ์˜ ํ™•์žฅํŒ์ด๋‹ค.

    • ํ”„๋กœํ† ์ฝœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฉ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ํ”„๋กœํ† ์ฝœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌถ๊ณ  ํ‘ธ๋Š” ๋ฐ ์žˆ์–ด ๋งค์šฐ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
  • X,Y,Z๋ฅผ ๋ณ€์ˆ˜ M์— 16๋น„ํŠธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์œผ๋กœ ๋ฌถ์œผ๋ ค ํ•˜๋Š” ๊ฒฝ์šฐ.

      M = << X:3, Y:7, Z:6>>
    
  • 16๋น„ํŠธ ์ƒ‰์ƒ ๋ฌถ๊ณ  ํ’€๊ธฐ

      Red = 2.
      Green = 61.
      Blue = 20.
      
      Mem = <<Red:5, Green:6, Blue:5>>.    
      <<23,180>>
    

์›Œ๋“œ๋ฅผ ํ’€๊ฒฝ์šฐ ํŒจํ„ด ๋งค์นญ์„ ์ด์šฉ.

  • ๋น„ํŠธ ๊ตฌ๋ฌธ์‹

      <<>>
      <<E1,E2,...,En>>
    
    • Ei๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ํ•˜๋‚˜์˜ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ด. Ei๋Š” ๋‹ค์Œ ์ค‘ ํ•œ๊ฐ€์ง€ ํ˜•ํƒœ๊ฐ€ ๊ฐ€๋Šฅ

      Ei = Value |
           Value : Size |
           Value/TypeSpecifierList |
           Value:Size/TypeSpecifierList
      

์–ด๋–ค ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑด ๋ฐ”์ด๋„ˆ๋ฆฌ์˜ ์ „์ฒด ๋น„ํŠธ ์ˆ˜๋Š” 8๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ ธ์•ผ ํ•œ๋‹ค. ์ด์œ ๋Š”? ์ฑ…์—!

  • Value, Size, TypeSpecifieList์˜ ์ œํ•œ. (ํŒจํ„ด ๋งค์นญ์‹œ์—๋Š” ๋˜ ๋‹ค๋ฅด๋‹ค)

  • (๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ) Value ๋Š” ๋ฐ”์šด๋“œ ๋ณ€์ˆ˜ ์ด๊ฑฐ๋‚˜ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž์—ด ์ •์ˆ˜, ๋ถ€๋™ํ˜•, ๋ฐ”์ด๋„ˆ๋ฆฌ

  • Size๋Š” ์ •์ˆ˜. Size์˜ ๊ฐ’์€ ์œ ๋‹›์˜ ์„ธ๊ทธ๋จผํŠธ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

      @type End = big | little | native
      @type Sign = signed | unsigned
      @type Type = integer | float | binary
      @type Unit = 1 | 2 | ... | 255
    
  • ๊ณ ๊ธ‰ ๋น„ํŠธ ๊ตฌ๋ฌธ ์˜ˆ์ œ

    • MPEG ๋ฐ์ดํ„ฐ์—์„œ ๋™๊ธฐํ™” ํ”„๋ ˆ์ž„ ์ฐพ๊ธฐ
    • COFF ๋ฐ์ดํ„ฐ ํ’€๊ธฐ
    • IPv4 ๋ฐ์ดํ„ฐ๊ทธ๋žจ์—์„œ ํ—ค๋”ํ’€๊ธฐ

๋‚˜๋จธ์ง€ ์งง์€ ์ฃผ์ œ๋“ค

  • apply - ํ•จ์ˆ˜์™€ ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์ด ๋™์ ์œผ๋กœ ๊ณ„์‚ฐ. ํ•จ์ˆ˜์˜ ์ด๋ฆ„๊ณผ ์ธ์ˆ˜๋กœ๋ถ€ํ„ฐ ํ•จ์ˆ˜๊ฐ’ ๊ณ„์‚ฐ

    • apply(Mod,Func,[Arg1,Arg2,..,ArgN]) - BIF Mod:Func(Arg1,Arg2,...,ArgN) ๊ณผ ๋™์ผ ํ•˜๋‹ค.

      apply(erlang, atom_to_list,[hello]).
      
  • ์ฃผ์˜์‚ฌํ•ญ ์€ ์ฑ…์—!

  • ์†์„ฑ - ์–ผ๋žญ ๋ชจ๋“ˆ ์†์„ฑ์˜ ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ

    • -AtomTag(...)์˜ ๊ตฌ๋ฌธ, ํŒŒ์ผ์˜ ํŠน์ •ํ•œ ์†์„ฑ์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

    • ์‚ฌ์ „ ์ •์˜๋œ ๊ฒƒ๊ณผ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ ๋‘ ์œ ํ˜•์ด ์กด์žฌ

    • -record(...)์™€ -include(...)๋Š” ๋ชจ๋“ˆ ์†์„ฑ์œผ๋กœ ์ทจ๊ธ‰ X

    • ์‚ฌ์ „ ์ •์˜๋œ ์†์„ฑ

       -module(modname)
       -import(Mod,[Name1/Arity1,Name2/Arity2,...]).
       -export([Name1/Arity1,Name2/Arity2,...]).
       -compile(Options).  Option์— ๋Œ€ํ•ด์„œ๋Š” compile๋ชจ๋“ˆ์˜ ๋งค๋‰ด์–ผ ํŽ˜์ด์ง€์— ์„ค๋ช…๋˜์–ด์žˆ์Œ.
       -vsn(Version). 
      
  • ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ

      -SomeTag(Value).
    

SomeTag๋Š” Atom์ด์–ด์•ผ ํ•˜๋ฉฐ, Value๋Š” ๋ฆฌํ„ฐ๋Ÿด ํ…€์ด์–ด์•ผ ํ•œ๋‹ค.

  • ๋ธ”๋ก ์‹ - begin & end

       begin
         Expr1,
         ....,
         ExprN
       end
    
  • ๋ถˆ๋ฆฌ์–ธ ์‹ - ๋ชจ๋“  ๋ถˆ๋ฆฌ์–ธ ์‹

    • not B1
    • B1 and B2
    • B1 or B2
    • B1 xor B2
  • ๋ฌธ์ž ์ง‘ํ•ฉ

    • ์–ผ๋žญ ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ๋“ค์€ ISO-8859-1(Latin-1)๋ฌธ์ž ์ง‘ํ•ฉ์œผ๋กœ ์ธ์ฝ”๋“œ ๋œ๋‹ค๊ณ  ๊ฐ€์ •
  • ์ฃผ์„

    • %๋กœ ์‹œ์ž‘, ์ค„์˜ ๋๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

    • %% ์ด๋งฅ์Šค ์–ผ๋žญ ๋ชจ๋“œ์—์„œ ์ธ์‹๋จ.

      %
      my_func(Arg1,Arg2) ->
       case f(Arg1) of
         {...}  -> ์ฃผ์„ ์ž‘๋™ํ•จ.
      
  • epp - ์–ผ๋žญ ์ „์ฒ˜๋ฆฌ๊ธฐ

    • compile:file(M,['P']) ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค - ๋ฌธ์ž์—ด๊ณผ atom์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ

    • ๋ฌธ์ž์—ด์ด๋‚˜ ๋‹ค์˜ดํ‘œ๊ฐ€ ๋ถ™์€ Atom๋‚ด์—์„œ ์ถœ๋ ฅ ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๋ฌธ์ž๋“ค์„ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•ด์คŒ.
  • ์‹๊ณผ ์‹ ์‹œํ€€์Šค

    • ์‹ : ํ‰๊ฐ€๋˜์–ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ
    • ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ผ๋ จ์˜ ์‹. ์‹œํ€€์Šค์˜ ๊ฐ’์€ ๋งˆ์ง€๋ง‰ ์‹์˜ ๊ฐ’์œผ๋กœ ์ •์˜ ๋จ. ์•ž์„  ์‹์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉ
  • ํ•จ์ˆ˜ ์ฐธ์กฐ ๋ฒ•

    • fun LocalFunc/Arity
    • Mod:RemoteFunc/Arity
  • ์ธํด๋ฃจ๋“œ ํŒŒ์ผ - ์ปดํŒŒ์ผ ์‹œ ํŒŒ์ผ์„ ํฌํ•จ์‹œํ‚ค๋Š” ๋ฒ•

      - include(Filename).  ์ธํด๋ฃจ๋“œํŒŒ์ผ์˜ ํ™•์žฅ์ž๋Š” .hrl.  ์ ˆ๋Œ€๊ฒฝ๋กœ๋‚˜ ์ƒ๋Œ€๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์•ผํ•จ
      - include_lib(Name).  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ—ค๋”ํŒŒ์ผ ํฌํ•จ์‹œํ‚ฌ๋•Œ
    
      ๋ฆฌ์ŠคํŠธ์—ฐ์‚ฐ - ++์™€ --
    
  • ๋งคํฌ๋กœ - ์–ผ๋žญ ๋งคํฌ๋กœ ์ฒ˜๋ฆฌ๊ธฐ

    • -define(Constant, Replacement).

    • -define(Func(V1,...,VN),Replacement).

    • ๋งคํฌ๋กœ ํ˜ธ์ถœ : ?MACRO

    • ๋งคํฌ๋กœ ์† ์ œ์–ด ํ๋ฆ„

       -undef(Macro).
       -ifdef(Macro).
       -ifndef(Macro).
       -else.
       -endif.
      
  • ๋งคํฌ๋กœ๋ฅผ ์ผœ๊ณ  ๋„๋Š” ๋ฐฉ์‹์œผ๋กœ ์ปดํŒŒ์ผ์— ๋ถ€๊ฐ€์ ์ธ ์˜ต์…˜์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  • ํŒจํ„ด์—์„œ์˜ ๋งค์น˜ ์—ฐ์‚ฐ

  • ์ˆซ์ž

  • ์ •์ˆ˜์™€ ๋ถ€๋™ํ˜•์œผ๋กœ ๋‚˜๋‰จ

  • ์ •์ˆ˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ˆ˜์™€ K์ง„๋ฒ•์ˆ˜,$๊ตฌ๋ฌธ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  • ๋ถ€๋™ํ˜•์€ ๋‹ค์„ฏ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰œ๋‹ค. option,์ •์ˆ˜,์†Œ์ˆ˜์ ,์ •์ˆ˜,์„ ํƒ์ ์ธ ์ง€์ˆ˜

  • ์—ฐ์‚ฐ์ž ์ˆœ์œ„ - ์šฐ์„  ์ˆœ์œ„์™€ ๊ฒฐํ•ฉ ๋ฐฉ์‹

  • ์ฑ…์ฐธ์กฐ.

  • ํ”„๋กœ์„ธ์Šค ์‚ฌ์ „

  • ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ๊ฐ€์ง€๋Š” ๊ณ ์œ ํ•œ ๊ฐœ๋ณ„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ.

  • ํ‚ค์™€ ๊ฐ’์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ์—ฐ๊ด€๋ฐฐ์—ด( map or hashmap ๋“ฑ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค ).

  • control BIF

     @spec put(Key,Value) -> OldValue
     @spec get(Key) -> [{Key,Value}].
     @spec get() -> ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ
     @spec get_keys(Value) -> [Key].
     @spec erase(Key) -> Value
     @spec erase() -> [{Key,Value}].
    
  • Side effect ๋ฐœ์ƒ

  • ๋ ˆํผ๋Ÿฐ์Šค - ์œ ์ผํ•œ ์‹ฌ๋ฒŒ *erlang:make_ref()๋กœ ์ƒ์„ฑ *์œ ์ผํ•œ ์ „์—ญ ํ…€.

  • ๋‹จ๋ฝ ๋ถˆ๋ฆฌ์–ธ์‹ - ์™„์ „ํžˆ ํ‰๊ฐ€๋˜์ง€ ์•Š๋Š” ๋ถˆ๋ฆฌ์–ธ ์‹ *Expr1 orelse Expr2 *Expr2 andalso Expr2

  • ํ…€ ๋น„๊ต์™€ ํ…€์˜ ์‚ฌ์ „์  ์ˆœ์„œ

    • number < atom < ref < fun < port < pid < tuple < list < binary
    • =:= , =/=๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ…€ ๋น„๊ต ์—ฐ์‚ฐ์ž์˜ ์ž‘๋™( ์ธ์ˆ˜๊ฐ€ ์ˆซ์ž์ผ ๊ฒฝ์šฐ)
      • ์ •์ˆ˜,๋ถ€๋™ํ˜• ์ผ๊ฒฝ์šฐ ์ •์ˆ˜๋ฅผ ๋ถ€๋™ํ˜•์œผ๋กœ ๋ณ€ํ™˜
      • ๊ฐ™์„ ๊ฒฝ์šฐ ๋ณ€ํ™˜ ์—†์ด ์‚ฌ์šฉ
    • ==์˜ ์‚ฌ์šฉ ์ฃผ์˜. ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” == ๋Š” =:=๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ๋ฐ‘์ค„ ๋ณ€์ˆ˜

    • ์ต๋ช… ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ, ์ •์ƒ์ ์ธ ๋ณ€์ˆ˜์˜ ์ž๋ฆฌ์— VarName๊ฐ™์€ ๊ตฌ๋ฌธ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‹ค๋ฅธ ๋ฐœํ‘œ ์ž๋ฃŒ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ