Erlang Term Comparison
การเปรียบเทียบเทิร์มใน Erlang นั้นจะต้องใช้นิพจน์สองตัวโดยจะต้องใส่ไว้ทั้งสองด้านของตัวดำเนินการเปรียบเทียบผลที่ได้จาการเปรียบเทียบคืออะตอมที่เป็นจริงหรือเท็จ โดยที่ตัวดำเนินการ เท่ากับ(==) และ ไม่เท่ากับ(/=) จะทำการเปรียบเทียบค่าของนิพจน์ที่อยู่ทั้งสองข้างโดยไม่สนใจประเภทของนิพจน์นั้น เช่น 1==one ผลเป็นเท็จ, one = one ผลที่ได้คือจริงต่อไป 1 == 1.0 ผลเป็นจริง, 1 /= 1.0 ผลเป็นเท็จเพราะทั้งสองแบบนี้จะมีการแปลงค่าของนิพจน์ก่อนทำการเปรียบเทียบแต่ใน Erlang ยังมีตัวกำเนินการเปรีบยเทียบอีกสองตัวที่น่าสนใจคือ เท่ากันจริง(=:=) ไม่เท่ากันจริง(=/=)  ตัวดำเนินการประเภทนี้จะทำการเปรียบเทียบทั้งค่าและประเภทไปด้วยกันดังนั้นถ้าเราทำแบบเดิมแต่เปลี่ยนตัวดำเนินการ 1 =:= 1.0 และ 1 =/= 1 ผลจะเป็นเท็จทั้งคุ่แต่ 1 =/= 1.0 จะเป็นจริงและนอกจากเราจะเปรียบเทียบการเท่ากันแล้วเรายังเปรียบเทียบเชิงลำดับได้อีกเช่น มากกว่า(>) น้อยกว่า(<) มากกว่าหรือเท่ากับ(>=) น้อยกว่าหรือเท่ากับ(<=)
สรุปเครื่องหมาย
== 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
สำหรับการเปรียบเทียบนิพจน์ใน Erlang นั้นมีลำดับขั้นในการพิจรณาดังนี้(ในกรณีที่นิพจน์ทั้งสองเป็นประเภทที่แตกต่างกัน)

number < atom < reference < fun < port < pid < tuple < list < binary

จากหลักการเปรียบเทียบข้างบนจะเห็นได้ว่าตัวเลขจะเล็กกว่าอะตอม และทัปเปิลจะเล็กว่าลิสท์

3> 11
true
4> {123,345}<[].
true

การเปรียบเทียบลิสท์จะใช้วิธีการเปรียบเทียบไปทีละอิลิเมนท์ เปรียบเทียบไปเรื่อยๆจนกว่าด้านใดด้านหนึ่งจะหมดก็ถือว่าด้านนั้นน้อยกว่า
5> [boo,hoo]<[adder,zebra,bee].
false
6> [boo,hoo]<[boo,hoo,adder,zebra,bee].
true
ในทางกลับกันสำหรับทัปเปิลนั้นจะใช้วิธีการนับจำนวนสมาชิกของแต่ละทัปเปิลก่อนแล้วตามมาด้วยค่าของสมาชิกแต่ละตัว
7> {boo,hoo}<{adder,zebra,bee}.
true
8> {boo,hoo}<{boo,hoo,adder,zebra,bee}.
true

