บทนำ

ภาพรวม

Microsoft Power Query มอบประสบการณ์ "รับข้อมูล" อันทรงประสิทธิภาพที่ครอบคลุมคุณลักษณะหลายอย่าง ความสามารถหลักของ Power Query คือการกรองและจุดกลุ่ม นั่นคือ "การรวม" ข้อมูลจากคอลเลกชันของแหล่งข้อมูลที่ได้รับการสนับสนุนอย่างน้อยหนึ่งรายการ การรวมข้อมูลดังกล่าวจะแสดงโดยใช้ภาษาสูตร Power Query (รู้จักกันอย่างไม่เป็นทางการว่า "M") Power Query จะฝังเอกสาร M ในผลิตภัณฑ์ Microsoft ที่หลากหลาย รวมถึง Excel, Power BI, Analysis Services และ Dataverse เพื่อเปิดใช้งานการรวมข้อมูลที่ทําซ้ําได้

เอกสารนี้มีข้อมูลจําเพาะสําหรับ M หลังจากการแนะนําแบบย่อที่มีจุดมุ่งหมายเพื่อสร้างการหยอกหลีกแรกและความคุ้นเคยกับภาษาเอกสารครอบคลุมภาษาอย่างแม่นยําในขั้นตอนต่อเนื่องหลายขั้นตอน:

  1. โครงสร้างเลกซิคัลจะกําหนดชุดของข้อความที่ถูกต้องตามเลกซิคัล

  2. ค่า นิพจน์ สภาพแวดล้อมและตัวแปร ตัวระบุ และแบบจําลองการประเมินจะสร้างแนวคิดพื้นฐานของภาษา

  3. ข้อมูลจําเพาะโดยละเอียดของ ค่า ทั้งแบบดั้งเดิมและแบบมีโครงสร้าง จะกําหนดโดเมนเป้าหมายของภาษาดังกล่าว

  4. ค่าต่าง ๆ มี ชนิด เป็นค่าชนิดพิเศษที่กําหนดลักษณะเฉพาะของค่าชนิดพื้นฐาน และดําเนินการด้วยเมตาดาต้าเพิ่มเติมที่เป็นข้อมูลเฉพาะสําหรับรูปร่างของค่าที่มีโครงสร้าง

  5. ชุดของ ตัว ดําเนินการใน M จะกําหนดชนิดของนิพจน์ที่สามารถสร้างได้

  6. ฟังก์ชัน ค่าพิเศษอีกชนิดหนึ่ง ระบุพื้นฐานสําหรับไลบรารีมาตรฐานสําหรับ M และอนุญาตให้สามารถเพิ่มนามธรรมใหม่ได้

  7. ข้อผิดพลาด สามารถเกิดขึ้นได้ขณะปรับใช้ตัวดําเนินการหรือฟังก์ชันต่างๆ ในระหว่างการประเมินนิพจน์ ในขณะที่ข้อผิดพลาดไม่ใช่ค่า มีวิธีใน การจัดการข้อผิดพลาด ที่แมปข้อผิดพลาดกลับไปยังค่า

  8. นิพจน์ ให้ อนุญาตให้มีการแนะนําข้อกําหนดเสริมที่ใช้ในการสร้างนิพจน์ที่ซับซ้อนด้วยขั้นตอนที่น้อยกว่านี้

  9. นิพจน์ ถ้า สนับสนุนการประเมินแบบมีเงื่อนไข

  10. ส่วน มีกลไกมอดูลลิตี้อย่างง่าย (Power Query. ยังไม่ได้ใช้ประโยชน์จากส่วน)

  11. ใน ตอนท้าย ไวยากรณ์ รวมจะรวบรวมส่วนต่างๆ ของไวยากรณ์จากส่วนอื่นๆ ทั้งหมดของเอกสารนี้ไปยังข้อกําหนดแบบสมบูรณ์เพียงรายการเดียว

สําหรับนักทฤษฎีด้านภาษาคอมพิวเตอร์: ภาษาสูตรที่ระบุในเอกสารนี้ โดยส่วนใหญ่เป็นภาษาบริสุทธิ์ อยู่ในลําดับที่สูงกว่า เป็นชนิดไดนามิก และมีการใช้งานแบบขี้เกียจบางส่วน

