โอเปอเรเตอร์ของ infix มีประโยชน์อย่างไรในภาษาการเขียนโปรแกรม?


13

โอเปอเรเตอร์ของ infix มีประโยชน์อย่างไรในภาษาการเขียนโปรแกรม? พวกเขาคุ้มค่ากับความซับซ้อนที่เพิ่มขึ้นหรือไม่ คุณสามารถให้ตัวอย่างใด ๆ ที่ตัวดำเนินการมัดเหมาะกับปัญหาที่ไม่สามารถจัดการได้โดยเพียงแค่บรรทุกเกินพิกัดตัวดำเนินการปกติหรือไม่


5
คุณต้องเป็น Lisper ฉันถูกไหม?
missingfaktor

@missingfaktor: แทบจะใช้ไม่ได้เลย
Casebash

1
ตัวดำเนินการมัดที่เกี่ยวข้องกับตัวดำเนินการมากเกินไปได้อย่างไร
Rein Henrichs

3
เป็นที่น่าสังเกตว่าภาษา OO (ish) ที่เป็นที่นิยมส่วนใหญ่ใช้ infix สำหรับชื่อเมธอด อันที่จริงบางภาษาไปยาวบางอย่างที่จะช่วยให้วิธีการ "คงที่" ที่จะเขียนเป็นพูดมากกว่าarg1.method(arg2) method(arg1, arg2)
Tom Hawtin - tackline

คำตอบ:


16

ฉันคิดว่าตัวดำเนินการมัดเกิดจากคณิตศาสตร์

นี้:

2 + 3 * 4

สามารถอ่านได้กับคนส่วนใหญ่มากกว่า

(+ 2 (* 3 4))

เพราะคนส่วนใหญ่คุ้นเคยกับคณิตศาสตร์

น่าสนใจพอใน Haskell คุณสามารถกระโดดระหว่างมัดและคำนำหน้า นี่ใช้ funtion เดียวกัน "(+)":

(+) 1 2
1 + 2

และนี่คือการใช้ฟังก์ชั่นเดียวกัน "elem":

elem 42 [1,2,42]
42 `elem` [1,2,42]

การใช้งานตัวดำเนินการตามปกติมากเกินไปจะจัดการกับกรณีนี้มากที่สุด
Casebash

1
@Casebash: โอเปอเรเตอร์ "ปกติ" เหล่านั้นบางครั้งก็เป็นมัด
liori

2
ฉันจะต้องแปลกเพียงกว่าเพราะผมพบ(+ 1 2) มากขึ้น1 + 2อ่านกว่า อย่างน้อยที่สุดจะดีกว่า(+ 1 2 3 4 5) 1 + 2 + 3 + 4 + 5
Joe D

นอกจากนี้ยังมี RPN: ผลักองค์ประกอบจากนั้นผู้ประกอบการ
PhiLho

@PhiLho เรียกอีกอย่างว่าผู้ประกอบการ postfix! เช่นนี้1 2 +หรือหรือมากกว่าปกติในกรณีที่ผ่านมา1 2 3 4 5 + 1 2 + 3 + 4 + 5 +จริงๆแล้วมีข้อได้เปรียบที่ดีสำหรับผู้ที่เป็นแบบจำลองระบบสแต็กที่สมบูรณ์แบบและแทบจะไม่ต้องใช้วงเล็บเพื่อปรับความสำคัญของผู้ปฏิบัติงาน
CodexArcanum

6

ภาษาคอมพิวเตอร์ได้รับการออกแบบมาสำหรับมนุษย์ไม่ใช่เครื่องจักร และมนุษย์ถูกนำมาใช้เพื่อมัดผู้ประกอบการมากกว่าก่อนหรือหลัง


6