และด้วยความสามารถในการเปรียบเทียบค่าของข้อมูลหลายๆประเภททำให้เราสามารถเขียนฟังก์ชั่นเช่นฟังก์ชั่นสำหรับการเรียงลำดับสมาชิกของลิสท์ที่สมาชิกแต่ละตัวมีประเภทที่แตกต่างกันได้โดยไม่ต้องกังวลเรื่องของการแปลงค่าต่างๆเหล่านั้นเลยอย่างไรก็ตามการใช้ตัวดำเนินการ เท่ากันจริง และ ไม่เท่ากันจริง นั้นจำเป็นต้องเตรียมข้อมูลเพิ่มเติมให้กับคอมไพล์เลอร์และเครื่องมือสำหรับจัดการกับไทป์ ทำให้เราต้องเขียนโค้ดอย่างระมัดระวังขื้น  นอกจากนี้ในบางกรณีโค้ดเราจะดูน่าเกลียดอย่างมากทำให้ในทางปฎิบัติแล้วเราควรจะใช้ตัวดำเนินการเท่ากับและไม่เท่ากับเท่านั้น จากนั้นเรามาลองเปิด Erlang Shellขึ้นมาเพื่อทดสอบตัวดำเนินการเปรียบเทียบดูว่าจะเป็นอย่างไร

1> 1.0 == 1.
true
2> 1.0 =:= 1.
false
3> {1,2} < [1,2].
true
4> 1 =< 1.2.
true
5> 1 =/= 1.0.
true
6> (1 < 2) < 3.
false
7> (1 > 2) == false.
true

Erlang Variables
ตัวแปรถูกใช้สำหรับเก็บค่าต่างๆ สำหรับ Erlang แล้วตัวแปรนั้นจะขึ้นต้นด้วยอักษรตัวใหญ่ และอาจตามด้วยตัวอักษรตัวใหญ่หรือเล็ก ตัวเลข เครื่องหมาย _ แต่ไม่สามารถใช้อักขระพิเศษได้ยกตัวอย่างการประกาศตัวแปรกตามมาตรฐาน A_long_variable_name Flag Name2 DbgFlag แต่สำหรับตัวแปรใน Erlang นั้นจะแตกต่างจากภาษาโปรแรมมิ่งที่เราคุ้นเคยกัน โดยในสโคปของฟังก์ชั่น ที่รวมไปถึงเอิร์ลแลงเชลโพรเซส นั้นเมื่อเรากำหนดค่าให้ตัวแปรแล้วเราจะไม่สามารถเปลี่ยนค่ามันได้อีก เราเรียกกระบวนการนี้ว่าการกำหนดค่าเพียงครั้งเดียว(single assignment)
ยกตัวอย่างเช่น

Double = 2,
Double = Double * Double

ผลที่ได้คือจะเกิดเออร์เร่อขณะรันไทม์เนื่องจากเราได้กำหนดค่าให้ Double เป้น 2 ไปก่อนที่จะพยายามกำหนดให้เท่ากับ Double*Double ทางแก้คือเราต้องสร้างตัวแปรตัวใหม่ขึ้นมาเพื่อรับค่า Double*Double แทนดังนี้

Double = 2,
NewDouble = Double * Double
การกำหนดค่าครั้งเดียวนั้นอาจเป็นเรื่องแปลกสำหรับคนทั่วไปในครั้งแรกๆแต่อย่างไรก็ตาม หลังจากใช้ไปสักพักก็จะเริ่มปรับตัวเข้าหาการทำงานแบบนี้ได้ ข้อดีข้อแรกของการทำแบบนี้คือมันช่วยลดข้อผิดพลาดในการเขียนโปรแกรมลงได้เยอะมาก เนื่องจากค่าของตัวแปรไม่ถูกเปลี่ยนไปเปลี่ยนมาเรื่อยๆนั่นเอง

การเรียกฟังก์ชันต่างๆใน Erlang จะทำผ่านค่า(by value)เสมอพารามิเตอร์ทุกตัวที่ถูกส่งไปให้ฟังก์ชั่นจะถุกตรวจสอบก่อนเสมอก่อนที่ตัวฟังก์ชั่นจะทำงาน อีกข้อที่สำคัญคือตัวแปรทุกตัวใน Erlang เป็นตัวแปรโลคอลดังนั้นตัวแปรแบบโกลบอลจะไม่มีในเอิร์ลแลง นั่นเป็นอีกข้อที่ช่วยให้เราทำงานได้ง่ายขึ้น

