タグ付けされた質問 「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, world!"_s; どこdecltype(str2)だろうconstexprコンストラクタを。アプローチ1の厄介なバージョンは、次のことができるという事実を利用して実装することが可能です。 template <unsigned Size, const char Array[Size]> struct foo; …

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! //... } とりあえず、ラムダは引数を1つだけ取ると想定できます。 …

4
JavaScriptで動的ゲッター/セッターを実装することは可能ですか?
次のような方法で、名前がすでにわかっているプロパティのゲッターとセッターを作成する方法を知っています。 // 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); // --> "Go away" a.value = …

3
Objective-Cクラス->次のような文字列:[NSArray className]-> @“ NSArray”
クラスオブジェクト自体からクラスの文字列名を取得しようとしています。 // For instance [NSArray className]; // @"NSArray" 私は見つけましたobject_getClassName(id obj)が、それにインスタンスを渡す必要があります。私の場合、それは不必要な作業です。 では、インスタンスではなくクラスオブジェクトから文字列を取得するにはどうすればよいでしょうか。

7
メタプログラミングとは正確には何ですか?
Javaプラットフォームでのployglotプログラミングに関するTheServerSideの記事を読んでいました。記事の一部のコメントでは、メタプログラミングを(おそらくその場で)コードを生成する機能と呼んでいます。 その場でコードを生成する機能、または実行時にメソッドと属性を既存のオブジェクトに挿入する機能(メタデータはPython、Ruby、Groovyなどの動的言語で許可されているもの)ですか。

13
コンパイル時に1 + 2 + 3 +…+ 1000を計算するようにC#、C ++、またはJavaコンパイラを駆動する方法は?
最近のインタビューで、私は本当に奇妙な質問をされました。インタビュアーは、コンパイラー機能だけを使用して1 + 2 + 3 + ... + 1000をどのように計算できるかと尋ねました。つまり、プログラムを作成して実行することはできませんが、コンパイル中にこの合計を計算し、コンパイルが完了したときに結果を出力するようにコンパイラーを駆動できるプログラムを作成する必要があります。ヒントとして、私はコンパイラーのジェネリックとプリプロセッサー機能を使用できると私に言った。C ++、C#、またはJavaコンパイラを使用できます。何か案は??? この質問は、ここでループを行わずに合計を計算することとは関係ありません。また、合計はコンパイル時に計算する必要があることに注意してください。C ++コンパイラ指令を使用して結果だけを出力することはできません。 投稿された回答の詳細を読んで、C ++テンプレートを使用してコンパイル中に問題を解決することをメタプログラミングと呼びます。これは、C ++言語の標準化の過程でErwin Unruh博士によって偶然発見された手法です。このトピックの詳細については、メタプログラミングのWikiページをご覧ください。Javaアノテーションを使用してJavaでプログラムを作成することは可能であるようです。あなたは見てとることができmaressの下に答えを。 C ++でのメタプログラミングに関する素晴らしい本がこれです。興味があれば見てみる価値があります。 有用なC ++メタプログラミングライブラリは、BoostのMPL this linkです。

9
C ++ SFINAEの例?
テンプレートのメタプログラミングについてもっと知りたいです。SFINAEが「置換の失敗はエラーではない」の略であることを知っています。しかし、誰かがSFINAEの良い使い方を私に示すことができますか?

8
C ++テンプレートメタプログラミングのベストイントロダクション?[閉まっている]
閉まっている。この質問はスタックオーバーフローのガイドラインを満たしていません。現在、回答を受け付けていません。 この質問を改善してみませんか?Stack Overflowのトピックとなるように質問を更新します。 3年前休業。 この質問を改善する 静的メタプログラミング(別名「テンプレートメタプログラミング」)は、コンパイル時にプログラムを実行できる優れたC ++テクニックです。この標準的なメタプログラミングの例を読むと、すぐに電球が消えました。 #include <iostream> using namespace std; template< int n > struct factorial { enum { ret = factorial< n - 1 >::ret * n }; }; template<> struct factorial< 0 > { enum { ret = 1 }; }; int main() { cout << …

1
どのようにポニー(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にはすばらしいイントロスペクションとメタプログラミングが組み込まれていることは知っていますが、このライブラリが前処理なしでジェネレータ式を変換する方法を教えてください。魔法のようです。 [更新] ブレンダーは書きました: これがあなたが探しているファイルです。イントロスペクションウィザードを使用してジェネレータを再構築しているようです。Pythonの構文が100%サポートされているかどうかはわかりませんが、これは非常に優れています。–ブレンダー 私は彼らがジェネレータ式プロトコルからいくつかの機能を探っていると思っていましたが、このファイルを見て、ast関連するモジュールを見つけました...いいえ、彼らはその場でプログラムソースを検査していませんね?心が吹く... @BrenBarn:select関数呼び出しの外でジェネレータを呼び出そうとすると、結果は次のようになります。 >>> x = (p for p in Person if p.age > 20) >>> x.next() …


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.