วันพุธที่ 17 เมษายน พ.ศ. 2556

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

Variables
  • ตัวแปรใช้เก็บค่าพื้นฐานใน Erlang
  • ขึ้นต้นด้วยตัวพิมพ์ใหญ่ ตามด้วยตัวพิมพ์ใหญ่หรือเล็ก ตัวเลข และขีดล่าง (_ underscore) โดยไม่มีอักษรพิเศษอื่นๆ
ตัวอย่าง
A_Long_Variable_Name
Vname
T2animation
Db2Connect


  • ตัวแปรเมื่อมีการผูกค่าแล้ว เปลี่ยนแปลงค่าไม่ได้ (single assignment)
  • ถ้าต้องการประมวลผลลัพธ์จากตัวแปร ต้องสร้างตัวแปรใหม่มาเก็บผลลัพธ์
Ten = 2,
Result = Ten*Ten.


  • การเรียกตัวแปรใน Erlang เป็นแบบ Call by value
  • อากิวเมนต์ที่จะผ่านเข้าสู่ฟังก์ชั่น จะต้องมีการผูกค่า ก่อนที่ฟังก์ชั่นจะทำการประมวลผล
  • ใน Erlang ไม่มีการเรียกแบบอ้างอิง Call by reference does not exist
  • ตัวแปรเป็นแบบ local อยู่กับฟังก์ชั่นที่มันอยู่
  • ไม่มีตัวแปรแบบ Global ใน Erlang
  • ตัวแปรไม่ต้องประกาศก่อน ใช้เมื่อต้องการใช้มัน
  • ตัวแปรใน Erlang เป็นแบบ dynamic type system (Erlang type system)
  • ตัวแปรที่ถูกค่าแล้วสามารถยกเลิกการผูกค่าโดยใช้ฟังก์ชั่น f() มีรูปแบบคือ f(Variable).


Complex data structures
การสร้างโครงสร้างข้อมูลที่ซับซ้อนใน Erlang เราจะใช้ list และ tuple ร่วมกัน
ตัวอย่าง
[{person,"Fox","Fury",
[{age,26},
{pet,{cat,redy},{dog,daisy}}]
 },
 {person,"devil","mangi",
[{age,27},
{pet,{fish,goldy},{bird,finale}}]
 }]


หรือเขียนแยกแล้วนำมาประกอบกัน
FoxAttList = [{age,26},{pets,{cat,redy},{dog,daisy}}].
FoxTuple = {person,"Fox","Fury",FoxAttList}.


Pattern Matching
การทำจับคู่รูปแบบใน Erlang นั้นกระทำเพื่อ
-    จับคู่เพื่อผูกค่าให้ตัวแปร
-    ควบคุมโฟลการทำงานโปรแกรม
-    แยกข้อมูลที่ผสมกันอยู่
รูปแบบการใช้
Pattern = Expression

โดยที่
Pattern นั้นประกอบด้วยโครงสร้างข้อมูล ซึ่งเป็นได้ทั้ง

  • ตัวแปรที่ถูกผูกค่าไว้แล้ว หรือตัวแปรที่ยังไม่ได้ผูกค่า
  • ค่าตามตัว (atom,integer,string)
Expression ประกอบด้วยโครงสร้างที่
  • ตัวแปรถูกผูกค่า
  • การดำเนินการทางคณิตศาสตร์
  • การเรียกฟังก์ชั่น
  • ไม่มีตัวแปรที่ไม่ถูกผูกค่า
หลังจากการทำการจับคู่แล้ว ผลลัพธ์ที่จะเกิดขึ้นคือ
  • จับคู่สำเร็จ
ผลลัพธ์ถูกผูกกับตัวแปรคืนค่าผลลัพธ์จากนิพจน์
  • จับคู่ไม่สำเร็จ
ไม่มีตัวแปรใดถูกผูกค่า

เงื่อนไขการจะจับคู่ให้สำเร็จ
  • expression กับ pattern มีรูปแบบเดียวกัน
  • ค่าตามตัว ใน pattern มีค่าเท่ากัน ตรงตำแหน่งกับใน expression
  • ตัวแปรที่ไม่ได้ผูกค่า จะถูกผูกค่ากับผลลัพธ์ที่ได้จาก expression
  • ตัวแปรที่ถูกผูกค่า ต้องมีค่าเดียวกับค่าที่ได้จาก expression

ตัวอย่าง
    Sum = 1+8.
