ตัวดำเนินการมัดที่ผู้ใช้กำหนด


10

ฉันรู้ว่าผู้ประกอบการใน Julia เป็นเพียงฟังก์ชั่นมาตรฐานและฉันสามารถใช้พวกเขาโดยใช้ไวยากรณ์การโทรคำนำหน้าธรรมดา:

julia> +(1, 2)
3

อย่างไรก็ตามพวกเขายังพิเศษในแง่ที่ว่าพวกเขาสามารถใช้ (และมักจะ) เป็นตัวดำเนินการมัด:

julia> 1+2
3


ฉันสามารถกำหนดตัวดำเนินการมัดของตัวเองได้หรือไม่? ถ้าเป็นเช่นนั้นได้อย่างไร

ตัวอย่างเช่น:

julia> α(x, y) = x+y
α (generic function with 1 method)

julia> α(1, 2)
3 # as expected

julia> 1α2
# expected result: 3
ERROR: UndefVarError: α2 not defined
Stacktrace:
 [1] top-level scope at REPL[5]:1

julia> 1 α 2
# expected result: 3
ERROR: syntax: extra token "α" after end of expression
Stacktrace:
 [1] top-level scope at REPL[5]:0

คำตอบ:


14

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

ตัวอย่างเช่น:

julia> ⊕(x, y) = x+y
 (generic function with 1 method)

# standard prefix function call
julia> ⊕(1, 2)
3

# infix operator call
julia> 12
3

julia> 1  2
3


รายการของสัญลักษณ์ที่ได้รับการยอมรับเป็นผู้ประกอบการมัด (และความสำคัญที่เกี่ยวข้อง) สามารถพบได้ในซอร์สโค้ด parser จูเลีย ส่วนใหญ่รายการนี้เป็นส่วนย่อยของหมวดหมู่ unicode Sm (Symbol, math)

ในขณะนี้มันมีตัวอย่างเช่น:

  • แยกวิเคราะห์ที่มีความสำคัญเช่นเดียวกับ+:
+ -        ±                 
                         
  • แยกวิเคราะห์ที่มีความสำคัญเช่นเดียวกับ*:
* / ÷ % &   ×                   
          ⦿             
                       

7
คุณยังสามารถใช้ในทางเทคนิคเกือบใด ๆสัญลักษณ์อื่น ๆ เช่นผู้ประกอบการมัดด้วยพลังของแมโคร! (ถ้าคุณต้องการ) ผมมี@infix สับ (มันต้องอาศัยการคูณโดยปริยายโดยตีข่าว) julia> using InfixFunctions; @infix α(x, y) = x + y; 1 |α| 2ที่ทำอย่างนี้: ( InfixFunctions.jlได้รับการพัฒนาเป็นแบบฝึกหัดแมโครสำหรับตัวเองมันไม่ทำงานกับ
จูเลีย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.