เหตุใดการแสดงออกของสารประกอบ


10

นี่คือตัวอย่างจากหนังสือที่ฉันอ่าน:

volume = begin
    len = 10
    breadth = 20
    height = 30
    len * breadth * height
end

เหตุใดฉันจึงต้องการนิพจน์แบบผสม ฉันสามารถเขียนvolume = 10 * 20 * 30หรือvolume = len * breadth * heightเขียนฟังก์ชันสำหรับฟังก์ชันนั้นหรือฟังก์ชันที่ไม่ระบุตัวตน ...

ทำไมฉันถึงใช้beginและend? หรือคำถามที่อาจจะดีกว่า: เมื่อ ฉันจะใช้พวกเขาเป็นฉันเดาตัวอย่างข้างต้นจากหนังสืออาจจะไม่ดีมาก


1
หนังสือเล่มนั้นคืออะไร? ในขณะที่คุณไม่ใช่ตัวอย่างที่ไม่ดีโดยเฉพาะอย่างยิ่ง
Michael K. Borregaard

"Learning Julia" ตามที่มีอยู่ที่นี่: epdf.pub/learning-julia.html (หน้า 127)
Georgery

คำตอบ:


4

ฉันเดาว่ามีหลายสถานการณ์ที่begin ... endบล็อคมีประโยชน์ แต่อย่างที่คุณสังเกตคุณมักจะได้รับผลที่คล้ายกันกับโครงสร้างอื่น ๆ เช่นฟังก์ชั่น ฯลฯ

จะใช้begin ... endบล็อคอะไรได้บ้าง

  • เพียงแค่ "มี" ตัวแปรและชื่อของเขาlen, breadthและheightจะอยู่ในบล็อกและไม่ก่อให้เกิดมลพิษ namespace โดยรอบ
  • เมื่อต้องการใช้แมโครกับบล็อกของรหัสแทนที่จะเป็นงบเดี่ยว ตัวอย่างเช่น@inbounds begin <all my code without bounds checking goes here> endหรือห่อ@time begin ... endล้อมรอบโค้ดหนึ่งชิ้น
  • เพื่อสร้างขอบเขตท้องถิ่นในขอบเขตโกลบอลโดยรอบ (เพื่อหลีกเลี่ยงการสับสนขอบเขตโกลบอลตัวอย่างเช่น) (หมายเหตุว่าตามที่ได้รับการชี้ให้เห็นในความคิดเห็นที่begin ... endไม่ได้แนะนำขอบเขตท้องถิ่น แต่อาร์กิวเมนต์ถือสำหรับคล้ายlet ... endบล็อก.)

โดยเฉพาะอย่างยิ่งประเด็นที่สองคือสิ่งที่ฉันใช้ในรหัสของฉัน


ฉันยังมีการสร้างความมั่นใจให้ตัวเอง แต่beginบล็อกไม่ได้แนะนำขอบเขต ในทางกลับกันพวกเขาแปลงลำดับของข้อความสั่งให้เป็นนิพจน์ซึ่งอาจมีประโยชน์หากคุณสร้างโค้ดด้วย / จากมาโคร
phipsgabler

1
โอ้ขอบคุณที่ฉันสับสนด้วยlet ... endซึ่งจะแนะนำขอบเขตท้องถิ่น จะแก้ไขคำตอบของฉัน
crstnbr

ฉันทำผิดแบบเดิมตลอดเวลา :) มันเป็นสิ่งที่ใคร ๆ ก็คาดหวัง
phipsgabler

1
@crstnbr สัญลักษณ์แสดงหัวข้อแรกของคุณยังคงทำให้เข้าใจผิด มันก็ยังดูเหมือนว่าbeginบล็อกที่แนะนำขอบเขตท้องถิ่น
Cameron Bieganek

7

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

ตัวอย่างเช่นในขณะที่คุณไม่ควรคุณสามารถเขียน

x = begin
    s = 0
    for i = 1:10
        s += i^2
    end
    s
end

เพื่อกำหนดxให้กับผลลัพธ์ของการดำเนินการวนรอบ (ด้วยข้อ จำกัด ที่คำสั่งสุดท้ายในลำดับต้องเป็นนิพจน์ - ไม่เช่นนั้นคุณจะไม่มีค่าสำหรับนิพจน์)

