Erlang學習記錄 三 表示式大集合

2022-02-07 18:24:20 字數 3456 閱讀 1887

erlang中的表示式必須以.結束才會去執行。如果不加.你在編譯環境下按多少次enter,表示式都不會執行,表示式之間可以用,分隔,以.結尾後所有的表示式都會執行,但是只有最後乙個以.結尾的表示式會在編譯器中輸出執行的結果。

任何型別的值都是表示式。如:

1.

3.5.

true.

任何型別的值的計算是表示式。

1.算術表示式

+     正號

-      負號

+     加

-     減

*     乘

/     浮點除

bnot  按位求反  bnot (-12) = 11

div    整除

rem   求餘

band  &

bor    |

bxor  按位異或

bsl    按位左移 2#11 bsl 1 = 2#110.

bsr    按位右移 2#110 bsr 1 = 2#11.

2.boolean表示式

not expr

expr1 and expr2       永遠計算expr2的值

expr1 andalso expr2  如果expr1為false,將不計算expr2

expr1 or expr2         永遠計算expr2的值

expr1 orelse expr2    如果expr1為true,將不計算expr2

expr1 xor expr2        異或

3.list計算

expr1 ++ expr2將expr2加入expr1中

expr1 -- expr2將expr2中的值從expr1中刪除

注意:list計算是右結合的運算子,另外list計算很慢,慎用。

4.運算子的優先順序,從高到低:

:     

#     

unary + - bnot not     

/ * div rem band and

+ - bor bxor bsl bsr or xor

++ --

== /= =< < >= > =:= =/=     

andalso     

orelse     

= !    

catch

值之間的比較是表示式,erlang的比較運算子看起來有些奇怪:

==     ==

/=      !=

=<    <=

<       <

>=     >=

>       >

=:=     ===

=/=     !==

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定義中。

if

guardseq1 ->body1;

...;

guardseqn ->bodyn

end

注意,if表示式必須要獲得乙個匹配,否則會丟擲異常,所以一般可以將true做為最後乙個guard expression。

case expr of

pattern1 [

when guardseq1] ->body1;

...;

patternn [

when guardseqn] ->bodyn

end

與if相比,case更為強大,它不僅能進行條件判斷,還能利用各種模式。case表示式也必須獲得乙個匹配,否則會丟擲異常,所以一般最後用_else做乙個通用匹配。

expr1 ! expr2

erlang的彪悍全體現在這裡了,很簡單,很強大的乙個表示式啊。

這裡的expr1可以是乙個process identifier(進行程序通訊),可以是乙個分布式的位址表示(分布式通訊),也可以是乙個普通的name,總之對於任何一種接收資訊的物件,任何一種資訊,乙個簡單的!就把資訊傳出去了,夠強大吧!

receive

pattern1 [

when guardseq1] ->body1;

...;

patternn [

when guardseqn] ->bodyn

end

形式類似於case表示式,但是receive表示式永遠都不會報錯,當資訊到達時,如果資訊能夠被匹配,將會被處理,並從訊息列表中移除。而接收到其他不匹配的資訊也不會報錯,只是會繼續儲存在訊息列表中。當你呼叫receive時,receive會一直等待,直到乙個能夠匹配其中模式的資訊到達。

為了避免訊息等待時間過長,receive引入了timeout機制:

receive

pattern1 [

when guardseq1] ->body1;

...;

patternn [

when guardseqn] ->bodyn

after

exprt ->bodyt

end

receive將在exprt表示的時間達到後退出,若exprt為infinity則會一直等待。

begin

expr1,

...,

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次或...