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

Metaprogramming คือความสามารถในการตั้งโปรแกรมสภาพแวดล้อมการเขียนโปรแกรมใหม่เช่นเดียวกับมาโครหรือเมตาคลาสสิก

12
พจนานุกรม Python จากฟิลด์ของวัตถุ
คุณรู้หรือไม่ว่ามีฟังก์ชั่นในตัวเพื่อสร้างพจนานุกรมจากวัตถุใด ๆ ? ฉันต้องการทำสิ่งนี้: >>> class Foo: ... bar = 'hello' ... baz = 'world' ... >>> f = Foo() >>> props(f) { 'bar' : 'hello', 'baz' : 'world' } บันทึก:มันไม่ควรรวมถึงวิธีการ เฉพาะเขตข้อมูล


4
การเรียกใช้เมธอดจากสตริงด้วยชื่อของเมธอดใน Ruby
ฉันจะทำสิ่งที่พวกเขากำลังพูดถึงที่นี่แต่ในทับทิมได้อย่างไร คุณจะทำฟังก์ชั่นบนวัตถุได้อย่างไร? และวิธีการที่คุณจะทำฟังก์ชั่นระดับโลก (ดูคำตอบของ jetxee ในโพสต์ดังกล่าว) รหัสตัวอย่าง: event_name = "load" def load() puts "load() function was executed." end def row_changed() puts "row_changed() function was executed." end #something here to see that event_name = "load" and run load() ปรับปรุง: คุณจะได้รับวิธีการทั่วโลกได้อย่างไร หรือฟังก์ชั่นระดับโลกของฉัน? ฉันลองบรรทัดเพิ่มเติมนี้ puts methods และ load และ row_change โดยไม่แสดงรายการ


5
บรรทัดของโค้ด Python สามารถรู้ระดับการซ้อนของย่อหน้าได้หรือไม่?
จากบางสิ่งเช่นนี้ print(get_indentation_level()) print(get_indentation_level()) print(get_indentation_level()) ฉันต้องการได้รับสิ่งนี้: 1 2 3 รหัสสามารถอ่านตัวเองด้วยวิธีนี้ สิ่งที่ฉันต้องการคือผลลัพธ์จากส่วนที่ซ้อนกันมากขึ้นของรหัสที่จะซ้อนกันมากขึ้น ในทำนองเดียวกับที่ทำให้โค้ดอ่านง่ายขึ้นก็จะทำให้อ่านง่ายขึ้น แน่นอนฉันจะดำเนินการนี้ด้วยตนเองโดยใช้เช่น.format()แต่สิ่งที่ฉันมีในใจเป็นฟังก์ชั่นการพิมพ์ที่กำหนดเองซึ่งจะprint(i*' ' + string)ที่iเป็นระดับเยื้อง นี่จะเป็นวิธีที่รวดเร็วในการสร้างเอาต์พุตที่อ่านได้บนเทอร์มินัลของฉัน มีวิธีที่ดีกว่าในการทำเช่นนี้ซึ่งหลีกเลี่ยงการจัดรูปแบบด้วยตนเองอย่างระมัดระวัง?

15
การประกาศสตริงเวลาคอมไพล์ใน C ++ อย่างสะดวกสบาย
ความสามารถในการสร้างและจัดการสตริงระหว่างเวลาคอมไพล์ใน C ++ มีแอพพลิเคชั่นที่มีประโยชน์มากมาย แม้ว่าจะสามารถสร้างสตริงเวลาคอมไพล์ใน C ++ ได้ แต่กระบวนการนี้ยุ่งยากมากเนื่องจากต้องประกาศสตริงเป็นลำดับตัวแปรของอักขระเช่น using str = sequence<'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!'>; การดำเนินการเช่นการต่อสายอักขระการแยกสตริงย่อยและอื่น ๆ อีกมากมายสามารถนำไปใช้งานได้อย่างง่ายดายเป็นการดำเนินการกับลำดับของอักขระ เป็นไปได้ไหมที่จะประกาศสตริงเวลาคอมไพล์สะดวกกว่า ถ้าไม่มีมีข้อเสนอในผลงานที่อนุญาตให้มีการประกาศสตริงเวลาคอมไพล์ได้อย่างสะดวกหรือไม่? เหตุใดแนวทางที่มีอยู่จึงล้มเหลว ตามหลักการแล้วเราต้องการที่จะสามารถประกาศสตริงเวลาคอมไพล์ได้ดังนี้: // Approach 1 using str1 = sequence<"Hello, world!">; หรือใช้ตัวอักษรที่ผู้ใช้กำหนดเอง // Approach 2 constexpr auto str2 = "Hello, …