นิพจน์ 1+8 ถูกคำนวณ ผลลัพธ์จับคู่กับตัวแปร Sum ถ้าตัวแปรยังไม่ถูกผูกค่า Sum จะถูกผูกค่ากับผลลัพธ์ที่ได้จากการคำนวณ กระบวนการจับคู่สำเร็จ
ในกรณีที่ Sum มีการผูกค่าไว้ก่อนแล้ว การจับคู่จะสำเร็จได้ ถ้า Sum ได้ถูกผูกค่ากับ 9 ไว้ก่อนแล้ว



ตัวอย่างการจับคู่
1> Sum = 1+8.
9
2> Sum = 10.
** exception error: no match of right hand side value 10
3> Sum = 9.
9
4>


ตัวอย่างการจับคู่ของลิสต์
1> List = [1,2,3,4].    ผูกค่าตัวแปร List
[1,2,3,4]
2> [Head|Tail] = List.        ผูกค่าตาม Pattern
[1,2,3,4]
3> Head.
1
4> Tail.
[2,3,4]
5> [Head|Tail] = [1].    จับคู่ไม่ได้ ค่าไม่เหมือนกัน
** exception error: no match of right hand side value [1]
6> [Head|Tail] = [1,2,3,4].
[1,2,3,4]
7> [Head1|Tail1] = [1].     
[1]
8> Head1.
1
9> Tail1.
[]
10> List = [Head1|Tail].    จับคู่ได้ มีรูปแบบตรงกันและค่าภายในตรงกัน
[1,2,3,4]
11>


ตัวอย่างการจับคู่ของทูเพิล
1> {Element,Element,X,Y} = {1,1,2,3}.
{1,1,2,3}
2> Element.
1
3> X.
2
4> Y.
3
5> {Element,Element,X,Y} = {1,2,2,3}.
** exception error: no match of right hand side value {1,2,2,3}
6> {Element,_,X,Y} = {1,2,2,3}.     
{1,2,2,3}
7> {person,Name,LastName} = {person,"Devil","Mangi"}.
{person,"Devil","Mangi"}
8>


ในกรณีที่เราไม่ต้องการผูกค่าที่ตำแหน่งใดๆ เราสามารถใช้เครื่องหมายขีดล่าง (_) แทนตรงตำแหน่งนั้น ซึ่งเป็นการทำ wildcard นั่นเอง

สรุปคร่าวๆเกี่ยวกับการจับคู่ใน Erlang
กรณีที่ 1
X = [1,2,3].
 X ไม่เคยผูกค่ามาก่อน จะถูกผูกค่ากับค่าทางด้านซ้ายมือ
กรณีที่ 2
X = [1,2,3].
X ถูกผูกค่ามาก่อนแล้ว จะทำการเปรียบเทียบเพื่อจับคู่ มีผลลัพธ์เกิดได้ก็คือ จับคู่สำเร็จ และไม่สำเร็จ
กรณีที่ 3
X = [0]++[1,2,3].
X ถูกผูกค่ามาก่อนแล้ว ทำการประมวลนิพจน์ด้านซ้ายมือ แล้วทำการเปรียบเทียบเพื่อจับคู่ มีผลลัพธ์เกิดได้ก็คือ จับคู่สำเร็จ และไม่สำเร็จ

ตัวอย่างการจับคู่ และผลลัพธ์ที่ได้
กรณีจับคู่ไม่สำเร็จ
{A,A,B} = {abc,def,123}.
ขนาดทูเปิลเท่ากัน A ผูกกับอะตอม abc    แต่เมื่อ A ได้ผูกกับ abc แล้วเมื่อนำมาจับคู่กับ def ส่งผลให้เกิดข้อผิดพลาดขึ้น

[A,B,C,D] = [1,2,3].
จับคู่ไม่ได้เพราะจำนวน element ในลิสมีไม่เท่ากัน

กรณีจับคู่สำเร็จ
[A,B,C|D] = [1,2,3].
จับคู่ได้เพราะจำนวน element ในลิสมีเท่ากัน โดย D ถูกผูกกับลิสว่าง []

[A,B|C] = [1,2,3,4,5,6].
A จับคู่กับ 1 และ B จับกับ 2 สุดท้าย C จับคู่กับลิสที่เหลือ [3,4,5,6]

การจับคู่เพื่อแยกค่าจากข้อมูลที่ผสมกันอยู่
{A,_,[B|_],{B}} = {abc,23,[22,23],{22}}.
A จับคู่กับ abc และ B จับคู่กับ 22 โดยใช้การทำ Wildcard เพื่อยกเว้นค่าที่ไม่ต้องการจับคู่

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

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