คำถามติดแท็ก language-design

แท็กสำหรับคำถามที่เกี่ยวข้องกับการออกแบบทุกแง่มุมของภาษาโปรแกรม

6
ภาษาอื่นที่ไม่ใช่ JavaScript มีความแตกต่างระหว่างตำแหน่งเริ่มต้นของวงเล็บปีกกา (บรรทัดเดียวกันและบรรทัดถัดไป) หรือไม่
วันนี้ขณะที่ฉันสุ่มอ่านหนังสือ O'Reilly รูปแบบ JavaScript ฉันพบสิ่งที่น่าสนใจอย่างหนึ่ง (หน้า 27 สำหรับการอ้างอิง) ใน Javascript ในบางกรณีอาจมีความแตกต่างหากตำแหน่งเริ่มต้นของวงเล็บปีกกาแตกต่างกัน function test_function1() { return { name: 'rajat' }; } var obj = test_function1(); alert(obj); //Shows "undefined" ในขณะที่ function test_function2() { return { name: 'rajat' }; } var obj = test_function2(); alert(obj); //Shows object การสาธิต JSfiddle ภาษาอื่น ๆ มีพฤติกรรมเช่นนี้หรือไม่? ถ้าเป็นเช่นนั้นฉันจะต้องเปลี่ยนนิสัยของฉันอย่างแน่นอน …

4
เหตุใดส่วนสุดท้ายของชื่อเมธอด Objective-C จึงต้องใช้อาร์กิวเมนต์ (เมื่อมีมากกว่าหนึ่งส่วน)
ใน Objective-C คุณไม่สามารถประกาศชื่อเมธอดโดยที่ส่วนประกอบสุดท้ายไม่รับอาร์กิวเมนต์ ตัวอย่างเช่นต่อไปนี้ผิดกฎหมาย -(void)take:(id)theMoney andRun; -(void)take:(id)yourMedicine andDontComplain; เหตุใด Objective-C จึงออกแบบมาในลักษณะนี้ มันเป็นเพียงสิ่งประดิษฐ์ของ Smalltalk ที่ไม่มีใครเห็นว่าจำเป็นต้องกำจัด? ข้อ จำกัด นี้มีความหมายใน Smalltalk เนื่องจาก Smalltalk ไม่มีตัวคั่นรอบการเรียกใช้ข้อความดังนั้นองค์ประกอบสุดท้ายจะถูกตีความว่าเป็นข้อความที่เป็นเอกภาพของอาร์กิวเมนต์สุดท้าย ยกตัวอย่างเช่นจะแยกวิเคราะห์เป็นBillyAndBobby take:'$100' andRun BillyAndBobby take:('$100' andRun)สิ่งนี้ไม่สำคัญใน Objective-C ที่ต้องใช้วงเล็บเหลี่ยม การสนับสนุนส่วนประกอบตัวเลือกที่ไม่มีพารามิเตอร์จะไม่ช่วยให้เราได้รับประโยชน์มากนักในทุกวิธีการวัดภาษาตามปกติเนื่องจากชื่อวิธีการที่โปรแกรมเมอร์เลือก (เช่นrunWith:แทนที่จะเป็นtake:andRun) ไม่มีผลต่อความหมายเชิงฟังก์ชันของโปรแกรมหรือการแสดงออกของภาษา อันที่จริงโปรแกรมที่มีส่วนประกอบที่ไม่มีพารามิเตอร์นั้นเทียบเท่ากับอัลฟา ดังนั้นฉันจึงไม่สนใจคำตอบที่ระบุว่าคุณลักษณะดังกล่าวไม่จำเป็น (เว้นแต่เป็นเหตุผลที่ระบุไว้ของนักออกแบบ Objective-C ไม่มีใครรู้จัก Brad Cox หรือ Tom Love พวกเขามาที่นี่หรือไม่) หรือที่พูดว่า วิธีการเขียนชื่อเมธอดเพื่อไม่ให้คุณลักษณะนี้จำเป็น ประโยชน์หลักคือความสามารถในการอ่านและความสามารถในการเขียน (ซึ่งก็เหมือนกับความสามารถในการอ่านเพียง ... คุณรู้) เนื่องจากจะหมายความว่าคุณสามารถเขียนชื่อวิธีการที่คล้ายกับประโยคภาษาธรรมชาติได้ …