4
เป็นไปได้หรือไม่ที่จะหาประเภทพารามิเตอร์และประเภทผลตอบแทนของแลมด้า
เมื่อพิจารณาแลมบ์ดาเป็นไปได้ไหมที่จะหาประเภทพารามิเตอร์และประเภทการส่งคืน ถ้าใช่อย่างไร โดยพื้นฐานแล้วฉันต้องการlambda_traitsที่สามารถใช้ในรูปแบบต่อไปนี้: auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long แรงจูงใจเบื้องหลังคือฉันต้องการใช้lambda_traitsในเทมเพลตฟังก์ชันซึ่งยอมรับแลมบ์ดาเป็นอาร์กิวเมนต์และฉันจำเป็นต้องรู้ว่าเป็นประเภทพารามิเตอร์และประเภทผลตอบแทนภายในฟังก์ชัน: template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... } …

4
เป็นไปได้หรือไม่ที่จะใช้ตัวรับสัญญาณ / ตัวตั้งค่าแบบไดนามิกใน JavaScript
ฉันรู้วิธีสร้าง getters และ setters สำหรับคุณสมบัติที่มีชื่ออยู่แล้วโดยทำสิ่งนี้: // A trivial example: function MyObject(val){ this.count = 0; this.value = val; } MyObject.prototype = { get value(){ return this.count < 2 ? "Go away" : this._value; }, set value(val){ this._value = val + (++this.count); } }; var a = new MyObject('foo'); alert(a.value); // --> …

3
คลาส Objective-C -> สตริงที่ต้องการ: [NSArray className] -> @“ NSArray”
ฉันพยายามรับชื่อสตริงของคลาสจากอ็อบเจกต์คลาสเอง // For instance [NSArray className]; // @"NSArray" ฉันได้พบobject_getClassName(id obj)แต่ที่ต้องมีอินสแตนซ์ถูกส่งผ่านไปและในกรณีของฉันที่ไม่จำเป็นต้องทำงาน ดังนั้นฉันจะได้รับสตริงจากวัตถุคลาสได้อย่างไรไม่ใช่ตัวอย่าง?

7
Metaprogramming คืออะไร?
ผมอ่านบทความเกี่ยวกับ TheServerSide ในการเขียนโปรแกรม ployglot บนแพลตฟอร์ม ความคิดเห็นบางส่วนในบทความอ้างถึง metaprogramming ว่าเป็นความสามารถในการสร้างโค้ด (อาจจะทันที) metaprogramming คือความสามารถในการสร้างโค้ดได้ทันทีหรือเป็นความสามารถในการแทรกเมธอดและแอตทริบิวต์ลงในอ็อบเจ็กต์ที่มีอยู่ในขณะรันไทม์ (เช่นภาษาไดนามิกบางภาษาเช่น Python, Ruby และ Groovy อนุญาต)

9
ตัวอย่าง C ++ SFINAE?
ฉันต้องการเข้าสู่การเขียนโปรแกรมเมตาเทมเพลตเพิ่มเติม ฉันรู้ว่า SFINAE ย่อมาจาก "ความล้มเหลวในการทดแทนไม่ใช่ข้อผิดพลาด" แต่ใครช่วยบอกวิธีใช้ SFINAE ให้ฉันดูหน่อยได้ไหม

