วันเสาร์ที่ 30 มีนาคม พ.ศ. 2556

พื้นฐานการเขียนโปรแกรมภาษา Erlang ตอนที่ 2

 Atoms and Strings
ความแตกต่างของ Atoms และ Strings
  • atom ทำการประมวลผลได้เฉพาะนำมาเปรียบเทียบกันเอง
  • string ประมวลผลได้หลายแบบ เช่นการนำสตริงมาแยก
ตัวอย่าง
  สตริง "Hello World" สามารถแยกได้เป็น ["Hello","World"] แต่ในกรณีของอะตอม 'Hello World' ไม่สามารถแยกได้
  • เราสามารถใช้สตริงแทนอะตอมในรูปแบบของตัวแปรคงที่แต่ ประสิทธิภาพที่ได้มีความแตกต่างกัน เพราะว่า
     สตริง ใช้พื้นที่เก็บเท่ากับความยาวของข้อความ
     อะตอม ใช้พื้นที่เก็บขนาด 2 ไบต์ในการอ้างอิง
ถ้ามีการเปรียบเทียบ สตริงต้องวิ่งเปรียบเทียบทีละตัวอักษร ส่วนอะตอมเปรียบเทียบในขั้นตอนเดียว
Building and Processing Lists 
  • เราสามารถแยก list ได้ออกเป็นส่วนหัว (head) และหาง (tail) ตราบเท่าที่ลิสต์ไม่ว่า
  • หัวคือส่วนแรกในลิสต์ หางคือลิสต์ที่ภายในประกอบด้วยส่วนที่เหลือ
รูปแบบ
List = [Element|List] หรือ []
ลิสต์แบบ recursive

   หัว     หาง   เขียนได้เป็น