นิพจน์และค่า

คอนสตรัคเตอร์ส่วนกลางใน M คือนิพจน์ สามารถประเมินนิพจน์ (คํานวณ) ให้ส่งค่าเดียวได้

แม้ว่าคุณสามารถเขียนค่าจํานวนมากเป็นนิพจน์ได้อย่างแท้จริง แต่ค่าจะไม่ใช่นิพจน์ ตัวอย่างเช่น นิพจน์ 1 จะประเมินเป็นค่า 1; นิพจน์ 1+1 จะประเมินเป็นค่า 2 ความแตกต่างนี้จะละเอียดมาก แต่มีความสําคัญมาก นิพจน์เป็นสูตรสําหรับการประเมินผล ค่า คือผลลัพธ์ของการประเมิน

ตัวอย่างต่อไปนี้แสดงชนิดของค่าต่าง ๆ ที่พร้อมใช้งานใน M ตามแบบแผน ค่าจะถูกเขียนโดยใช้รูปแบบสัญพจน์ซึ่งจะปรากฏในนิพจน์ที่ประเมินเป็นค่านั้น (โปรดทราบว่า // ระบุถึงจุดเริ่มต้นของข้อคิดเห็นที่ยังคงอยู่จนถึงจุดสิ้นสุดของบรรทัด)

  • ค่าแรกเริ่มเป็นค่าส่วนเดียว เช่น ตัวเลข ตรรกะ ข้อความ หรือ null ค่า null สามารถใช้เพื่อระบุการขาดหายไปของข้อมูลใด ๆ

    123                  // A number
    true                 // A logical
    "abc"                // A text
    null                 // null value
    
  • ค่ารายการ เป็นลําดับค่าที่มีการเรียงลําดับ M สนับสนุนรายการอนันต์ แต่หากเขียนเป็นสัญพจน์ รายการจะมีความยาวคงที่ อักขระ { เครื่องหมายวงเล็บปีกกา และ } แสดงจุดเริ่มต้นและสิ้นสุดของรายการ

    {123, true, "A"}     // list containing a number, a logical, and 
                          //     a text 
    {1, 2, 3}            // list of three numbers 
    
  • เรกคอร์ดคือชุดของเขตข้อมูล เขตข้อมูล คือคู่ชื่อ/ค่าที่ชื่อเป็นค่าข้อความที่ไม่ซ้ํากันภายในเรกคอร์ดของเขตข้อมูล ไวยากรณ์สัญพจน์สําหรับค่าเรกคอร์ด อนุญาตให้สามารถเขียนชื่อได้โดยไม่มีอัญประกาศ รูปแบบนี้ยังเรียกว่าเป็น ตัวระบุ อีกด้วย รายการต่อไปนี้แสดงเรกคอร์ดที่มีเขตข้อมูลสามรายการที่มีชื่อว่า "A", "B" และ "C" ซึ่งมีค่า 1, 2และ3

    [ 
          A = 1,  
          B = 2,  
          C = 3 
    ]
    
  • ตาราง คือชุดของค่าที่จัดระเบียบลงในคอลัมน์ (ซึ่งระบุโดยชื่อ) และแถว ไม่มีไวยากรณ์สัญพจน์สําหรับการสร้างตาราง แต่มีฟังก์ชันมาตรฐานต่างๆ ที่สามารถใช้เพื่อสร้างตารางจากรายการหรือเรกคอร์ด

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

    #table( {"A", "B"}, { {1, 2}, {3, 4} } ) 
    

    การดําเนินการนี้จะสร้างตารางที่มีรูปร่างต่อไปนี้:

    Image of an example table in the M formula language.

  • ฟังก์ชัน คือค่าที่ทําให้เกิดค่าใหม่ เมื่อเรียกใช้กับอาร์กิวเมนต์ ฟังก์ชันจะถูกเขียนโดยการแสดงรายการพารามิเตอร์ของฟังก์ชันในวงเล็บ ตามด้วยสัญลักษณ์ =>และตามด้วยนิพจน์ที่กําหนดฟังก์ชัน โดยทั่วไป นิพจน์ดังกล่าวจะอ้างอิงถึงพารามิเตอร์ (ตามชื่อ)

    (x, y) => (x + y) / 2`
    

การประเมิน

แบบจําลองการประเมินผลของภาษา M จะถูกจัดรูปแบบหลังจากที่พบแบบจําลองการประเมินโดยทั่วไปในสเปรดชีต ซึ่งสามารถกําหนดลําดับการคํานวณโดยยึดตามการขึ้นต่อกันระหว่างสูตรต่างๆ ในเซลล์

หากคุณเขียนสูตรในสเปรดชีตเช่น Excel คุณอาจรู้จักสูตรทางด้านซ้ายของผลลัพธ์ทางด้านขวาเมื่อคํานวณแล้ว:

Image of the formulas on the right resulting in the values on the left.

ใน M ส่วนต่างๆ ของนิพจน์สามารถอ้างอิงถึงส่วนอื่นๆ ของนิพจน์ตามชื่อ และกระบวนการประเมินผลจะกําหนดลําดับที่มีการคํานวณนิพจน์ที่อ้างอิงโดยอัตโนมัติ

คุณสามารถใช้เรกคอร์ดเพื่อสร้างนิพจน์ที่เทียบเท่ากับตัวอย่างสเปรดชีตก่อนหน้าได้ เมื่อเริ่มต้นค่าของเขตข้อมูล คุณสามารถอ้างอิงไปยังเขตข้อมูลอื่นภายในเรกคอร์ดโดยใช้ชื่อของเขตข้อมูลดังนี้:

[  
    A1 = A2 * 2,  
    A2 = A3 + 1,  
    A3 = 1  
]

นิพจน์ข้างต้นเทียบเท่ากับรายการต่อไปนี้ (ในการประเมินค่าที่เท่ากัน):

[  
    A1 = 4,  
    A2 = 2,  
    A3 = 1  
]

ระเบียนสามารถมีอยู่ภายใน หรือ ซ้อนกันภายในระเบียนอื่น คุณสามารถใช้ตัว ดําเนินการ ค้นหา ([]) เพื่อเข้าถึงเขตข้อมูลของเรกคอร์ดตามชื่อได้ ตัวอย่างเช่น เรกคอร์ดต่อไปนี้มีเขตข้อมูลที่ชื่อว่า Sales ซึ่งมีเรกคอร์ด และเขตข้อมูลที่ Total ชื่อว่า ซึ่งเข้าถึง FirstHalf เขตข้อมูล และ SecondHalf ของ Sales เรกคอร์ด:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = Sales[FirstHalf] + Sales[SecondHalf] 
]

นิพจน์ข้างต้นเทียบเท่ากับรายการต่อไปนี้เมื่อมีการประเมิน:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = 2100 
]

นอกจากนี้ ยังสามารถมีเรกคอร์ดภายในรายการได้อีกด้วย คุณสามารถใช้ ตัว ดําเนินการ ดัชนีตําแหน่ง ({}) เพื่อเข้าถึงหน่วยข้อมูลในรายการตามดัชนีตัวเลข ค่าภายในรายการจะถูกอ้างอิงโดยใช้ดัชนีที่ยึดตามศูนย์จากจุดเริ่มต้นของรายการ ตัวอย่างเช่น มีการใช้ดัชนี 0 และ 1 เพื่ออ้างอิงหน่วยข้อมูลที่หนึ่งและสองในรายการด้านล่าง:

[ 
    Sales =  
        {  
            [  
                Year = 2007,  
                FirstHalf = 1000,  
                SecondHalf = 1100, 
                Total = FirstHalf + SecondHalf // 2100 
            ], 
            [  
                Year = 2008,  
                FirstHalf = 1200,  
                SecondHalf = 1300, 
                Total = FirstHalf + SecondHalf // 2500 
            ]  
        }, 
    TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600 
]

นิพจน์สมาชิกของเรกคอร์ดและรายการ (รวมถึง นิพจน์ ให้) จะถูกประเมินโดยใช้ การประเมินแบบขี้เกียจ ซึ่งหมายความว่านิพจน์เหล่านั้นได้รับการประเมินเมื่อจําเป็นเท่านั้น นิพจน์อื่น ๆ ทั้งหมดจะถูกประเมินโดยใช้ การประเมินผลกระตือรือร้น ซึ่งหมายความว่านิพจน์เหล่านั้นจะได้รับการประเมินทันทีเมื่อพบในระหว่างกระบวนการประเมินผล วิธีการที่ดีอีกวิธีหนึ่งคือ จดจําว่าการประเมินรายการหรือนิพจน์เรกคอร์ดจะแสดงรายการหรือค่าเรกคอร์ดที่ระบบจดจําว่าจําเป็นต้องคํานวณเขตข้อมูลเรกคอร์ดหรือหน่วยข้อมูลของรายการอย่างไร เมื่อได้รับคําขอ (โดยตัวดําเนินการค้นหาหรือดัชนี)

ฟังก์ชัน

ใน M ฟังก์ชัน คือการแมปจากชุดของค่าอินพุตไปยังค่าเอาต์พุตเดียว ฟังก์ชันจะถูกเขียนโดยการตั้งชื่อชุดค่าอินพุตที่จําเป็น (พารามิเตอร์ของฟังก์ชันดังกล่าว) จากนั้นการระบุนิพจน์ที่คํานวณผลลัพธ์ของฟังก์ชันโดยใช้ค่าอินพุตเหล่านั้น (เนื้อความของฟังก์ชัน) ตามด้วยสัญลักษณ์ (=>) ตัวอย่างเช่น

(x) => x + 1                    // function that adds one to a value 
(x, y) =>  x + y                // function that adds two values

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

[ 
    Add = (x, y) => x + y,
    OnePlusOne = Add(1, 1),     // 2 
    OnePlusTwo = Add(1, 2)      // 3
]

ไลบรารี

M รวมถึงชุดข้อกําหนดทั่วไปที่พร้อมใช้งานสําหรับการใช้จากนิพจน์ที่เรียกว่า ไลบรารีมาตรฐาน หรือเรียกสั้นๆ ว่าไลบรารี ข้อกําหนดเหล่านี้ประกอบด้วยชุดของค่าที่มีชื่อ ชื่อของค่าที่ระบุโดยไลบรารีมีไว้สําหรับใช้ภายในนิพจน์หนึ่ง โดยไม่จําเป็นต้องกําหนดอย่างชัดแจ้งโดยนิพจน์ดังกล่าว ตัวอย่างเช่น

Number.E                        // Euler's number e (2.7182...) 
Text.PositionOf("Hello", "ll")  // 2

ตัวดำเนินการ

M รวมถึงชุดของตัวดําเนินการที่สามารถใช้ในนิพจน์ต่างๆ ได้ ตัวดําเนินการจะถูกนําไปใช้กับตัวถูกดําเนินการเพื่อสร้างนิพจน์สัญลักษณ์ ตัวอย่างเช่น ในนิพจน์ 1 + 2 ตัวเลข 1 และ 2 เป็นตัวถูกดําเนินการ และตัวดําเนินการคือตัวดําเนินการเพิ่มเติม (+)

ความหมายของตัวดําเนินการอาจแตกต่างกันโดยขึ้นอยู่กับชนิดของค่าตัวถูกดําเนินการ ตัวอย่างเช่น ตัวดําเนินการบวก สามารถใช้กับค่าชนิดอื่น นอกเหนือจากตัวเลขได้:

1 + 2                   // numeric addition: 3 
#time(12,23,0) + #duration(0,0,2,0) 
                        // time arithmetic: #time(12,25,0)

ตัวอย่างอื่นของตัวดําเนินการที่มีความหมายขึ้นอยู่กับตัวถูกดําเนินการคือ ตัวดําเนินการรวม (&):

"A" & "BC"              // text concatenation: "ABC" 
{1} & {2, 3}            // list concatenation: {1, 2, 3} 
[ a = 1 ] & [ b = 2 ]   // record merge: [ a = 1, b = 2 ]

โปรดทราบว่าตัวดําเนินการบางตัวไม่สนับสนุนการรวมค่าทั้งหมด ตัวอย่างเช่น

1 + "2"  // error: adding number and text isn't supported

นิพจน์ที่เมื่อประเมิน จะพบเงื่อนไขของตัวดําเนินการที่ไม่ได้กําหนดจะประเมินเป็นข้อผิดพลาด

เมตาดาต้า

เมตาดาต้า คือข้อมูลเกี่ยวกับค่าที่เชื่อมโยงกับค่า เมตาดาต้าจะแสดงเป็นค่าเรกคอร์ด ที่เรียกว่า เรกคอร์ดเมตาดาต้า เขตข้อมูลของเรกคอร์ดเมตาดาต้าสามารถใช้เพื่อจัดเก็บเมตาดาต้าสําหรับค่าได้

ทุกค่ามีเรกคอร์ดเมตาดาต้า หากไม่ได้ระบุค่าของเรกคอร์ดเมตาดาต้า เรกคอร์ดเมตาดาต้าจะว่างเปล่า (ไม่มีเขตข้อมูล)

เรกคอร์ดของเมตาดาต้าจะแสดงวิธีการเชื่อมโยงข้อมูลเพิ่มเติมกับค่าชนิดใดๆ ในลักษณะที่ไม่ขัดขวางการทํางาน การเชื่อมโยงเรกคอร์ดของเมตาดาต้ากับค่าหนึ่งๆ จะไม่เปลี่ยนแปลงค่าหรือลักษณะการทํางาน

ค่าyเรกคอร์ดของเมตาดาต้า จะเชื่อมโยงกับค่าxที่มีอยู่โดยใช้ไวยากรณ์x meta y ตัวอย่างเช่น โค้ดต่อไปนี้เชื่อมโยงเรกคอร์ดของเมตาดาต้ากับ Rating เขตข้อมูล และ Tags ที่มีค่า "Mozart"ข้อความ :

"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]

สําหรับค่าต่างๆ ที่ดําเนินการไปแล้วใช้เรกคอร์ดของเมตาดาต้าที่ไม่ว่างเปล่า ผลลัพธ์ของการปรับใช้เมตาคือผลลัพธ์ของการคํานวณการผสานเรกคอร์ดของเรกคอร์ดเมตาดาต้าใหม่และที่มีอยู่ ตัวอย่างเช่น นิพจน์สองรายการต่อไปนี้จะเทียบเท่ากันและกัน และเทียบเท่ากับนิพจน์ก่อนหน้า:

("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ] 
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])

เรกคอร์ดของเมตาดาต้าสามารถเข้าถึงได้สําหรับค่าที่กําหนดโดยใช้ฟังก์ชัน Value.Metadata ในตัวอย่างต่อไปนี้ นิพจน์ใน ComposerRating เขตข้อมูล จะเข้าถึงเรกคอร์ดของเมตาดาต้าของค่าใน Composer เขตข้อมูล จากนั้น จะเข้าถึง Rating เขตข้อมูล ของเรกคอร์ดของเมตาดาต้า

[ 
    Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ], 
    ComposerRating = Value.Metadata(Composer)[Rating] // 5
]

กําหนดนิพจน์

ตัวอย่างจํานวนมากที่แสดงจะรวมค่าสัญพจน์ทั้งหมดของนิพจน์ไว้ในผลลัพธ์ของนิพจน์ นิพจน์ let อนุญาตให้มีการคํานวณชุดค่า ชื่อที่กําหนด จากนั้นจะใช้ในนิพจน์ที่ตามมา ซึ่งตามหลังin ตัวอย่างเช่น ในตัวอย่างข้อมูลยอดขายของเรา คุณสามารถทําสิ่งต่อไปนี้ได้:

let 
    Sales2007 =  
        [  
            Year = 2007,  
            FirstHalf = 1000,  
            SecondHalf = 1100, 
            Total = FirstHalf + SecondHalf // 2100 
        ], 
    Sales2008 =  
        [  
            Year = 2008,  
            FirstHalf = 1200,  
            SecondHalf = 1300, 
            Total = FirstHalf + SecondHalf // 2500 
        ] 
  in Sales2007[Total] + Sales2008[Total] // 4600

ผลลัพธ์ของนิพจน์ข้างต้นคือค่าตัวเลข (4600) ที่คํานวณจากค่าที่ผูกไว้กับชื่อ Sales2007 และSales2008

นิพจน์ ถ้า

ifนิพจน์ จะเลือกระหว่างนิพจน์สองรายการโดยยึดตามเงื่อนไขตรรกะ ตัวอย่างเช่น

if 2 > 1 then
    2 + 2
else  
    1 + 1

นิพจน์แรก (2 + 2) จะถูกเลือก หากนิพจน์เชิงตรรกะ (2 > 1) เป็นจริง และนิพจน์ที่สอง (1 + 1) จะถูกเลือก หากเป็นเท็จ นิพจน์ที่เลือก (ในกรณีนี้ 2 + 2) จะถูกประเมินและกลายเป็นผลลัพธ์ของ if นิพจน์ (4)

ข้อผิดพลาด

ข้อผิดพลาดคือข้อบ่งชี้ว่ากระบวนการประเมินนิพจน์ไม่สามารถสร้างค่าได้

ข้อผิดพลาดเกิดจากตัวดําเนินการและฟังก์ชันที่เป็นไปตามเงื่อนไขของข้อผิดพลาดหรือโดยใช้นิพจน์ข้อผิดพลาด ข้อผิดพลาดจะได้รับการจัดการโดยใช้ try นิพจน์ เมื่อเกิดข้อผิดพลาด จะมีการระบุค่าที่สามารถใช้เพื่อระบุสาเหตุที่เกิดข้อผิดพลาด

let Sales = 
    [ 
        Revenue = 2000, 
        Units = 1000, 
        UnitPrice = if Units = 0 then error "No Units"
                    else Revenue / Units 
    ], 
    UnitPrice = try Number.ToText(Sales[UnitPrice])
in "Unit Price: " & 
    (if UnitPrice[HasError] then UnitPrice[Error][Message]
    else UnitPrice[Value])

ตัวอย่างข้างต้นเข้าถึง Sales[UnitPrice] เขตข้อมูล และจัดรูปแบบค่าทําให้เกิดผลลัพธ์:

"Unit Price: 2"

ถ้าUnitsเขตข้อมูล เป็นศูนย์ UnitPrice จากนั้นเขตข้อมูล จะทําให้เกิดข้อผิดพลาด ซึ่งจะถูกจัดการโดยtry จากนั้น ค่าผลลัพธ์จะเป็นดังนี้:

"No Units"

นิพจน์ try แปลงค่าและข้อผิดพลาดที่เหมาะสมเป็นค่าเรกคอร์ดที่ระบุว่า try นิพจน์จัดการกับข้อผิดพลาดหรือไม่ และค่าที่เหมาะสมหรือเรกคอร์ดข้อผิดพลาดถูกแยกออกเมื่อจัดการข้อผิดพลาดหรือไม่ ตัวอย่างเช่น พิจารณานิพจน์ต่อไปนี้ที่ทําให้เกิดข้อผิดพลาด และจัดการทันที:

try error "negative unit count"

นิพจน์นี้จะประเมินเป็นค่าเรกคอร์ดที่ซ้อนกันต่อไปนี้ โดย [HasError]อธิบายการค้นหาเขตข้อมูล , [Error]และ [Message] ในตัวอย่างหน่วย-ราคาก่อนหน้า

[ 
    HasError = true, 
    Error = 
        [ 
            Reason = "Expression.Error", 
            Message = "negative unit count", 
            Detail = null 
        ] 
]

กรณีทั่วไปคือการแทนที่ข้อผิดพลาดด้วยค่าเริ่มต้น นิพจน์ try สามารถใช้กับคําสั่งทางเลือก otherwise เพื่อให้ได้ผลลัพธ์ในรูปแบบที่กะทัดรัด:

try error "negative unit count" otherwise 42 
// 42