เหตุผลที่แท้จริงเพียงอย่างเดียวสำหรับโอเปอเรเตอร์ infix คือมนุษย์มักพบว่าอ่านง่ายขึ้น นี่คือสาเหตุส่วนใหญ่เนื่องจากข้อเท็จจริงสองประการ:

  • เราเรียนรู้ตัวดำเนินการมัดในรูปแบบของคณิตศาสตร์ตั้งแต่อายุยังน้อยและคุ้นเคยกับพวกเขา: 2 * 2 = 4ฯลฯ
  • โอเปอเรเตอร์ infix มีข้อได้เปรียบของ "การมองเห็น" การแยกอาร์กิวเมนต์สองตัว เช่น(some complex expression) + (some other complex expression)

จากมุมมองเชิงตรรกะ / เครื่องตัวดำเนินการมัดไม่ได้เพิ่มมูลค่าใด ๆ และในบางกรณีเป็นการรบกวน:

  • คุณสามารถแปลงจากมัดเป็นการเรียกฟังก์ชั่นที่เทียบเท่ากับสองข้อโต้แย้ง - ดังนั้นผู้ประกอบการมัดไม่เคยมากกว่า "น้ำตาลน้ำตาล"
  • มัดอาจไม่สะดวกเมื่อคุณต้องการใช้มากกว่าสองพารามิเตอร์ (* 1 2 3 4 5)ตัวอย่างเช่น Lisp เป็นไวยากรณ์ที่สะอาดกว่ามากสำหรับการคูณชุดของตัวเลข
  • จากมุมมองการแยกวิเคราะห์มักจะมีประโยชน์ในการอ่านโอเปอเรเตอร์ก่อนเพื่อให้คุณรู้วิธีตีความส่วนที่เหลือของนิพจน์ ด้วยตัวดำเนินการมัดนี้จะซับซ้อนมากขึ้น (เช่นคุณต้องรักษากองหรือสิ่งที่คล้ายกับคิดออกว่าผู้ประกอบการที่ใช้กับข้อโต้แย้งใด)
  • ในภาษาแบบสแต็ก / แบบเรียงต่อกันเช่น Forth คุณต้องการให้ตัวดำเนินการถูกกดบนสแต็กล่าสุดเพื่อให้มันมีอาร์กิวเมนต์อยู่ในตำแหน่งที่ถูกต้องแล้ว อีกครั้งการฝังโอเปอเรเตอร์ระหว่างลำดับของโทเค็นจะทำให้เรื่องซับซ้อนเท่านั้น
  • โอเปอเรเตอร์ของ Infix อาจสร้างความสับสนได้อย่างแน่นอนเมื่อพวกเขาโอเวอร์โหลด - "+" หมายถึงอะไรเมื่อนำไปใช้กับ HashMaps สองตัวอย่าง ที่นี่ความเข้าใจของมนุษย์ที่เข้าใจง่ายของโอเปอเรเตอร์ infix ทำงานกับคุณเพราะมันง่ายที่จะเข้าใจความหมายที่ไม่ได้ตั้งใจจริง ๆ .....

ฉันคิดว่าอาร์กิวเมนต์สุดท้ายเป็นของปลอม มันขึ้นอยู่กับโปรแกรมเมอร์ที่จะใช้ชื่อที่เหมาะสมสำหรับฟังก์ชั่นไม่ว่าจะใช้สัญลักษณ์หรือตัวอักษร
Tom Hawtin - tackline

@Tom - แน่นอนว่าโปรแกรมเมอร์ควรเลือกชื่อที่เหมาะสม แต่หนึ่งในเกณฑ์สำคัญสำหรับ "เหตุผล" คือ "คนอื่นสามารถเข้าใจได้โดยสัญชาตญาณ?" - ฉันเคยเห็นเคสจำนวนมากที่มีตัวดำเนินการบรรทุกเกินพิกัดซึ่งอยู่ไกลจากเคส ฉันไม่ต้องการที่จะย้อนกลับคำจำกัดความที่แปลกประหลาดของใครบางคนในสิ่งที่ ">> =" หมายถึงเมื่อนำไปใช้กับบางประเภทข้อมูลโดยพลการ ชื่อฟังก์ชั่นที่เหมาะสมโปรด!
mikera
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.