Erlang基本語法彙總

系統的學習Erlang可參考:https://www.cnblogs.com/xuan52rock/tag/erlang/shell

 

1、Erlang語法:變量、模式匹配
--------------------------------------
1.elr命令:工具欄toolbar:start().
2.%。。。註釋
3.變量首字母大寫,單一賦值
4.模式匹配
5.原子:hello, 'an atom with'
6.元組tuple:元組嵌套{person,{a,1},{b,2}}
             提取元組字段值Point = {point, 10, 45}  {point, X, Y} = Point
7.列表list:  定義列表ThingsToBuy1 = [{oranges,4}, {newspaper,1}|{ThingsToBuy}]
             提取元素[Buy1|ThingsToBuy2] = ThingsToBuy1.
8.字符串:"hello"
9.q()退出
10.f()釋放變量數據庫


2、Erlang語法:函數(面向函數編程:函數能夠做爲參數,也能夠做爲返回值,可使用列表解析、斷言、case/if、二進制、比特位、進制、ASCII碼)
--------------------------------------
1.函數
  編譯:c(geometry)
  運行:geometry:area({rectangle, 10, 5}).
2.匿名函數:Double = fun(X) -> 2*X end.
         Double(2).
  Hypot = fun(X, Y) -> math:sqrt(X*X+Y*Y) end.
  TempConvert = fun({c,C}) -> {f, 32+C*9/5};
                   ({f,F}) -> {c, (F-32)*5/9}
     end.
3.fun做爲函數參數
  映射:lists:map(Double, [1,2,3,4]).
      返回[2,4,6,8].
  過濾:lists:filter(Even, [1,2,3,4]).
      Even = fun(X) -> (X rem 2) =:= 0 end.
4.返回fun的函數
  Fruit = [apple,pear,orange].
  MakeTest = fun(L) -> (fun(X) -> lists:member(X,L) end) end.
  IsFruit = MakeTest(Fruit).
  即:IsFruit = fun(X) -> lists:member(X,[apple,pear,orange]) end.
5.循環
  for(Max,Max,F) -> [F(Max)];
  for(I,Max,F)   -> [F(I)|for(I+1,Max,F)]
6.列表解析
  [2*X || X <- L].
  定義:Buy = [{oranges,4},{newspaper,1},{apples,10},{pears,6},{milk,3}].
  乘積:[shop:cost(A)*B || {A,B} <- Buy]
  求和:libs:sum([shop:cost(A)*B || {A,B} <- Buy]).
  (1)快速排序:L=[12,6,2,13,2,8,9,10]. qsort(L).
  (2)畢達哥拉斯三元組:libs:pythag(16).
  (3)變位詞:libs:perms("123").
            ["123","132","213","231","312","321"]
7.算術表達式
8.斷言:
  max(X,Y) when X > Y -> X;
  max(X,Y) -> Y.
  斷言函數:
  f(X,Y) when is_integer(X), X > Y, Y < 6 -> X;
9.記錄:record
10.case表達式:
  filter(P, [P|T]) ->
      case P(H) of
          true -> [H|filter(P,T}];
   false ->filter(P,T)
       end;
  filter(P, []) -> [].
11.if表達式:
12.內建函數BIF
  元組轉換爲列表:tuple_to_list({12,cat,"Hello"}).
  系統時間:time()
13.二進制數據:<<5,10,20>>,<<"hello">>
  操縱:list_to_binary()
        term_to_binary()
 binary_to_term()
 size()
14.比特語法:<>
  file:read_file("")
15.動態調用:apply(libs, sum, [1,2,3,4]).
16.模塊定義:-module(modname).
  引入:-import(modname, [fun/1]). 能夠不寫模塊名直接引用函數名
  導出:-export([name1/1, name2/2]).
  編譯屬性:-compile(options).
  模塊版本:-vsn(Version).
  用戶定義屬性:-SomeTag(Value).
  輸出屬性:attr:module_info().
            attr:module_info(attributes).
  引用函數:fun Mod:RemoteFunc/Arity
  包含文件:-include(Filename).
           -include_lib(Name).
  列表操做符:[1,2,3]++[4,5,6]
              [1,2,3]--[2,3]
  進制:K#123
  $語法:$C 表示ASCII
  字典:erase(), put(x, 20),get(x), erase(x)
  短路表達式:Epr1 orelse Epr2.  Epr1 andalse Epr2.編程


3、Erlang語法:編譯運行
--------------------------------------
1.退出:halt().致使數據庫要恢復  q().安全退出,等價於init:stop().
2.取得加載路徑:code:get_path().
  取得主目錄:init:get_argument(home).
3.外部運行:D:/erl>erl.exe -noshell -s hello start -s init stop
4.幫助:help().安全


4、Erlang語法:併發(進程相似於人:經過消息進行溝通,也能夠廣播;沒有共享內存,所以不須要鎖;某一個死掉,會通知連接進程)
--------------------------------------
1.建立進程:Pid = spawn(Fun)
  spawn(Mod, FuncName, Args).
