繼續前面說清單。
清單裡面的元素,第一個成為head,head之後的都叫tail。用erlang的内置方法看一下:
> hd([1,2,3,4]).
1
> tl([1,2,3,4]).
[2,3,4]
為什麼要這樣呢?因為清單的指針是在頭部的,對頭部進行操作是最快捷和高效的。
使用豎線| 能快速區分頭部和尾部:
> [H|T]=[1,2,3,4].
[1,2,3,4]
> H.
1
豎線運算符還能把兩個清單連在一起:
> L = [3,3,4].
[3,3,4]
> LL = [1,1,1|L].
[1,1,1,3,3,4]
不過豎線後面必須是一個清單:
> [66,77|88].
[66,77|88]
> [66,77|[88]].
"BMX"
六,清單推導
和python一樣,erlang也有清單推導式List comprehensives。
這個文法比較簡單,我們看幾個例子:
> [2*N || N <- [1,2,3,4]].
[2,4,6,8]
> [X+Y || X <- [1,2], Y <- [2,3]].
[3,4,4,5]
> Weather = [{toronto, rain}, {montreal, storms}, {london, fog}, {paris, sun}, {boston, fog}, {vancouver, snow}].
[{toronto,rain},
{montreal,storms},
{london,fog},
{paris,sun},
{boston,fog},
{vancouver,snow}]
> FoggyPlaces = [X || {X, fog} <- Weather].
[london,boston]
七,二進制
erlang對二進制的操作也提供了一些方法。
比特是由兩個小于号和兩個大于号包裝的<<>>,每個元素包含一個冒号,元素間用逗号分開:
> Color = 16#F09A29.
15768105
> Pixel = <<Color:24>>.
<<240,154,41>>
比特也滿足模式比對:
> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<Pix1,Pix2,Pix3,Pix4>> = Pixels.
** exception error: no match of right hand side value <<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<Pix1:24, Pix2:24, Pix3:24, Pix4:24>> = Pixels.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> <<R:8, G:8, B:8>> = <<Pix1:24>>.
<<213,45,132>>
> R.
213
這裡暫不介紹二進制的左移和右移,以及位操作。
八,二進制推導
二進制文法也有推導式,我們簡單看幾個例子:
> [ X || <<X>> <= <<1,2,3,4,5>>, X rem 2 == 0].
[2,4]
> Pixels = <<213,45,132,64,76,32,76,0,0,234,32,15>>.
<<213,45,132,64,76,32,76,0,0,234,32,15>>
> RGB = [ {R,G,B} || <<R:8,G:8,B:8>> <= Pixels ].
[{213,45,132},{64,76,32},{76,0,0},{234,32,15}]
OK,就先這些吧。