8
ความเข้มงวดของ Haskell คืออะไร?
เราทุกคนรู้ (หรือควรรู้) ว่า Haskell ขี้เกียจไปโดยปริยาย ไม่มีสิ่งใดถูกประเมินจนกว่าจะต้องประเมิน ดังนั้นเมื่อต้องประเมินบางสิ่งบางอย่าง? มีจุดที่ต้องเข้มงวด Haskell ฉันเรียกสิ่งเหล่านี้ว่า "จุดเข้มงวด" แม้ว่าคำเฉพาะนี้จะไม่แพร่หลายอย่างที่คิด ตามฉัน: ลด (หรือการประเมินผล) ใน Haskell เพียงเกิดขึ้นในจุดที่เข้มงวด ดังนั้นคำถามคือสิ่งที่แม่นยำเป็น Haskell จุดเข้มงวด? สัญชาตญาณของฉันบอกว่าmain, seq/ รูปแบบปังจับคู่รูปแบบและใด ๆIOการดำเนินการดำเนินการผ่านทางmainเป็นประเด็นหลักเข้มงวด แต่ผมไม่ทราบจริงๆว่าทำไมฉันรู้ว่า (ถ้าไม่เรียกว่า "จุดเข้มงวด" จะเรียกว่าอะไร) ฉันคิดว่าคำตอบที่ดีจะรวมถึงการอภิปรายเกี่ยวกับ WHNF และอื่น ๆ ฉันยังคิดว่ามันอาจสัมผัสกับแคลคูลัสแลมบ์ดา แก้ไข: ความคิดเพิ่มเติมเกี่ยวกับคำถามนี้ ดังที่ฉันได้ไตร่ตรองเกี่ยวกับคำถามนี้แล้วฉันคิดว่าการเพิ่มคำจำกัดความของจุดเข้มงวดจะชัดเจนกว่า จุดเข้มงวดอาจมีบริบทที่แตกต่างกันและความลึกที่แตกต่างกัน(หรือความเข้มงวด) ย้อนกลับไปที่คำจำกัดความของฉันที่ว่า "การลดลงของ Haskell เกิดขึ้นที่จุดเข้มงวดเท่านั้น" ขอให้เราเพิ่มคำจำกัดความดังกล่าวในประโยคนี้: "จุดเข้มงวดจะเกิดขึ้นเมื่อมีการประเมินหรือลดบริบทโดยรอบเท่านั้น" ดังนั้นให้ฉันลองให้คุณเริ่มต้นด้วยคำตอบที่ฉันต้องการ mainเป็นจุดเข้มงวด ได้รับการกำหนดเป็นพิเศษให้เป็นจุดเข้มงวดหลักของบริบท: โปรแกรม เมื่อmainมีการประเมินบริบทของโปรแกรมจุดเข้มงวดของ main …

4
เหตุใดเทมเพลตฟังก์ชันจึงไม่สามารถใช้เฉพาะบางส่วนได้
ฉันทราบว่าข้อกำหนดภาษาห้ามมิให้มีความเชี่ยวชาญเฉพาะบางส่วนของเทมเพลตฟังก์ชัน ฉันต้องการทราบเหตุผลว่าทำไมจึงห้าม? พวกเขาไม่มีประโยชน์? template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!

7
ไม่สามารถตั้งค่าแอตทริบิวต์ในอินสแตนซ์ของคลาส "object"
ดังนั้นฉันกำลังเล่นกับ Python ในขณะที่ตอบคำถามนี้และฉันพบว่ามันไม่ถูกต้อง: o = object() o.attr = 'hello' เนื่องจากAttributeError: 'object' object has no attribute 'attr'ไฟล์. อย่างไรก็ตามด้วยคลาสใด ๆ ที่สืบทอดมาจากอ็อบเจ็กต์มันถูกต้อง: class Sub(object): pass s = Sub() s.attr = 'hello' การพิมพ์s.attrแสดง 'สวัสดี' ตามที่คาดไว้ เหตุใดจึงเป็นเช่นนี้ สิ่งใดในข้อกำหนดภาษา Python ระบุว่าคุณไม่สามารถกำหนดแอตทริบิวต์ให้กับออบเจ็กต์วานิลลาได้


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