กรณีการใช้งานที่ถูกต้องของสิ่งนี้คือรหัสที่สร้างขึ้น ตัวอย่างเช่นคุณอาจเลี้ยว

x = @somthing bla blub

เข้าไป

x = begin
   (stuff involving bla and blub)
end

โปร่งใสให้กับผู้ใช้ในขณะที่@somethingสามารถสร้างโครงสร้างภาษาใด ๆ ได้อย่างอิสระ

หรือถ้าคุณต้องการที่จะเขียนฟังก์ชั่นที่ไม่ระบุตัวตนกับร่างกายอีกต่อไป (และไม่ใช้functionแบบฟอร์ม):

f = x -> begin
   ...
end

1
การชี้แจงเล็กน้อย: ใน Julia ข้อความสั่งมีค่าและสามารถกำหนดได้ ดังนั้นคุณสามารถทำx = y = 1, a = if false endและb = for i in 1:2 endหลังจากที่xมีค่า1และaและทั้งสองมีค่าb nothing
Cameron Bieganek

โอ้นี่เป็นตัวอย่างที่มีประโยชน์มากขึ้นของการกำหนดค่าของนั้นคำสั่ง:if-else a = if false; 1 else 2 endในกรณีนี้เท่ากับa 2
Cameron Bieganek

1
ใช่แล้วพวกเขาก็มีคุณค่าและมีการแสดงออกทางเทคโนโลยีด้วย การมอบหมายคือการแสดงออกเนื่องจากเป็นพื้นsetproperty!/ setindex!และเป็น "ประเพณี" สิ่งที่ทำให้มันมีค่า (ในภาษา C - like) เช่นเดียวกันif-elseซึ่งเป็นการแสดงออกในสองภาษา แต่forและifโดยไม่ต้องelseมีการ "เริ่มต้น" ค่าของnothingผมเห็นว่าเป็นเพียงสิ่งประดิษฐ์
phipsgabler

6

หนึ่งการใช้งานสำหรับบล็อกเหล่านี้อยู่ในความเข้าใจ:

A = [ begin
           x = y^2
           x - x^2 + 2
         end
         for y = 1:5 ]

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


ที่จะไม่คัดค้านจุดของคุณ แต่ก็สามารถเขียนy^2 - y^4 + 2ในกรณีนี้ อาจเป็นการดีกว่าถ้าแสดงตัวอย่างที่จำเป็นต้องใช้สองขั้นตอนขึ้นไป
crstnbr

@ crstnbr คุณพูดถูก แต่ฉันเพิ่งใช้ตัวอย่างจากหนังสือและเริ่มสนใจว่าการใช้ที่เหมาะสมจะเป็นอย่างไร
Georgery

1
กดไลค์เพื่อบันทึกการคำนวณค่ากลางราคาแพงสองครั้ง
phipsgabler

5

เพียงใส่:“ เริ่มต้น” เพียงแค่แสดงถึงการบล็อกรหัส (ดูเอกสารเกี่ยวกับเรื่องนี้: https://docs.julialang.org/en/v1/base/base/#begin )

ในตัวอย่างข้างต้นไม่ชัดเจนว่ามีค่าใด ๆ สำหรับการใช้บล็อกเริ่มต้นและการประกาศฟังก์ชัน

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


ฉันยังไม่ได้ใช้ Julia แต่นี่เป็นสิ่งที่ฉันคิด อย่างไรก็ตามเมื่อภาษาได้รับการออกแบบ (น่าจะฉลาดมาก) ผู้คนจะต้องมีความคิดในใจใช่ไหม?
Georgery

ฉันเห็นด้วยกับ @logankilpatrick ซึ่งในหลายกรณีคุณต้องการใช้ฟังก์ชั่นแทน แต่ฉันคิดว่ามีเหตุผลสำหรับการดำรงอยู่ของบล็อกเหล่านี้ (ดูคำตอบของฉัน)
crstnbr

@Georgery การเปลี่ยนลำดับของข้อความเป็นนิพจน์เป็นสิ่งที่มีประโยชน์ในบางครั้ง (cf. progn LISP)
phipsgabler

1
ตามที่คุณทราบอย่างถูกต้องดูเหมือนว่าไร้สาระในบริบท
Michael K. Borregaard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.