[1,2,3]    1      [2,3]  [1|[2,3]
[1,2,3]    1      [2|[3]]  [1|[2|[3]]]
[1,2,3]    1      [2|[3|[]]] [1|[2|[3|[]]]]
หรือแบ่งหัวให้มีหลายส่วน
[1,2|[3|[]]]
[1,2|[3]]

List Function and Operations 
 List เป็นชนิดข้อมูลที่มีประโยชน์มากที่ต้องใช้ใน Erlang โดยเฉพาะ เมื่อนำมาใช้งานร่วมกันกับ Tuple เพื่อใช้แทนโครงสร้างข้อมูลที่ซับซ้อน
 การดำเนินการหลายๆอย่างเกี่ยวกับลิสต์ถูกกำหนดไว้ใน Module ชื่อ lists การเรียกใช้งานฟังก์ชั่นทำได้โดยมีรูปแบบดังนี้

 ชื่อโมดูล:ชื่อฟังก์ชั่น(พารามิเตอร์).

ตัวอย่างฟังก์ชั่นที่ทำงานกับลิสต์
lists:max([1,2,3]).
lists:reverse([1,2,3]).
lists:sort([1,2,3]).
lists:split(2,[3,4,10,7,9]). ผลลัพธ์ {[3,4],[10,7,9]}
lists:sum([1,2,3,4,5]).
lists:zip([1,2,3],[9,8,7]). ผลลัพธ์ [{1,9},{2,8},{3,7}]
lists:delete(2,[1,2,3,4]).  ผลลัพธ์ [1,3,4]
lists:last([1,2,3]).
lists:member(5,[1,23]).  ผลลัพธ์ false
lists:member(23,[1,23]).  ผลลัพธ์ true
lists:nth(2,[1,25,50,75]).  ผลลัพธ์ 25
length([1,2,3]).    ผลลัพธ์ 3

สำหรับลิสต์ส่วนประกอบภายในลิสต์สามารถเป็นข้อมูลได้หลายชนิด ตัวอย่าง
[a,mixed,"list",{with,4},'data types'].

การใช้ ++,--
  • Right-associative ทำจากขวาไปซ้าย
  • ++ ใช้รวม list สองอันเข้าด้วยกัน เช่น [1,2,3] ++ [7,8,9].
  •  -- นำแต่ละส่วนใน list ด้านขวาที่มีค่าตรง ลบจาก list ด้านซ้าย ถ้ามีส่วนใดๆ ด้านขวาไม่ตรงกับด้านซ้ายไม่สนใจ
ตัวอย่าง
[1,1] -- [1].    ผลลัพธ์ [1]
[1,2,3,4] -- [1,4].  ผลลัพธ์ [2,3]
[1,2] -- [1,1,3].   ผลลัพธ์ [2]
[1,2,3] -- [1,3] -- [1,2]. ทำด้านขวาก่อน
  [1,2,3] -- [3]
   [1,2]

([1,2,3] -- [1,3]) -- [1,2]. ทำในวงเล็บก่อน
  [2] -- [1,2]
   []

กรณีของสตริง
"Hello " "Erlang " "World".
ผลลัพธ์
"Hello Erlang World"

ในการเพิ่ม element ลงในลิสต์ทำได้สองแบบ
  •  โดยตรง […|…] *มีประสิทธิภาพดี
เช่น [1|[2,3]]
  • ใช้ ++ *ประสิทธิภาพด้อย
เช่น [1] ++ [2,3]
นอกจากนั้น Erlang ยังยอมรับการใช้แบบ nonflat strings
["Hello ",["Erlang "]|"World"].
["Hello ",["Erlang "],87,111,114,108,100].
Term Comparison
การนำนิพจน์มาเปรียบเทียบกันผลลัพธ์ที่ได้ Boolean atoms คือ true หรือ false
เครื่องหมายเท่ากัน (==) ไม่เท่ากัน (/=) เปรียบเทียบโดยไม่คำนึงถึงชนิดข้อมูล
1 == one.  ผลลัพธ์  false
one == one.  ผลลัพธ์  true

ตัวเลขจะเปลี่ยนเป็นทศนิยมก่อนเปรียบเทียบ
 1 == 1.0.  ผลลัพธ์  true
 1 /= 1.0.  ผลลัพธ์  false

ถ้าจะเปรียบเทียบว่านิพจน์ทั้งสองเท่ากันที่ไม่จริงๆ ไม่มีการแปลง
 1 =:= 1.0.  ผลลัพธ์  false
 1 =/= 1.  ผลลัพธ์  false

ตัวดำเนินการเปรียบเทียบแบบต่างๆ
 ==  equal to
 /= not equal to
 =:= exactly equal to
 =/= exactly not equal to
 =< less than or equal to
 < less than
 >= greater than or equal to
 > greater than

ในกรณีที่นิพจน์ที่นำมาเปรียบเทียบมีหลายชนิด จะมีลำดับดังนี้
number<atom<reference<function<port<pid<tuple<list<binary

ตัวอย่างคือ ตัวเลขน้อยกว่าอะตอม ทูเพิลน้อยกว่าลิส
 11 < ten.  ผลลัพธ์ true
 {1,2}<[]. ผลลัพธ์ true

การเปรียบเทียบระหว่าง List
สำหรับ list มีการเรียงลำดับตามตัวอักษร ในการเปรียบเทียบ โดยนำส่วนแรกในลิสต์นำมาเปรียบเทียบกัน อันไหนน้อยกว่า ลิสต์นั้นจะเป็นลิสต์ที่มีค่าเล็กกว่า
แต่ถ้าส่วนแรกเหมือนกัน ส่วนที่สองในลิสต์ก็จะนำมาเปรียบเทียบต่อไปเรื่อยๆ จนกว่าจะเปรียบเทียบภายในลิสต์นั้นหมด ถ้าลิสต์ใดหมดก่อน ลิสต์นั้นจะเป็นลิสต์ที่มีค่าเล็กกว่า

[boo,hoo]<[adder,zebra,bee]. ผลลัพธ์ false
[boo,hoo]<[boo,hoo,adder,zebra,bee]. ผลลัพธ์ true

การเปรียบเทียบระหว่าง Tuple
จะเปรียบเทียบจำนวน element ใน tuple ก่อน ตามด้วยเปรียบเทียบค่าในแต่ละส่วนเทียบกัน

{boo,hoo}<{adder,zebra,bee}. ผลลัพธ์ true
{boo,hoo}<{boo,hoo,adder,zebra,bee}. ผลลัพธ์ true
{boo,hoo}<{coo,aoo}. ผลลัพธ์ true
{yoo,hoo}<{coo,aoo}. ผลลัพธ์ false

ไม่มีความคิดเห็น:

แสดงความคิดเห็น