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

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

11
รวบรวมการแฮชสตริงเวลา
ฉันได้อ่านในที่ต่างๆไม่กี่แห่งว่าการใช้ตัวอักษรสตริงใหม่ของ C ++ 11 อาจเป็นไปได้ที่จะคำนวณแฮชของสตริงในเวลาคอมไพล์ อย่างไรก็ตามดูเหมือนจะไม่มีใครพร้อมที่จะออกมาพูดว่ามันจะเป็นไปได้หรือจะทำได้อย่างไร เป็นไปได้หรือไม่ ตัวดำเนินการจะมีลักษณะอย่างไร? ฉันสนใจเป็นพิเศษกรณีการใช้งานเช่นนี้ void foo( const std::string& value ) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } } หมายเหตุ: ฟังก์ชันแฮชเวลาคอมไพล์ไม่จำเป็นต้องมีลักษณะตรงตามที่ฉันเขียนไว้ ฉันพยายามอย่างดีที่สุดที่จะเดาว่าทางออกสุดท้ายจะเป็นอย่างไร แต่meta_hash<"string"_meta>::valueก็อาจเป็นทางออกที่ใช้ได้

2
รับค่าของตัวแปรอินสแตนซ์ที่กำหนดชื่อ
โดยทั่วไปฉันจะอ้างอิงถึงวัตถุที่มีชื่อในสตริงได้อย่างไร โดยเฉพาะอย่างยิ่งฉันมีรายการชื่อพารามิเตอร์ (ตัวแปรสมาชิก - สร้างขึ้นแบบไดนามิกดังนั้นฉันจึงไม่สามารถอ้างถึงโดยตรงได้) พารามิเตอร์แต่ละตัวเป็นออบเจ็กต์ที่มีไฟล์ from_sวิธีการ ฉันต้องการทำสิ่งต่อไปนี้ (ซึ่งแน่นอนว่าไม่ได้ผล ... ): define_method(:from_s) do | arg | @ordered_parameter_names.each do | param | instance_eval "field_ref = @#{param}" field_ref.from_s(param) end end

4
ฉันจะแปลงชื่อคลาส Ruby เป็นสัญลักษณ์ที่คั่นด้วยขีดล่างได้อย่างไร
ฉันจะเปลี่ยนชื่อคลาสFooBarเป็นสัญลักษณ์โดยทางโปรแกรมได้:foo_barอย่างไร เช่นอะไรทำนองนี้ แต่ที่จับอูฐอย่างถูกต้อง? FooBar.to_s.downcase.to_sym

4
Ruby Metaprogramming: ชื่อตัวแปรอินสแตนซ์แบบไดนามิก
สมมติว่าฉันมีแฮชต่อไปนี้: { :foo => 'bar', :baz => 'qux' } ฉันจะตั้งค่าคีย์และค่าแบบไดนามิกให้กลายเป็นตัวแปรอินสแตนซ์ในออบเจ็กต์ได้อย่างไร ... class Example def initialize( hash ) ... magic happens here... end end ... ดังนั้นฉันจึงจบลงด้วยสิ่งต่อไปนี้ในโมเดล ... @foo = 'bar' @baz = 'qux' เหรอ?

4
แอตทริบิวต์ __dict __.__ dict__ ของคลาส Python คืออะไร?
>>> class A(object): pass ... >>> A.__dict__ <dictproxy object at 0x173ef30> >>> A.__dict__.__dict__ Traceback (most recent call last): File "<string>", line 1, in <fragment> AttributeError: 'dictproxy' object has no attribute '__dict__' >>> A.__dict__.copy() {'__dict__': <attribute '__dict__' of 'A' objects> ... } >>> A.__dict__['__dict__'] <attribute '__dict__' of 'A' objects> # What …

30
Python กับ Ruby สำหรับ metaprogramming [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา ปัจจุบันฉันเป็นโปรแกรมเมอร์Dเป็นหลักและต้องการเพิ่มภาษาอื่นในกล่องเครื่องมือของฉันโดยเฉพาะอย่างยิ่งภาษาที่รองรับการแฮ็ก metaprogramming ซึ่งไม่สามารถทำได้ในภาษาที่คอมไพล์แบบคงที่เช่น D ฉันได้อ่านเกี่ยวกับ Lisp นิดหน่อยและฉันชอบที่จะหาภาษาที่อนุญาตให้มีสิ่งดีๆที่ Lisp ทำ แต่ไม่มีไวยากรณ์แปลก ๆ ฯลฯ ของ Lisp ฉันไม่ต้องการเริ่มสงครามเปลวไฟทางภาษาและฉันแน่ใจว่าทั้ง Ruby และ Python มีข้อแลกเปลี่ยนกันดังนั้นฉันจะแสดงรายการสิ่งที่สำคัญสำหรับฉันเป็นการส่วนตัว โปรดบอกฉันว่า Ruby, Python หรือภาษาอื่น ๆ จะดีที่สุดสำหรับฉัน สำคัญ: metaprogramming ที่ดี ความสามารถในการสร้างคลาสเมธอดฟังก์ชัน ฯลฯ ที่รันไทม์ โดยเฉพาะอย่างยิ่งความแตกต่างเพียงเล็กน้อยระหว่างรหัสและข้อมูลลักษณะเสียงกระเพื่อม ไวยากรณ์ที่ดีสะอาดมีเหตุผลและความหมายที่ใช้งานง่ายสม่ำเสมอ โดยพื้นฐานแล้วเป็นภาษาสมัยใหม่ที่มีความคิดดีสนุกสนานและใช้งานง่าย หลายกระบวนทัศน์ ไม่มีกระบวนทัศน์ใดที่เหมาะสมสำหรับทุกโครงการหรือแม้แต่ทุกปัญหาย่อยภายในโครงการ ภาษาที่น่าสนใจซึ่งมีผลต่อวิธีคิดเกี่ยวกับการเขียนโปรแกรม ค่อนข้างสำคัญ: ประสิทธิภาพ. คงจะดีถ้าประสิทธิภาพดี แต่เมื่อประสิทธิภาพเป็นสิ่งสำคัญอย่างแท้จริงฉันจะใช้ D …


3
ดำเนินการฟังก์ชันภายในเทมเพลตฟังก์ชันเฉพาะสำหรับประเภทที่มีฟังก์ชันกำหนดไว้เท่านั้น
ฉันมีเทมเพลตฟังก์ชั่นที่ใช้หลายประเภทเนื่องจากอินพุต มีเพียงหนึ่งประเภทเท่านั้นที่มีgetInt()ฟังก์ชัน ดังนั้นฉันต้องการรหัสเพื่อเรียกใช้ฟังก์ชันเฉพาะสำหรับประเภทนั้น กรุณาแนะนำวิธีแก้ปัญหา ขอบคุณ #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.