เก่งโค้ดงาน Business Intelligence ตอนที่ 4

เก่งโค้ดงาน Business Intelligence ตอนที่ 4
การอ้างถึงฟิลด์
ถ้าเปรียบเรคคอร์ดเป็นตารางในฐานข้อมูล ฟิลด์ก็คือคอลัมน์ต่าง ๆ การดึงข้อมูลจากตารางในภาษา SQL เราใช้คำสั่ง select ภาษาเอ็มก็มีตาราง (table) ที่จะพูดถึงในหัวข้อต่อไป ส่วนในหัวข้อนี้เป็นการดึงข้อมูลจากเรคคอร์เฉพาะบางฟิลด์ที่กำหนด เราใช้วิธีเขียนคำสั่งซึ่งมีซินแท็กซ์ดังนี้
x[y] // x คือชื่อของเรคคอร์ด y คือชื่อฟิลด์ วิธีนี้เรียกว่า Required Field Selection (RFS)
ถ้าในเรคคอร์ด x มีฟิลด์ชื่อ y อยู่จริงเราจะได้ผลลัพธ์เป็นค่าของ y แต่ถ้าไม่มีฟิลด์ชื่อนี้ จะเกิดเออเรอร์
x[y]? // x คือชื่อของเรคคอร์ด y คือชื่อฟิลด์ วิธีนี้เรียกว่า Optional Field Selection (OFS)
ถ้าในเรคคอร์ด x มีฟิลด์ชื่อ y อยู่จริงเราจะได้ผลลัพธ์เป็นค่าของ y แต่ถ้าไม่มีฟิลด์ชื่อนี้ จะได้ค่าเป็น null
ยกตัวอย่างเช่น รูปที่ 1
บรรทัด 3 คือการอ้างถึงฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 4 คือการอ้างถึงฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 5 เป็นการอ้างถึงฟิลด์แบบ OFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
บรรทัด 3 คือการอ้างถึงฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 4 คือการอ้างถึงฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 5 เป็นการอ้างถึงฟิลด์แบบ OFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
เราสามารถดึงข้อมูลโดยอ้างถึงครั้งละหลาย ๆ ฟิลด์โดยการอ้างถึงแบบ RFS และ OFS ได้เช่นกัน มีซินแท็กซ์ดังนี้
x[[y1],[y2],…] // อ้างแบบ RFS x คือชื่อของเรคคอร์ด y1 และ y2 คือชื่อฟิลด์
x[[y1],[y2],…]? // อ้างแบบ OFS x คือชื่อของเรคคอร์ด y1 และ y2 คือชื่อฟิลด์
เราเขียนรายชื่อฟิลด์โดยใส่ชื่อฟิลด์ที่ต้องการไว้ในวงเล็บเหลี่ยม ตามด้วยเครื่องหมายลูกน้ำ เครื่องหมาย ... หมายถึงจะใส่รายการฟิลด์เข้าไปอีกกี่อันก็ได้ แต่รายการทั้งหมดต้องอยู่ภายในวงเล็บเหลี่ยมอีกชั้นหนึ่ง
ยกตัวอย่างเช่น รูปที่ 1
บรรทัด 7 คือการอ้างถึงรายการฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 8 เป็นการอ้างรายการฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 9 เป็นการอ้างถึงรายการฟิลด์แบบ OFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2 แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
บรรทัด 7 คือการอ้างถึงรายการฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 8 เป็นการอ้างรายการฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 9 เป็นการอ้างถึงรายการฟิลด์แบบ OFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2 แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
การเขียนอ้างชื่อฟิลด์เดี่ยว ๆ ทั้งแบบ RFS และ OFS ถ้าเขียนเต็ม ๆ จะเป็นอย่างที่เห็นในบรรทัดที่ 12 แต่เราอาจเขียนย่อได้อย่างบรรทัดที่ 11 ซึ่งให้ผลลัพธ์เหมือนกัน ยกตัวอย่างคำสั่งเต็มบรรทัดอย่างที่เห็นในบรรทัดที่ 14
การเขียนอ้างชื่อฟิลด์หลาย ๆ ฟิลด์ ทั้งแบบ RFS และ OFS ถ้าเขียนเต็ม ๆ จะเป็นอย่างที่เห็นในบรรทัดที่ 16 แต่เราอาจเขียนย่อได้อย่างบรรทัดที่ 15 ซึ่งให้ผลลัพธ์เหมือนกัน ยกตัวอย่างคำสั่งเต็มบรรทัดอย่างที่เห็นในบรรทัดที่ 14
การเขียนแบบย่อช่วยให้อ่านโค้ดได้ง่ายขึ้นโดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับคำสั่ง each ยกตัวอย่างเช่นบรรทัด 21 คือโค้ดเพื่อคิวรีข้อมูลจากเรคคอร์ดโดยเอาเฉพาะแถวข้อมูลที่ a กับ b มีค่าเท่ากัน นี่เป็นการเขียนแบบไม่ย่อ ซึ่งดูเข้าใจยาก บรรทัด 18 คือบรรทัดคำสั่งที่ให้ผลลัพธ์การทำงานอย่างเดียวกันแต่เขียนแบบย่อและใช่ร่วมกับคำสั่ง each จะเห็นว่าโค้ดอ่านเข้าใจได้ง่ายกว่า
เมื่อเราอ้างถึงฟิลด์ใดฟิลด์นั้นจะถูกประเมินค่า ส่วนฟิลด์อื่น ๆ ที่ไม่ได้อ้างถึงจะไม่ทำงาน ยกตัวอย่างเช่นบรรทัด 24 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A และ C ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์ บรรทัด 25 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์ แต่ฟิลด์ B ถูกประเมินค่าและเรากำหนดให้เป็น error จึงเกิดเออเรอร์เฉพาะฟิลด์ B เพียงฟิลด์เดียวเท่านั้น
ถ้าเปรียบเรคคอร์ดเป็นตารางในฐานข้อมูล ฟิลด์ก็คือคอลัมน์ต่าง ๆ การดึงข้อมูลจากตารางในภาษา SQL เราใช้คำสั่ง select ภาษาเอ็มก็มีตาราง (table) ที่จะพูดถึงในหัวข้อต่อไป ส่วนในหัวข้อนี้เป็นการดึงข้อมูลจากเรคคอร์เฉพาะบางฟิลด์ที่กำหนด เราใช้วิธีเขียนคำสั่งซึ่งมีซินแท็กซ์ดังนี้
x[y] // x คือชื่อของเรคคอร์ด y คือชื่อฟิลด์ วิธีนี้เรียกว่า Required Field Selection (RFS)
ถ้าในเรคคอร์ด x มีฟิลด์ชื่อ y อยู่จริงเราจะได้ผลลัพธ์เป็นค่าของ y แต่ถ้าไม่มีฟิลด์ชื่อนี้ จะเกิดเออเรอร์
x[y]? // x คือชื่อของเรคคอร์ด y คือชื่อฟิลด์ วิธีนี้เรียกว่า Optional Field Selection (OFS)
ถ้าในเรคคอร์ด x มีฟิลด์ชื่อ y อยู่จริงเราจะได้ผลลัพธ์เป็นค่าของ y แต่ถ้าไม่มีฟิลด์ชื่อนี้ จะได้ค่าเป็น null
ยกตัวอย่างเช่น รูปที่ 1
บรรทัด 3 คือการอ้างถึงฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 4 คือการอ้างถึงฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 5 เป็นการอ้างถึงฟิลด์แบบ OFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
บรรทัด 3 คือการอ้างถึงฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 4 คือการอ้างถึงฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 5 เป็นการอ้างถึงฟิลด์แบบ OFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
เราสามารถดึงข้อมูลโดยอ้างถึงครั้งละหลาย ๆ ฟิลด์โดยการอ้างถึงแบบ RFS และ OFS ได้เช่นกัน มีซินแท็กซ์ดังนี้
x[[y1],[y2],…] // อ้างแบบ RFS x คือชื่อของเรคคอร์ด y1 และ y2 คือชื่อฟิลด์
x[[y1],[y2],…]? // อ้างแบบ OFS x คือชื่อของเรคคอร์ด y1 และ y2 คือชื่อฟิลด์
เราเขียนรายชื่อฟิลด์โดยใส่ชื่อฟิลด์ที่ต้องการไว้ในวงเล็บเหลี่ยม ตามด้วยเครื่องหมายลูกน้ำ เครื่องหมาย ... หมายถึงจะใส่รายการฟิลด์เข้าไปอีกกี่อันก็ได้ แต่รายการทั้งหมดต้องอยู่ภายในวงเล็บเหลี่ยมอีกชั้นหนึ่ง
ยกตัวอย่างเช่น รูปที่ 1
บรรทัด 7 คือการอ้างถึงรายการฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 8 เป็นการอ้างรายการฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 9 เป็นการอ้างถึงรายการฟิลด์แบบ OFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2 แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
บรรทัด 7 คือการอ้างถึงรายการฟิลด์แบบ RFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2
บรรทัด 8 เป็นการอ้างรายการฟิลด์แบบ RFS แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริงจึงเกิดเออเรอร์
บรรทัด 9 เป็นการอ้างถึงรายการฟิลด์แบบ OFS เนื่องจากฟิลด์ B มีอยู่จริงจึงได้ผลลัพธ์เป็น 2 แต่เนื่องจากฟิลด์ C ไม่มีอยู่จริง จึงได้ผลลัพธ์เป็นค่านัล
การเขียนอ้างชื่อฟิลด์เดี่ยว ๆ ทั้งแบบ RFS และ OFS ถ้าเขียนเต็ม ๆ จะเป็นอย่างที่เห็นในบรรทัดที่ 12 แต่เราอาจเขียนย่อได้อย่างบรรทัดที่ 11 ซึ่งให้ผลลัพธ์เหมือนกัน ยกตัวอย่างคำสั่งเต็มบรรทัดอย่างที่เห็นในบรรทัดที่ 14
การเขียนอ้างชื่อฟิลด์หลาย ๆ ฟิลด์ ทั้งแบบ RFS และ OFS ถ้าเขียนเต็ม ๆ จะเป็นอย่างที่เห็นในบรรทัดที่ 16 แต่เราอาจเขียนย่อได้อย่างบรรทัดที่ 15 ซึ่งให้ผลลัพธ์เหมือนกัน ยกตัวอย่างคำสั่งเต็มบรรทัดอย่างที่เห็นในบรรทัดที่ 14
การเขียนแบบย่อช่วยให้อ่านโค้ดได้ง่ายขึ้นโดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับคำสั่ง each ยกตัวอย่างเช่นบรรทัด 21 คือโค้ดเพื่อคิวรีข้อมูลจากเรคคอร์ดโดยเอาเฉพาะแถวข้อมูลที่ a กับ b มีค่าเท่ากัน นี่เป็นการเขียนแบบไม่ย่อ ซึ่งดูเข้าใจยาก บรรทัด 18 คือบรรทัดคำสั่งที่ให้ผลลัพธ์การทำงานอย่างเดียวกันแต่เขียนแบบย่อและใช่ร่วมกับคำสั่ง each จะเห็นว่าโค้ดอ่านเข้าใจได้ง่ายกว่า
เมื่อเราอ้างถึงฟิลด์ใดฟิลด์นั้นจะถูกประเมินค่า ส่วนฟิลด์อื่น ๆ ที่ไม่ได้อ้างถึงจะไม่ทำงาน
ยกตัวอย่างเช่นบรรทัด 24 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A และ C ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์
บรรทัด 25 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์ แต่ฟิลด์ B ถูกประเมินค่าและเรากำหนดให้เป็น error จึงเกิดเออเรอร์เฉพาะฟิลด์ B เพียงฟิลด์เดียวเท่านั้น
ยกตัวอย่างเช่นบรรทัด 24 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A และ C ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์
บรรทัด 25 เราอ้างถึงฟิลด์ B เพียงฟิลด์เดียว ฟิลด์ A ไม่ได้ถูกประเมินค่าจึงไม่เกิดเออเรอร์ แต่ฟิลด์ B ถูกประเมินค่าและเรากำหนดให้เป็น error จึงเกิดเออเรอร์เฉพาะฟิลด์ B เพียงฟิลด์เดียวเท่านั้น
ตัวกระทำ meta
เมตาดาต้าก็เป็นเรคคอร์ดชนิดหนึ่ง การอ้างถึงเมตาดาต้าจึงมีซินแท็กซ์คล้ายการอ้างฟิลด์ในหัวข้อที่ผ่านมาแต่แทรกตัวกระทำ meta ไว้ตรงกลางอย่างที่เห็นในรูปที่ 2 บรรทัด 9 x คือตัวข้อมูล y คือเรคคอร์ด, meta คือ “ตัวกระทำ” ซึ่งทำหน้าที่ระบุว่าเรากำลังอ้างถึงเมตาดาต้า (ไม่ใช่ตัวข้อมูล)
ยกตัวอย่างคำสั่งเต็ม ๆ
บรรทัด 3 ทำหน้าที่กำหนดให้ข้อความ "Mozart" มีเมตาดาต้าหนึ่งเรคคอร์ดชื่อ Rating และกำหนดหนดให้มีค่าเท่ากับห้า
บรรทัด 6 แสดงวิธีอ้างถึงเรคคอร์ดนี้
บรรทัด 3 ทำหน้าที่กำหนดให้ข้อความ "Mozart" มีเมตาดาต้าหนึ่งเรคคอร์ดชื่อ Rating และกำหนดหนดให้มีค่าเท่ากับห้า
บรรทัด 6 แสดงวิธีอ้างถึงเรคคอร์ดนี้
เราอาจเรียกใช้ฟังก์ชัน Value.RemoveMetadata เพื่อลบเมตาดาต้าทั้งหมด และฟังก์ชัน Value.ReplaceMetadata เพื่อแทนที่ข้อมูลของเมตาดาต้า (ไม่ใช่เพิ่มเรคคอร์ดใหม่เข้าไปรวมกับเรคคอร์ดเมตาดาต้าเดิมที่มีอยู่) เนื่องจากสองฟังก์ชันนี้อยู่ภายในไลบราลีมาตรฐาน เราจึงสามารถเรียกใช้ได้ทันที
บรรทัดที่ 11 และ 13 ให้ผลลัพธ์การทำงานเหมือนกันทุกประการ
บรรทัดที่ 11 และ 13 ให้ผลลัพธ์การทำงานเหมือนกันทุกประการ
ตัวกระทำเทียบเท่า
ภาษาเอ็มมีตัวกระทำที่ใช้เพื่อตรวจสอบความเทียบเท่าสองตัว ๆ แรกคือ “ตัวกระทำเทียบเท่า” ใช้สัญลักษณ์เป็นเครื่องหมายเท่ากับ ( = ) ทำหน้าที่ตรวจสอบว่าค่าสองค่าเท่ากันหรือไม่ ตัวที่สองคือ “ตัวกระทำไม่เทียบเท่า” ใช้สัญลักษณ์เป็นเครื่องหมายน้อยกว่ามากกว่า ( < > ) ทำหน้าที่ตรวจสอบว่าค่าสองค่าไม่เท่ากันหรือไม่
รูปที่ 3 คือตัวอย่างโค้ดแสดงวิธีใช้งานตัวกระทำเทียบเท่า ผลลัพธ์จากการเปรียบเทียบเป็นค่าบูลีน
บรรทัด 3-6 เป็นการเปรียบเทียบระหว่างตัวเลขกับตัวเลข
บรรทัด 7, 8 แสดงให้เห็นว่าเราสามารถเปรียบเทียบค่า null กับ null และ true ได้ด้วย
บรรทัด 10, 11 แสดงใหเห็นว่า ตัวกระทำเทียบเท่าใช้กับเมตาดาต้าไม่ได้และจะให้ค่าเป็น true เสมอ
บรรทัด 3-6 เป็นการเปรียบเทียบระหว่างตัวเลขกับตัวเลข
บรรทัด 7, 8 แสดงให้เห็นว่าเราสามารถเปรียบเทียบค่า null กับ null และ true ได้ด้วย
บรรทัด 10, 11 แสดงใหเห็นว่า ตัวกระทำเทียบเท่าใช้กับเมตาดาต้าไม่ได้และจะให้ค่าเป็น true เสมอ
บรรทัด 13 เนื่องจากตัวกระทำ not ทำหน้าที่กลับค่าตรรก ดังนั้นนิพจน์ลักษณะนี้จะให้ค่าเป็น true เสมอ
บรรทัด 15, 17 แสดงให้เห็นว่าค่า null ไม่เท่ากับอะไรทั้งนั้นยกเว้นตัวของมันเอง
บรรทัด 19, 22 แสดงให้เห็นว่าค่าตรรกไม่เท่ากับอะไรทั้งนั้นยกเว้นตัวของมันเอง
บรรทัด 15, 17 แสดงให้เห็นว่าค่า null ไม่เท่ากับอะไรทั้งนั้นยกเว้นตัวของมันเอง
บรรทัด 19, 22 แสดงให้เห็นว่าค่าตรรกไม่เท่ากับอะไรทั้งนั้นยกเว้นตัวของมันเอง
รูปที่ 4 บรรทัด 3-8 แสดงให้เห็นว่าค่า #nan เป็นค่าชนิดเดียวเท่านั้นที่ไม่เท่ากับตัวเอง
บรรทัด 10-12 แสดงการใช้ตัวกระทำเทียบเท่ากับลิสต์ การเปรียบเทียบจะให้ค่าเป็น true ก็ต่อเมื่อทั้งสองลิสต์มีจำนวนหน่วยเท่ากันและมีลำดับของหน่วยเรียงตรงกันด้วย
บรรทัด 14-17 แสดงการใช้ตัวกระทำเปรียบเทียบกับเรคคอร์ด จะเห็นว่าผลการเปรียบเทียบจะให้ค่าเป็น true ก็ต่อเมื่อมีจำนวนฟิลด์เท่ากัน ชื่อของฟิลด์ที่ปรากฏในเรคคอร์ดหนึ่งจะต้องปรากฏอยู่ในอีกเรคคอร์ดหนึ่งด้วย และค่าของฟิลด์ที่มีชื่อเหมือนกันจะต้องตรงกัน
บรรทัด 10-12 แสดงการใช้ตัวกระทำเทียบเท่ากับลิสต์ การเปรียบเทียบจะให้ค่าเป็น true ก็ต่อเมื่อทั้งสองลิสต์มีจำนวนหน่วยเท่ากันและมีลำดับของหน่วยเรียงตรงกันด้วย
บรรทัด 14-17 แสดงการใช้ตัวกระทำเปรียบเทียบกับเรคคอร์ด จะเห็นว่าผลการเปรียบเทียบจะให้ค่าเป็น true ก็ต่อเมื่อมีจำนวนฟิลด์เท่ากัน ชื่อของฟิลด์ที่ปรากฏในเรคคอร์ดหนึ่งจะต้องปรากฏอยู่ในอีกเรคคอร์ดหนึ่งด้วย และค่าของฟิลด์ที่มีชื่อเหมือนกันจะต้องตรงกัน
บรรทัด 19-21 แสดงการใช้ตัวกระทำเปรียบเทียบกับตาราง (#table) จะเห็นว่าผลการเปรียบเทียบจะให้ค่าเป็น true ก็ต่อเมื่อทั้งสองตารางมีจำนวนคอลัมน์เท่ากัน ชื่อของคอลัมน์ที่ปรากฏในตารางหนึ่งจะต้องปรากฏอยู่ในอีกตารางหนึ่งด้วย และทั้งสองตารางต้องมีจำนวนแถวข้อมูลเท่ากัน
ตัวกระทำเปรียบเทียบ
ตัวกระทำเปรียบเทียบมีทั้งหมดสี่ตัวคือ น้อยกว่า < มากกว่า > น้อยกว่าหรือเท่ากับ <= และมากกว่าหรือเท่ากับ >= ตัวกระทำเปรียบเทียบต่างจากตัวกระทำเทียบเท่า เพราะตัวกระทำเปรียบเทียบจะให้ผลลัพธ์เป็น true หรือ false เท่านั้น ขณะที่ตัวกระทำเปรียบเทียบอาจให้ผลลัพธ์เป็น true หรือ false หรือ null ก็ได้
รูปที่ 5 แสดงตัวอย่างวิธีใช้งานตัวกระทำเปรียบเทียบ
บรรทัด 4 จะให้ผลลัพธ์เป็น true หาก x มีค่าน้อยกว่า y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 5 จะให้ผลลัพธ์เป็น true หาก x มีค่ามากกว่า y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 8 จะให้ผลลัพธ์เป็น true หาก x มีค่าน้อยกว่าหรือเท่ากับ y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด10 จะให้ผลลัพธ์เป็น true หาก x มีค่ามากกว่าหรือเท่ากับ y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 4 จะให้ผลลัพธ์เป็น true หาก x มีค่าน้อยกว่า y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 5 จะให้ผลลัพธ์เป็น true หาก x มีค่ามากกว่า y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 8 จะให้ผลลัพธ์เป็น true หาก x มีค่าน้อยกว่าหรือเท่ากับ y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด10 จะให้ผลลัพธ์เป็น true หาก x มีค่ามากกว่าหรือเท่ากับ y ไม่เช่นนั้นจะให้ผลลัพธ์เป็น false
บรรทัด 14, 15 แสดงให้เห็นว่าการใช้ตัวกระทำเปรียบเทียบตัวใดก็ตามกับ null จะให้ผลลัพธ์เป็น null
บรรทัด 18 แสดงการใช้ตัวกระทำเปรียบเทียบกับข้อมูลตัวอักษร
บรรทัด 20, 22 แสดงให้เห็นว่าการใช้ตัวกระทำเปรียบเทียบตัวใดก็ตามกับ #nan จะให้ผลลัพธ์เป็น false
บรรทัด 18 แสดงการใช้ตัวกระทำเปรียบเทียบกับข้อมูลตัวอักษร
บรรทัด 20, 22 แสดงให้เห็นว่าการใช้ตัวกระทำเปรียบเทียบตัวใดก็ตามกับ #nan จะให้ผลลัพธ์เป็น false
การสร้างและการเรียกใช้ฟังก์ชัน
ฟังก์ชันในภาษาเอ็มคือค่าหนึ่งค่าที่ได้จากการจับคู่กลุ่มของอาร์กิวเมนต์เข้ากับค่าหนึ่งค่า การเรียกใช้ฟังก์ชันทำได้โดยการส่งอินพุต (อาร์กิวเมนต์) ไปให้ฟังก์ชันและรับค่าส่งกลับมาเป็นผลลัพธ์ ยกตัวอย่างเช่นในรูปที่ 6 บรรทัด 4 คือตัวอย่างฟังก์ชันที่ต้องการอาร์กิวเมนต์สองตัว ผลลัพธ์การทำงานคือค่าที่ได้จากการบวกกันของค่าสองค่านั้น (x, y) คือพารามิเตอร์ของฟังก์ชัน x + y คือไส้ของฟังก์ชัน
ผลลัพธ์ของการประเมินค่านิพจน์ฟังก์ชันมาจาก “ค่าของฟังก์ชัน” (ไม่ได้มาจากส่วนที่เป็นไส้ของฟังก์ชัน) ในบทความนี้จะแสดงโดยใช้สัญลักษณ์จุดสามจุด ( . . . ) ตรงตำแหน่งไส้ของฟังก์ชัน ยกตัวอย่างเช่น “ค่าของฟังก์ชัน” ในบรรทัด 4 จะเขียนอย่างที่เห็นในบรรทัด 6
เมื่อเราเรียกหาฟังก์ชัน บรรทัดคำสั่งในส่วนที่เป็นใส้ของฟังก์ชันจะทำงาน ค่าที่ได้จากการทำงานของฟังก์ชันจะถูกส่งกลับไปหาผู้เรียก หรือเกิดเออเรอร์ การเรียกฟังก์ชันจะต้องใส่รายการอาร์กิวเมนต์ซึ่งเป็นค่าอินพุตของฟังก์ชันนั้น
รูปที่ 6
บรรทัด 8-11 คือเรคคอร์ดที่มีสองฟิลด์ ๆ แรก (บรรทัด 9) เป็นนิยามฟังก์ชัน ฟิลด์ที่สองเป็นการหาค่าฟังก์ชัน (บรรทัด 10) วงเล็บในบรรทัด 9 คือรายการพารามิเตอร์ วงเล็บในบรรทัด 10 คือรายการการ์กิวเมนต์
รูปที่ 6
บรรทัด 8-11 คือเรคคอร์ดที่มีสองฟิลด์ ๆ แรก (บรรทัด 9) เป็นนิยามฟังก์ชัน ฟิลด์ที่สองเป็นการหาค่าฟังก์ชัน (บรรทัด 10) วงเล็บในบรรทัด 9 คือรายการพารามิเตอร์ วงเล็บในบรรทัด 10 คือรายการการ์กิวเมนต์
รายการพารามิเตอร์มีสองแบบ แบบแรกคือแบบ “บังคับ” กำหนดให้ใส่ทุกตัวให้ครบ ยกตัวอย่างเช่นบรรทัด 14 คือรายการแบบนี้ คือมีพารามิเตอร์สองตัว เวลาเรียกใช้ต้องใส่ให้ครบทั้งสองตัวอย่างที่เห็นในบรรทัด 15 และ 16 อีกแบบคือแบบ “เผื่อเลือก” พารามิเตอร์แบบนี้เราใส่หรือไม่ใส่ก็ได้ ยกตัวอย่างเช่นบรรทัด 20 คือรายการแบบนี้ ฟังก์ชันนี้มีพารามิเตอร์สองตัว ตัวแรกเป็นแบบบังคับว่าต้องใส่ ส่วนตัวที่สองเป็นเผื่อเลือก เวลาเรียกจะใส่ครบทั้งสองตัว (บรรทัด 24) หรือจะใส่แค่ตัวเดียวก็ได้ (บรรทัด 24)
รูปที่ 7 ค่า N แสดงจำนวนของรายการอาร์กิวเมนต์ของฟังก์ชันในรูปที่ 6
บรรทัด 5 การใส่ null ยังถือว่ามีพารามิเตอร์หนึ่งตัว
บรรทัด 9 {3, 4} คือลิสต์ที่มีสองหน่วยแต่ถือว่าเป็นพารามิเตอร์ตัวเดียว
บรรทัด 11 วงเล็บว่างหมายถึงไม่มีพารามิเตอร์
บรรทัด 12 มีพารามิเตอร์แบบบังคับหนึ่งตัว ไม่มีพารามิเตอร์แบบเผื่อเลือก
บรรทัด 13 ไม่มีพารามิเตอร์แบบบังคับแต่มีพารามิเตอร์แบบเผื่อเลือก
บรรทัด 14 มีพารามิเตอร์แบบบังคับหนึ่งและมีพารามิเตอร์แบบเผื่อเลือกหนึ่ง
บรรทัด 5 การใส่ null ยังถือว่ามีพารามิเตอร์หนึ่งตัว
บรรทัด 9 {3, 4} คือลิสต์ที่มีสองหน่วยแต่ถือว่าเป็นพารามิเตอร์ตัวเดียว
บรรทัด 11 วงเล็บว่างหมายถึงไม่มีพารามิเตอร์
บรรทัด 12 มีพารามิเตอร์แบบบังคับหนึ่งตัว ไม่มีพารามิเตอร์แบบเผื่อเลือก
บรรทัด 13 ไม่มีพารามิเตอร์แบบบังคับแต่มีพารามิเตอร์แบบเผื่อเลือก
บรรทัด 14 มีพารามิเตอร์แบบบังคับหนึ่งและมีพารามิเตอร์แบบเผื่อเลือกหนึ่ง
วิธีดูว่ารายการอาร์กิวเมนต์ตรงกับพารามิเตอร์ของฟังก์ชันหรือไม่เป็นตามสูตรในบรรทัด 16 นั่นคือจำนวนอาร์กิวเมนต์จะต้องเท่ากับหรือมากกว่าพารามิเตอร์แบบบังคับ และจำนวนอาร์กิวเมนต์จะต้องน้อยกว่าหรือเท่ากับพารามิเตอร์แบบบังคับและพารามิเตอร์แบบเผื่อเลือกรวมกัน
ฟังก์ชันแบบรีเคอร์ซีฟ
การเขียนนิยามฟังก์ชันแบบ “รีเคอร์ซีฟ” หรือ “ฟังก์ชันที่เรียกตัวเอง” ทำได้โดยใช้ตัวกระทำ “กำหนดขอบเขต” (scoping operator @) เพื่ออ้างถึงฟังก์ชันที่อยู่ในสโคปของตัวเอง
ยกตัวอย่างเช่น
รูปที่ 8
บรรทัด 3-7 คือเรคคอร์ดที่ภายในมีฟิลด์สองฟิลด์ ฟิลด์แรกเป็นนิยามฟังก์ชันเพื่อหาค่าแฟกทอเรียล (บรรทัด 4-5)
บรรทัด 6 คือฟิลด์ที่สอง แสดงตัวอย่างการเรียกฟังก์ชันโดยส่ง 3 ไปเป็นอาร์กิวเมนต์
ยกตัวอย่างเช่น
รูปที่ 8
บรรทัด 3-7 คือเรคคอร์ดที่ภายในมีฟิลด์สองฟิลด์ ฟิลด์แรกเป็นนิยามฟังก์ชันเพื่อหาค่าแฟกทอเรียล (บรรทัด 4-5)
บรรทัด 6 คือฟิลด์ที่สอง แสดงตัวอย่างการเรียกฟังก์ชันโดยส่ง 3 ไปเป็นอาร์กิวเมนต์
ถ้าเปลี่ยนแปลงโค้ดฟังก์ชันแฟกทอเรียลเสียใหม่เป็นแบบไม่เรียกตัวเองก็ทำได้และคราวนี้ไม่ต้องใช้ตัวกระทำ “กำหนดขอบเขต” แต่ใช้วิธีนิยามฟังก์ชันแยกเป็นอีกอันหนึ่ง (บรรทัด 12) ให้เรียกฟังก์ชันแฟกทอเรียล (บรรทัด 10)
บรรทัด 13 แสดงตัวอย่างการเรียกฟังก์ชันโดยส่ง 3 ไปเป็นอาร์กิวเมนต์ จะเห็นว่าวิธีเรียกใช้และผลลัพธ์เหมือนแบบฟังก์ชันเรียกตัวเอง
บรรทัด 13 แสดงตัวอย่างการเรียกฟังก์ชันโดยส่ง 3 ไปเป็นอาร์กิวเมนต์ จะเห็นว่าวิธีเรียกใช้และผลลัพธ์เหมือนแบบฟังก์ชันเรียกตัวเอง