13
วิธีการไดรฟ์ C #, C ++ หรือคอมไพเลอร์ Java เพื่อคำนวณ 1 + 2 + 3 + ... + 1000 ในเวลาคอมไพล์?
ในการสัมภาษณ์ล่าสุดฉันถูกถามคำถามแปลก ๆ ผู้สัมภาษณ์ถามฉันว่าฉันจะคำนวณ 1 + 2 + 3 + ... + 1000 โดยใช้คุณสมบัติคอมไพเลอร์ได้อย่างไร ซึ่งหมายความว่าฉันไม่ได้รับอนุญาตให้เขียนโปรแกรมและเรียกใช้งาน แต่ฉันควรเขียนโปรแกรมที่สามารถขับเคลื่อนคอมไพเลอร์ให้คำนวณผลรวมนี้ในขณะที่คอมไพล์และพิมพ์ผลลัพธ์เมื่อการคอมไพล์เสร็จสิ้น เขาบอกฉันว่าฉันอาจใช้ generics และคุณสมบัติ pre-processor ของคอมไพเลอร์ เป็นไปได้ที่จะใช้คอมไพเลอร์ C ++, C # หรือ Java ความคิดใด ๆ ??? คำถามนี้ไม่เกี่ยวข้องกับการคำนวณผลรวมโดยไม่มีการวนซ้ำใด ๆ ที่ถามที่นี่ นอกจากนี้ควรสังเกตว่าควรคำนวณผลรวมระหว่างการคอมไพล์ ไม่สามารถพิมพ์เฉพาะผลลัพธ์โดยใช้คำสั่งคอมไพเลอร์ C ++ อ่านข้อมูลเพิ่มเติมเกี่ยวกับคำตอบโพสต์ที่ฉันพบว่าการแก้ปัญหาที่เกิดขึ้นในระหว่างการรวบรวมโดยใช้ C ++ แม่แบบที่เรียกว่าmetaprogramming นี่เป็นเทคนิคที่ดร. เออร์วินอุนรูห์ค้นพบโดยบังเอิญระหว่างกระบวนการสร้างมาตรฐานภาษา C ++ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับหัวข้อนี้ในหน้าวิกิพีเดียของ meta-การเขียนโปรแกรม ดูเหมือนว่าจะสามารถเขียนโปรแกรมใน Java โดยใช้คำอธิบายประกอบจาวา …

8
แนะนำที่ดีที่สุดสำหรับการเขียนโปรแกรมแม่แบบ C ++? [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน3 ปีที่ผ่านมา ปรับปรุงคำถามนี้ Static metaprogramming (aka "template metaprogramming") เป็นเทคนิค C ++ ที่ยอดเยี่ยมที่ช่วยให้สามารถเรียกใช้โปรแกรมได้ในเวลาคอมไพล์ หลอดไฟดับลงในหัวของฉันทันทีที่ฉันอ่านตัวอย่างการเขียนโปรแกรมเมตาแบบบัญญัตินี้: #include <iostream> using namespace std; template< int n > struct factorial { enum { ret = factorial< n - 1 >::ret * n }; }; template<> struct factorial< 0 > …

1
Pony (ORM) มีลูกเล่นอย่างไร?
Pony ORMเป็นเคล็ดลับที่ดีในการแปลงนิพจน์ตัวสร้างเป็น SQL ตัวอย่าง: >>> select(p for p in Person if p.name.startswith('Paul')) .order_by(Person.name)[:2] SELECT "p"."id", "p"."name", "p"."age" FROM "Person" "p" WHERE "p"."name" LIKE "Paul%" ORDER BY "p"."name" LIMIT 2 [Person[3], Person[1]] >>> ฉันรู้ว่า Python มีการวิปัสสนาและ metaprogramming ที่ยอดเยี่ยมในตัว แต่ไลบรารีนี้สามารถแปลนิพจน์ตัวสร้างโดยไม่ต้องประมวลผลล่วงหน้าได้อย่างไร ดูเหมือนเวทมนตร์ [อัปเดต] Blender เขียนว่า: นี่คือไฟล์ที่คุณต้องการ ดูเหมือนว่าจะสร้างเครื่องกำเนิดไฟฟ้าขึ้นมาใหม่โดยใช้วิซาร์ดการวิปัสสนา ฉันไม่แน่ใจว่ามันรองรับไวยากรณ์ของ Python ได้ 100% หรือเปล่า แต่มันค่อนข้างเจ๋ง …

6
ฉันจะใช้ define_method เพื่อสร้างเมธอดคลาสได้อย่างไร
สิ่งนี้มีประโยชน์หากคุณพยายามสร้าง class method metaprogramatically: def self.create_methods(method_name) # To create instance methods: define_method method_name do ... end # To create class methods that refer to the args on create_methods: ??? end คำตอบของฉันที่จะติดตาม ...

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