คุณสมบัติอีกข้อที่สำคัญคือเราไม่มีความจำเป็นต้องประกาศตัวแปรก่อนที่จะใช้งานมัน ดังนั้นนี่เป็นอีกแนวคิดที่ทำให้คนที่เคยเขียน C หรือ Java มาก่อนอาจะสับสนได้ สาเหตุที่ทำให้เอิร์ลแลงไม่มีเช่นนั้นเพราะเอิร์ลแลงเป็นภาษาไดนามิกส์ ประเภทของข้อมูลจะถูกกำหนดขณะทำงาน ดังนั้นจึงมีความเป็นไปได้ที่เราจะทำอะไรแปลกๆเช่นพยายามคูณตัวเลขกับตัวอักษร
 
Var = one,
Double = Var * 2
ดังนั้นข้อควรจำที่ควรคิดไว้เสมอคือตัวแปรถูกกำหนดค่าได้ครั้งเดียว ดังนั้นปัญหาอาจเกิดขึ้นในเอิร์ลแลงเชลได้เพราะโปรแกรมของเราอาจต้องทำงานอย่างต่อเนื่องไปเรื่อยๆเป็นปีๆและเราใช้เชลเพียงเชลเพียงเชลเดียวในการทำงานร่วใกบโปรแกรมนั้น ทำให้บางครั้งเราอาจทดลองอะไรบางอย่างขณะที่โปรแกรมก็ยังคงทำงานอยู่ ซึ่งอาจก่อให้เกิดปัญหาได้แต่ปะญหานี้สามารถแก้ไขได้ด้วยการใช้ f() เพื่อสั่งให้เชลลืมการกำหนดค่าของตัวแปรนั้นๆไปชั่วขณะเพื่อหลีกเลี่ยงปัญหาขณะที่เรากำลังทดลองอะไรบางอย่างอยู่เช่น

1> A = (1+2)*3.
9
2> A + A.
18
3> B = A + 1.
10
4> A = A + 1.
** exception error: no match of right hand side value 10
5> f(A).
ok
6> A.
** 1: variable 'A' is unbound **

edit @ 15 Dec 2009 11:06:08 by cyber-climber

edit @ 16 Dec 2009 18:18:04 by Rational Roof

Comment

Comment:

Tweet

I just added your site to my favorites. I really enjoy reading your posts. Thanks!

#7 By order-essay.com (50.97.184.210) on 2013-07-24 01:18

Wow, superb data referring to this topic. Will please inform me how long time that would take? Just because I gonna complete the writing thesis or may be this will be good to notice the thesis writing service. Thank you so much.

#6 By dissertation writing (103.7.57.18|31.184.238.21) on 2012-05-22 05:17

With your help only students know just about dissertation service! Thus they buy the the best thesis summary just about this post from the buy thesis service.

#5 By dissertation writing (91.212.226.143) on 2011-11-19 18:03

You accomplished really great idea about this post and I buy essays about it. Thank you!

#4 By TamikaBarnett (193.105.210.41) on 2011-11-15 20:06

Excellent & remarkable post! I have been visiting various blogs for my term papers writing research . I have found your blog to be quite useful. Keep updating your blog with valuable information......Regards

#3 By Term Papers Writing (59.103.192.65) on 2010-09-27 18:53

ต้องแรกอ่านข้ามบทนี้ไป เพราะคิดว่าไม่มีอะไร เล่นเอางงเต๊ก มัน Error อะไร T_T นี่สินะที่เค้าบอกว่าไม่ควรเล่นทางลัด ^ ^

#2 By nuboat (180.210.216.68) on 2010-01-10 20:21

เอาคนละ type มาเทียบกันได้นี่ งง จริงๆครับถ้าเจอโค้ดจริงๆคงแกะลำบากแน่ๆเลย

#1 By iporsut (58.9.56.248) on 2009-12-11 16:15