2.發送消息:Pid!Message
  羣發消息:Pid1!Pid2!Pid3...!Pidn!Message
  接收消息:receive ... end.
  例如:Pid = spawn(fun area_server0:loop/0).
        Pid!{rectangle, 6, 10}.
3.自身ID:self().
  Pid!{self(), Message}.
  例如:Pid = spawn(fun area_server1:loop/0).
       area_server1:rpc(Pid, {rectangle, 6, 10}).
4.設置進程數:D:/erl>erl +P 500000
  測試啓動時間:process:max(400000).
5.註冊進程:register(AnAtom, Pid).  註冊進程別名
            unregister(AnAtom).   溢出註冊進程
     whereis(AnAtom) -> Pid | undefined 判斷是否註冊
     registered() -> [AnAtom::atom()] 取得全部註冊進程
  例如註冊時鐘:clock:start(5000, fun() -> io:format("TICK ~p~n", [erlang:now()]) end).
      中止時鐘:clock:stop().
6.併發錯誤:連接進程服務器


5、Erlang語法:分佈式
--------------------------------------
1.單節點測試
啓動服務器:kvs.start().
存儲: kvs:store({location, joe}, "Stockholm").
 kvs:store(weather, raining).
查找: kvs:lookup(weather).
 kvs:lookup({location, joe}).
2.雙節點測試
啓動服務器節點:
 D:/erl>erl -sname gandalf
 Eshell V5.7  (abort with ^G)
 (gandalf@zhongbingliu)1> kvs:start().
 true
 (gandalf@zhongbingliu)2>併發

調用者節點:
 D:/erl>erl -sname bilbo
 Eshell V5.7  (abort with ^G)
 (bilbo@zhongbingliu)1> rpc:call(gandalf@zhongbingliu, kvs, store, [weather, fine]).
 true
 (bilbo@zhongbingliu)2> rpc:call(gandalf@zhongbingliu, kvs, lookup, [weather]).
 {ok,fine}
3.客戶機和服務器位於同一局域網的不一樣機器上
4.客戶機和服務器位於因特網的不一樣機器上:確保4396端口通訊正常,epmd會使用這個端口app


6、Erlang語法:文件
--------------------------------------
1.讀取文件:file:consult("data1.data").
2.讀取一項:{ok, S} = file:open("data1.data", read). //打開
    io:read(S, ''). //讀取一項
    io:get_line(S, ''). //讀取一行
    file:close(S). //關閉
3.查找代碼庫位置:code:which(file).
    d:/erl5.7/lib/kernel-2.13/ebin/file.beam
4.讀取二進制數據:
    file:read_file("data1.data"). //所有讀到內存
    {ok, S} = file:open("data1.data", [read,binary,raw]). //打開
    file:pread(S, 22, 46). //隨機讀取
5.查找文件:lib_find:files
6.寫入文件:{ok, S} = file:open("data2.data", write). //打開
    io:format(S, "~s~n", ["Hello readers"]). //寫入
    file:close(S). //關閉
7.隨機寫入:
    {ok, S} = file:open("data3.data", [raw,write,binary]). //打開
    file:pwrite(S, 10, <<"new">>). //隨機寫入
8.目錄操做:file:list_dir("/"). //文件列表
     file:make_dir("abc"). //建立目錄
     file:del_dir("abc"). //刪除目錄
9.文件屬性:file:read_file_info("data1.data").
10.文件操做:file:copy("data1,data", "/"). //拷貝
            file:delete("data1"). //刪除socket


7、Erlang語法:套接字
--------------------------------------
1.Socket鏈接www:socket:nano_get_url().
2.啓動服務器:server:start_nano_server().
3.編寫客戶端:client:nano_client_eval("list_to_tuple([2+3*4,10+20])").
主動型:非阻塞 服務器接收消息的速度必須快於客戶端發送的速度,不然服務器會由於消息緩衝區塞滿被消息淹沒
被動型:阻塞
混合型:半阻塞分佈式


8、Erlang語法:數據庫
--------------------------------------
1.ETS是內存存儲,速度快
2.DETS是磁盤存儲,可備份
3.建立表:ets:new
 dets:open_file
4.插入:insert(table, X)
5.查找:lookup(table, Key)
6.釋放:dets:close(tableid) etd:delete(tableid)
7.Mnesia數據庫:
  建立表:-record...
  選取全部數據:do(qlc())...
  選取部分列:
  按條件選取:
  關連查詢:
  增長數據:mnesia:write()
  刪除數據:mnesia:delete()
  事務管理:mnesia:transaction(F)
  取消事務:mnesia:abort()
  啓動表查看器:tv:start().函數


9、Erlang語法:OTP
--------------------------------------
1.支持事務:使用異常捕捉進行回滾
2.支持熱代碼替換
3.錯誤日誌
4.警報管理
5.應用程序監視器:appmon:start().


10、Erlang語法:JInterface
--------------------------------------
OptNode 節點,監聽端口 可以啓動多個服務節點,如gurka@sallad.com
Epmd 
OptMbox 默認啓動一個郵箱 收發郵件
Link 監控遠程是否斷掉

 

轉載:https://my.oschina.net/ffs/blog/465402

相關文章
相關標籤/搜索