คำถามติดแท็ก macros

มาโครใช้เพื่อสร้างลำดับของคำสั่งการคำนวณที่พร้อมใช้งานสำหรับโปรแกรมเมอร์เป็นคำสั่งโปรแกรมเดียวทำให้งานการเขียนโปรแกรมไม่น่าเบื่อและเกิดข้อผิดพลาดน้อยลง [

7
ทำไมมาโครไม่รวมอยู่ในภาษาการเขียนโปรแกรมที่ทันสมัยที่สุด?
ฉันรู้ว่าพวกเขานำมาใช้อย่างไม่ปลอดภัยใน C / C ++ พวกเขาไม่สามารถนำไปใช้ในทางที่ปลอดภัยยิ่งขึ้น? ข้อเสียของมาโครนั้นแย่มากพอที่จะเทียบกับพลังมหาศาลที่พวกเขามีให้หรือไม่?

2
ต้นกำเนิดของ C Preprocessor คืออะไร
ตัวประมวลผลล่วงหน้า C เชื่อมต่อกับ C แต่มีไวยากรณ์ที่แตกต่างอย่างสิ้นเชิงจากภาษาหลัก: ช่องว่างที่มีความสำคัญทางไวยากรณ์ (จุดสิ้นสุดของบรรทัดยกเลิกคำสั่งช่องว่างหลังจากแมโครกำหนดจุดเริ่มต้นของรายการการแทนที่) บล็อกที่ใช้คำหลักแทนที่จะเป็นบล็อกที่มีเครื่องหมายค้ำยันelifแทนelse if คำจำกัดความที่นำโดยคำหลักแทนการประกาศ - สะท้อน - ใช้ไม่มี=สำหรับการกำหนดค่า คำแนะนำของไวยากรณ์สตริงทางเลือก ( #include <>vs #include "") การประเมินผลที่ขี้เกียจ (จาก C, ชัด ๆ แต่6.10.3.1สามารถอ่านได้โดยอ้างถึงคำสั่งเฉพาะของการขยายตัวของแมโครเช่นกันในบางแห่งที่มีความสำคัญ) มันดูไม่เหมือน C เลย! ในทางเทคนิคแล้วมันเป็นภาษาของตัวเอง แต่มันถูกใช้เป็นส่วนสำคัญเกือบทั้งหมดของ C และดูเหมือนว่าแปลกมากที่มันจะไม่รวมเข้ากับ syntactically Wikipedia ไม่ได้พูดถึงประวัติของมัน Portland Pattern Repository ได้กล่าวถึงการผ่านแต่ไม่ได้มีรายละเอียดนอกเหนือจากข้อเท็จจริงที่ว่ามันถูกออกแบบโดยคนอื่นนอกเหนือจากส่วนที่เหลือของเว็บไซต์ C. Dennis Ritchie ที่มีประวัติของ C อาจมีคำตอบ แต่น่าเสียดายที่ไม่มี ใช้ได้อีกต่อไป ในฐานะที่เป็นเครื่องมือมาโครก็เห็นได้ชัดว่ามีความหมายแตกต่างกันมากจากภาษารันไทม์ซึ่งจะอธิบายบางอย่างที่แตกต่างกัน แต่ไม่ได้ด้านการออกแบบภาพ …
30 c  history  macros 

5
เทมเพลต C ++ เป็นเพียงแมโครชนิดหนึ่งที่ได้รับการยกย่องหรือไม่?
จากการเปรียบเทียบที่แตกต่างกันระหว่างเทมเพลต C ++ และเจเนอรัล C # / Java เช่นนี้ - /programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 ฉันเข้าใจว่ามีการใช้เทมเพลต C ++ โดยการประมวลผลล่วงหน้าบางอย่าง (การแทนที่ข้อความธรรมดาก่อนการแยกวิเคราะห์) ไม่ได้รวบรวม เนื่องจากการตรวจสอบชนิดในเทมเพลต C ++ มีลักษณะคล้ายกับมาโคร C ฉันหมายความว่าหากมีข้อผิดพลาดบางอย่างพวกเขาเป็นข้อผิดพลาดจากรหัสที่สร้างขึ้นหลังจากการประมวลผลบล็อกรหัส templated ไม่ใช่จากแม่แบบเอง กล่าวอีกนัยหนึ่งมันเป็นแค่มาโครระดับสูงในซี จากนั้นฉันก็พบข้อเท็จจริงอื่น ๆ ที่สนับสนุนสิ่งนี้ - ฉันคิดว่าถ้ามีการใช้เทมเพลต C ++ โดยการประมวลผลล่วงหน้าจะมีปัญหากับการเชื่อมโยงแบบไดนามิก (โดยใช้. dll) และ googling ที่รวดเร็วสนับสนุนสิ่งนี้ อีกจุดคือค่าคงที่จำนวนเต็มสามารถส่งผ่านเป็นอาร์กิวเมนต์ไปยังเทมเพลต และมันยังรองรับการเรียกซ้ำบางประเภท แต่การเรียกซ้ำนี้ไม่พบในรหัสแอสเซมบลีที่รวบรวม / เครื่อง สิ่งที่เรียกซ้ำได้รับการจัดการในเวลารวบรวมโดยการสร้างฟังก์ชั่นสำหรับทุกการโทรซ้ำและจึงมีไบนารีที่ปฏิบัติการขนาดใหญ่ แต่เร็วกว่า แม้ว่าจะแตกต่างจากแมโคร C แต่มีความสามารถที่เหนือกว่า แต่เท็มเพลต …
27 c++  c  compiler  templates  macros 

6
แมโคร Lisp มีประโยชน์อย่างไร
Common Lisp ช่วยให้คุณสามารถเขียนมาโครที่ทำสิ่งแปลงแหล่งที่คุณต้องการ Scheme ช่วยให้คุณมีระบบจับคู่รูปแบบที่ถูกสุขลักษณะที่ให้คุณทำการแปลงได้เช่นกัน มาโครมีประโยชน์อย่างไรในทางปฏิบัติ Paul Graham กล่าวในการเอาชนะค่าเฉลี่ยที่: ซอร์สโค้ดของเครื่องมือแก้ไข Viaweb น่าจะเป็นมาโครประมาณ 20-25% สิ่งที่ผู้คนทำลงเอยด้วยมาโครจริง ๆ แล้วมีอะไรบ้าง?
22 lisp  scheme  macros 

4
ถ้ามี LISP จะทำให้การใช้ระบบมาโครง่ายขึ้นได้อย่างไร
ฉันเรียนรู้ Scheme จากSICPและฉันได้รับความประทับใจว่าส่วนใหญ่ของสิ่งที่ทำให้ Scheme และยิ่งกว่านั้น LISP พิเศษคือระบบมาโคร แต่เนื่องจากมาโครถูกขยายในเวลาคอมไพล์ทำไมคนไม่สร้างระบบมาโครที่เทียบเท่าสำหรับ C / Python / Java / อะไร ตัวอย่างเช่นเราสามารถผูกpythonคำสั่งexpand-macros | pythonหรืออะไรก็ได้ รหัสจะยังสามารถพกพาได้สำหรับผู้ที่ไม่ได้ใช้ระบบมาโครใครจะขยายมาโครก่อนที่จะเผยแพร่รหัส แต่ฉันไม่รู้อะไรเลยนอกจากเทมเพลตใน C ++ / Haskell ซึ่งฉันรวบรวมไม่เหมือนกันจริงๆ ถ้ามี LISP จะทำให้การใช้ระบบมาโครง่ายขึ้นได้อย่างไร

1
เหตุใด C ไลบรารีใช้แมโครและฟังก์ชันที่มีชื่อเดียวกัน
ฉันกำลังอ่าน 'ห้องสมุดมาตรฐาน C' โดย PJ Plauger ซึ่งน่าสนใจจริงๆ หนังสือเล่มนี้ไม่เพียง แต่อธิบายวิธีการใช้ห้องสมุด แต่ยังอธิบายถึงวิธีการนำไปใช้งาน ฉันอ่านctype.hส่วนเสร็จแล้วและในส่วนหัวฟังก์ชั่นจะประกาศเป็นทั้งมาโครและฟังก์ชั่น ตัวอย่างเช่น int isdigit(int); แต่ยัง #define isdigit(c) (_Ctype[(int)(c)] & _DI) ฉันไม่เข้าใจว่าทำไมใช้ทั้งคู่ นอกจากนี้ถ้าฉันพยายามสร้างctypeส่วนหัวที่กำหนดเองและการนำไปใช้ใหม่ฉันสามารถรวบรวมได้สำเร็จถ้าฉันลบแมโครออก (ใส่เครื่องหมายความคิดเห็นในการกำหนด) แง่มุมนี้ไม่ได้อธิบายในหนังสือ ใครช่วยอธิบายหน่อยได้ไหม?
20 c  naming  functions  macros 

19
ภาษาการเขียนโปรแกรมที่มีกลไกการขยายไวยากรณ์คล้าย Lisp [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงอภิปรายโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันมีความรู้ จำกัด ใน Lisp (พยายามที่จะเรียนรู้เล็กน้อยในเวลาว่างของฉัน) แต่เท่าที่ฉันเข้าใจมาโคร Lisp อนุญาตให้แนะนำการสร้างภาษาใหม่และไวยากรณ์โดยการอธิบายพวกเขาใน Lisp เอง ซึ่งหมายความว่าสามารถเพิ่มการสร้างใหม่เป็นไลบรารีโดยไม่ต้องเปลี่ยน Lisp คอมไพเลอร์ / ล่าม วิธีนี้แตกต่างจากภาษาโปรแกรมอื่นมาก เช่นถ้าฉันต้องการขยาย Pascal ด้วยลูปชนิดใหม่หรือสำนวนเฉพาะบางอย่างฉันจะต้องขยายไวยากรณ์และความหมายของภาษาแล้วนำคุณสมบัติใหม่นั้นมาใช้ในคอมไพเลอร์ มีภาษาการเขียนโปรแกรมอื่น ๆ นอกตระกูล Lisp (เช่นนอกเหนือจาก Common Lisp, Scheme, Clojure (?), Racket (?), ฯลฯ ) ที่มีความเป็นไปได้ที่คล้ายคลึงกันในการขยายภาษาภายในภาษานั้นหรือไม่ แก้ไข โปรดหลีกเลี่ยงการอภิปรายเพิ่มเติมและเฉพาะเจาะจงในคำตอบของคุณ แทนที่จะเป็นรายการที่มีความยาวของภาษาโปรแกรมที่สามารถขยายออกไปไม่ทางใดก็ทางหนึ่งฉันต้องการที่จะเข้าใจจากมุมมองเชิงความคิดเกี่ยวกับมาโคร Lisp เฉพาะที่เป็นกลไกการขยายและภาษาที่ไม่ใช่ Lisp เสนอแนวคิดบางอย่าง ที่ใกล้กับพวกเขา

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

4
Python decorators และ Lisp macros
เมื่อมองนักตกแต่งงูหลามที่มีคนสร้างคำกล่าวไว้พวกเขามีพลังเทียบเท่ากับมาโคร Lisp (โดยเฉพาะ Clojure) ดูตัวอย่างที่ให้ไว้ในPEP 318ดูเหมือนกับฉันราวกับว่าพวกเขาเป็นเพียงวิธีการที่ยอดเยี่ยมในการใช้ฟังก์ชั่นลำดับสูงแบบเก่าใน Lisp: def attrs(**kwds): def decorate(f): for k in kwds: setattr(f, k, kwds[k]) return f return decorate @attrs(versionadded="2.2", author="Guido van Rossum") def mymethod(f): ... ฉันไม่ได้เห็นรหัสใด ๆ เปลี่ยนในใด ๆ ของตัวอย่างเช่นที่อธิบายไว้ในกายวิภาคของมาโคร Clojure พลัส ธ หายไปhomoiconicity อาจทำให้การแปลงรหัสเป็นไปไม่ได้ ดังนั้นทั้งสองเปรียบเทียบกันอย่างไรและคุณสามารถบอกได้ว่าพวกเขามีความเท่าเทียมกันในสิ่งที่คุณสามารถทำได้? หลักฐานดูเหมือนจะชี้ไปที่มัน แก้ไข:จากความคิดเห็นฉันกำลังมองหาสองสิ่ง: การเปรียบเทียบ "มีประสิทธิภาพเท่ากับ" และ "เป็นเรื่องง่ายที่จะทำสิ่งที่ยอดเยี่ยมด้วย"
18 python  lisp  clojure  macros 

3
การใช้มาโคร C / C ++ เป็นทางลัดสำหรับการคอมไพล์แบบมีเงื่อนไขหรือไม่?
สมมติว่าฉันต้องการมีข้อความเอาต์พุตหลายประเภทในรหัสของฉัน หนึ่งในนั้นคือDEBUGซึ่งจะถูกพิมพ์เท่านั้นเมื่อรวบรวมรหัสในโหมด Debug โดยปกติฉันจะต้องเขียนบางอย่างเช่น #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif ซึ่งค่อนข้างยุ่งยากและน่ารำคาญในหลาย ๆ ที่ เป็นวิธีปฏิบัติที่ดีในการกำหนดแมโครสำหรับข้อมูลโค้ดดังนั้นคุณจะใช้วิธีนี้หรือไม่ MSG_DEBUG("Debug message") หรือมีวิธีอื่นที่สวยงามกว่าวิธีจัดการกับมันโดยไม่มีมาโคร ฉันสนใจโซลูชันที่เป็นไปได้ทั้งใน C และ C ++ เนื่องจากฉันใช้ทั้งสองภาษาในโครงการที่แตกต่างกัน
13 c++  c  macros 

1
สิ่งที่เป็นปัญหาในทางปฏิบัติเป็นผลมาจากการขาดแมโครที่ถูกสุขอนามัยใน Clojure?
ฉันเคยได้ยินมาโคร Clojure นั้นเขียนได้ง่ายกว่า แต่ไม่น่าเชื่อถือเท่ากับแมโครที่ถูกสุขอนามัยของ Racket คำถามของฉันมี 2 ส่วน: วิธีการที่ไม่gensymแตกต่างจากแมโครที่ถูกสุขอนามัย? มาโคร Racket ให้อะไรที่ Clojure ทำไม่ได้? (ไม่ว่าจะเป็นความปลอดภัยการประกอบหรืออะไรก็ได้)

3
การทอโค้ด Byte กับ Lisp แมโคร
ฉันได้อ่านเกี่ยวกับห้องสมุดที่ผู้คนเขียนสำหรับภาษาอย่าง Java และ C # ซึ่งใช้ประโยชน์จากรหัสไบต์ที่ทอผ้าเพื่อทำสิ่งต่าง ๆ เช่นการตัดการเรียกใช้ฟังก์ชันการแทรกรหัสการบันทึก ฯลฯ ฉันได้อ่านมาโคร Lisp / Clojure ด้วย พยายามเข้าใจวิธีการใช้งานให้ดีขึ้น ยิ่งฉันอ่านมาโครมากเท่าไหร่ก็ยิ่งมีความสามารถในการทำงานเหมือนกับไลบรารีการทอโค้ดไบต์ โดยฟังก์ชั่นฉันหมายถึงความสามารถในการจัดการรหัสในเวลารวบรวม ตัวอย่างของห้องสมุดที่ฉันดูอยู่จะเป็น AspectJ, PostSharp และ Cecil มีสิ่งใดบ้างที่สามารถทำได้กับสิ่งหนึ่งและอีกอันหนึ่งไม่ใช่หรือ พวกเขาแก้ปัญหาเดียวกันได้จริงหรือฉันกำลังเปรียบเทียบแอปเปิ้ลกับส้ม?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.