erlang中的表示式必須以.結束才會去執行。如果不加.你在編譯環境下按多少次enter,表示式都不會執行,表示式之間可以用,分隔,以.結尾後所有的表示式都會執行,但是只有最後乙個以.結尾的表示式會在編譯器中輸出執行的結果。
任何型別的值都是表示式。如:
1.3.5.
true.
任何型別的值的計算是表示式。
1.算術表示式
+ 正號2.boolean表示式- 負號
+ 加
- 減
* 乘
/ 浮點除
bnot 按位求反 bnot (-12) = 11
div 整除
rem 求餘
band &
bor |
bxor 按位異或
bsl 按位左移 2#11 bsl 1 = 2#110.
bsr 按位右移 2#110 bsr 1 = 2#11.
not expr3.list計算expr1 and expr2 永遠計算expr2的值
expr1 andalso expr2 如果expr1為false,將不計算expr2
expr1 or expr2 永遠計算expr2的值
expr1 orelse expr2 如果expr1為true,將不計算expr2
expr1 xor expr2 異或
expr1 ++ expr2將expr2加入expr1中注意:list計算是右結合的運算子,另外list計算很慢,慎用。expr1 -- expr2將expr2中的值從expr1中刪除
4.運算子的優先順序,從高到低:
:值之間的比較是表示式,erlang的比較運算子看起來有些奇怪:#
unary + - bnot not
/ * div rem band and
+ - bor bxor bsl bsr or xor
++ --
== /= =< < >= > =:= =/=
andalso
orelse
= !
catch
== ==erlang中的精度排序如下:/= !=
=< <=
< <
>= >=
> >
=:= ===
=/= !==
number < atom < reference < fun< port < pid < tuple < list < bit string
當不同型別的值進行比較時,低精度的將轉換為高精度的進行比較。
1.變數必須以大寫字母或下劃線打頭,且能包含數字,下劃線和@
2.乙個變數只能賦值一次。
3._是一種特殊的匿名變數,它可以用在任何需要變數但不需要使用該變數的地方,如下例:
[h|_] = [1,2,3]
這裡我們只需要獲取第乙個item的值,所以後面可以用_
4.以下劃線打頭的變數和以大寫字母打頭的變數並不完全一樣,以下劃線打頭的變數如果不被使用,不會產生warning,而以大寫字母打頭的變數會產生warning。
形如=即為模式匹配,做模式匹配要注意如下幾點:
1.格式要匹配,
=[1,2].將會丟擲異常
2.長度要匹配
=.或=.將會丟擲異常,對於不關注的字段可以用_來匹配,但是長度必須一致。
3.資料要一致
=將丟擲異常,必須用=
不管是直接呼叫函式,還是呼叫函式物件都是表示式。
我們要注意不要定義和bifs一樣的函式,如果必須要定義和bifs一樣的函式。如定義length函式,則需要將-compile().加入module定義中。
ifguardseq1 ->body1;
...;
guardseqn ->bodyn
end
注意,if表示式必須要獲得乙個匹配,否則會丟擲異常,所以一般可以將true做為最後乙個guard expression。
case expr ofpattern1 [
when guardseq1] ->body1;
...;
patternn [
when guardseqn] ->bodyn
end
與if相比,case更為強大,它不僅能進行條件判斷,還能利用各種模式。case表示式也必須獲得乙個匹配,否則會丟擲異常,所以一般最後用_else做乙個通用匹配。
expr1 ! expr2
erlang的彪悍全體現在這裡了,很簡單,很強大的乙個表示式啊。
這裡的expr1可以是乙個process identifier(進行程序通訊),可以是乙個分布式的位址表示(分布式通訊),也可以是乙個普通的name,總之對於任何一種接收資訊的物件,任何一種資訊,乙個簡單的!就把資訊傳出去了,夠強大吧!
receivepattern1 [
when guardseq1] ->body1;
...;
patternn [
when guardseqn] ->bodyn
end
形式類似於case表示式,但是receive表示式永遠都不會報錯,當資訊到達時,如果資訊能夠被匹配,將會被處理,並從訊息列表中移除。而接收到其他不匹配的資訊也不會報錯,只是會繼續儲存在訊息列表中。當你呼叫receive時,receive會一直等待,直到乙個能夠匹配其中模式的資訊到達。
為了避免訊息等待時間過長,receive引入了timeout機制:
receivepattern1 [
when guardseq1] ->body1;
...;
patternn [
when guardseqn] ->bodyn
after
exprt ->bodyt
end
receive將在exprt表示的時間達到後退出,若exprt為infinity則會一直等待。
beginexpr1,
...,
exprn
end
暫時沒覺得這個表示式有啥用。
這個之後介紹啦
Lambda表示式學習記錄
lambda表示式可以簡化c 程式設計的某些方面,用法非常靈活。因此也不容易掌握。下邊是我學lambda表示式的一點記錄。1 lambda表示式是與委託緊密聯絡的。只要有委託引數型別的地方,就可以使用lambda表示式。lambda表示式的運算子是 運算子左邊列舉出了需要的引數,右邊定義了賦予lam...
學習記錄 正規表示式
學習記錄 正規表示式 註明 記錄工作和學習中常用的正規表示式以及php中常用得兩個函式preg match all preg replace 特殊字元類含義.所有字元 d所有數字 d所有非數字 w數字字母下劃線 w非數字字母下劃線 s 換行等空白區域 s非空白區域 1 匹配字元1 1 3 匹配字元1...
學習正規表示式記錄
表1.常用的元字元 說明 匹配除換行符以外的任意字元 w匹配字母或數字或下劃線或漢字 s匹配任意的空白符 d匹配數字 b匹配單詞的開始或結束 匹配字串的開始 匹配字串的結束 1.d 這個是驗證輸入5到12位的數字 2.語法說明 重複零次或更多次 重複一次或更多次 重複零次或一次 重複n次 重複n次或...