タグ付けされた質問 「macros」

マクロは、一連のコンピューティング命令を単一のプログラムステートメントとしてプログラマーが利用できるようにするために使用され、プログラミングタスクを面倒でエラーが発生しにくくします。[


2
Cプリプロセッサの起源は何ですか?
CプリプロセッサはCに接続されていますが、メイン言語とはまったく異なる構文を持っています。 構文的に重要な空白(行の終わりはステートメントを終了し、マクロが置換リストの開始を決定した後のギャップ) キーワードベースの代わりにブレースブロックのブロック、elif代わりにelse if 宣言-反映-使用の代わりにキーワード主導の定義=、値の定義は不可 代替文字列構文のヒント(#include <>vs #include "") 怠evaluationな評価(Cのことは明らかですが、6.10.3.1は、重要ないくつかの場所で、マクロ展開の特定の順序を暗示していると読むこともできます) まったくCのようには見えません!技術的には独自の言語ですが、常にCのほぼ統合された部分として使用されており、構文的に統合されないことは非常に奇妙に思えます。 ウィキペディアはその歴史について語っていません。Portland Pattern Repository にはパスの言及がありますが、Cの歴史を持つ他の人々によって設計されたという事実を超えて詳細に説明することはありません。より長く利用可能。 マクロエンジンとして、それは明らかに説明するだろうランタイム言語から非常に異なる意味があるいくつかの違いがではなく、視覚的なデザインの側面を(それがもともとあるものとして意図されていたかどうかも現代の目には不明だが可能なの種類の楽しみのこと置換システムでは、強力なオプティマイザーが登場する前に関数をインライン化するための「単なる」適切な方法であったか、またはそうであったかを確認できます。Cのようなセマンティクスが実際に出発点だった場合、最終的にC ++テンプレートになったものに近いものがマクロに向かってより論理的な進化を遂げたように感じますが、構文に関するよりも具体的な証拠はありません。 なぜこのように設計されたのか、クリエイターの影響がどのようなものだったのかについての記録はありますか?
30 c  history  macros 

5
C ++テンプレートは単なるマクロの一種ですか?
このようなC ++テンプレートとC#/ Javaジェネリックのさまざまな比較から、 https://stackoverflow.com/questions/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 C ++テンプレートは、コンパイルではなく、何らかの種類の前処理(解析前のプレーンテキスト置換)によって実装されているという認識を得ました。C ++テンプレートの型チェックはCマクロに似ているためです。エラーがある場合、それらはテンプレート自体からではなく、テンプレートコードブロックを処理した後に生成されたコードからのエラーです。言い換えれば、それらはCのマクロの一種の上位バージョンにすぎません。 次に、これをサポートする他のいくつかの事実を見つけました- C ++テンプレートが前処理によって実装される場合、動的リンク(.dllを使用)に問題があると思いました。そして、クイックグーグルがこれをサポートしました。 もう1つのポイントは、整数定数を引数としてテンプレートに渡すことができるということです。また、何らかの再帰をサポートします。ただし、この再帰は、コンパイルされたアセンブリ/マシンコードにはありません。再帰的なことは、すべての再帰呼び出しに対して関数を生成することにより、コンパイル時に管理されます。したがって、より大きく、より高速な実行可能バイナリを持ちます。 Cマクロとは異なりますが、いくつかの優れた機能があります。しかし、C ++テンプレートは何らかの前処理で実装されていませんか?これは異なるC ++コンパイラでどのように実装されていますか?
27 c++  c  compiler  templates  macros 

6
Lispマクロはどれほど便利ですか?
Common Lispでは、必要なソース変換を行うマクロを作成できます。 Schemeは、変換も実行できる衛生的なパターンマッチングシステムを提供します。マクロは実際にどの程度役立ちますか?ポール・グラハムは、ビーティング・ザ・アベレージズで次のように述べています: Viawebエディターのソースコードは、おそらく20〜25%のマクロでした。 実際に人々はどのようなことをマクロでやっていますか?
22 lisp  scheme  macros 

4
LISPがあれば、マクロシステムの実装を容易にしますか?
私はSICPからSchemeを学んでいますが、Schemeを作るものの大きな部分、さらにLISPが特別なのはマクロシステムであるという印象を受けています。しかし、マクロはコンパイル時に拡張されるので、C / Python / Java / whateverに同等のマクロシステムを作成しないのはなぜですか?たとえば、pythonコマンドをexpand-macros | python何にでもバインドできます。このコードは、マクロシステムを使用しないユーザーにも移植可能です。コードを公開する前にマクロを拡張するだけです。しかし、私が収集したC ++ / Haskellのテンプレートを除いて、私はそのようなものを知りません。実際には同じではありません。LISPがあれば、マクロシステムの実装を容易にしますか?

1
Cライブラリが同じ名前のマクロと関数を使用するのはなぜですか?
PJ Plaugerの「The Standard C Library」を読んでいますが、これは本当に興味深いです。この本では、ライブラリの使用方法だけでなく、ライブラリの実装方法についても説明しています。 ctype.hセクションを読み終え、ヘッダーで関数がマクロと関数の両方として宣言されています。例えば int isdigit(int); だけでなく #define isdigit(c) (_Ctype[(int)(c)] & _DI) 両方が使用される理由がわかりませんか? また、独自のカスタムを再作成しようとすると ctypeヘッダーと実装とすると、マクロを削除する(定義をコメントアウトする)場合にのみ正常にコンパイルできます。 この側面は本で実際に説明されていませんでした。誰か説明してもらえますか?
20 c  naming  functions  macros 

19
Lispのような構文拡張メカニズムを備えたプログラミング言語[非公開]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 7年前に閉鎖されました。 Lispの知識は限られています(暇なときに少し学ぼうとしています)が、Lispマクロを理解する限り、Lisp自体で記述することで、新しい言語構造と構文を導入できます。これは、Lispコンパイラ/インタプリタを変更せずに、新しい構成をライブラリとして追加できることを意味します。 このアプローチは、他のプログラミング言語のアプローチとは大きく異なります。たとえば、Pascalを新しい種類のループまたは特定のイディオムで拡張する場合、言語の構文とセマンティクスを拡張してから、コンパイラにその新しい機能を実装する必要があります。 Lispファミリー以外のプログラミング言語(Common Lisp、Scheme、Clojure(?)、Racket(?)など)以外に、言語内で言語を拡張する同様の可能性を提供するプログラミング言語はありますか? 編集 長時間の議論を避け、答えを具体的にしてください。何らかの方法で拡張できるプログラミング言語の長いリストの代わりに、概念的な観点から、拡張メカニズムとしてのLispマクロに固有のものと、どの非Lispプログラミング言語がいくつかの概念を提供するかを理解したいそれは彼らに近いです。

2
Lispマクロの典型的な用途は何ですか?
私はいくつかのLISPを学ぼうとしていますが、LISPマクロの重要性について多くのことを読みましたので、それらを使った実務経験を得たいと思います。 マクロを使用して実際の問題を解決し、このプログラミング構成の有用性を理解できる実用的なアプリケーション領域を提案できますか? 注意 これは一般的なプロジェクトではなく、次の質問を行うべきプロジェクトです。LISPマクロを使用して通常どのような問題が解決されるかを理解したいと思っています。たとえば、抽象データ型の実装に適していますか?なぜこのコンストラクトが言語に追加されたのですか?単純な機能では解決できない、どのような問題を解決しますか?

4
PythonデコレータとLispマクロ
Pythonデコレータを見ると、誰かが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マクロの構造」で説明されているように、どの例でもコードの変換は見ていません。さらに、Pythonの欠落した同質 性により、コード変換が不可能になる可能性があります。 それで、これら2つはどのように比較されますか。証拠はそれに反対するようです。 編集:コメントに基づいて、私は2つのことを探しています:「できるだけ強力」と「素晴らしいものを簡単に実行できる」との比較。
18 python  lisp  clojure  macros 

3
条件付きコンパイルのショートカットとしてC / C ++マクロを使用するのは良い習慣ですか?
コードにいくつかのタイプの出力メッセージが必要だとしましょう。それらの1つはDEBUG、コードがデバッグモードでコンパイルされたときにのみ出力されます。 通常私は #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif これはかなり面倒で、多くの場所で使用するのは面倒です。 コードスニペットのマクロを定義することをお勧めします。このように使用しますか? MSG_DEBUG("Debug message") または、マクロなしでそれを処理する他のよりエレガントな方法はありますか?異なるプロジェクトで両方の言語を使用しているため、CとC ++の両方で可能なソリューションに興味があります。
13 c++  c  macros 

1
Clojureに衛生的なマクロがないことから生じる実際的な問題は何ですか?
Clojureマクロは簡単に記述できますが、ラケットの衛生的なマクロほど信頼性が低いと聞きました。私の質問には2つの部分があります。 gensym衛生マクロとどう違うのですか? ラケットマクロは、Clojureにはないものを何を提供しますか?(安全性、構成可能性など)

3
バイトコードウィービング対Lispマクロ
私は、関数呼び出しのインターセプト、ロギングコードの挿入などを行うためにバイトコードウィービングを使用するJavaやC#のような言語用に書かれたライブラリについて読んでいます。それらの利用方法をよりよく理解しようとする。マクロについてよく読めば読むほど、マクロがバイトコードウィービングライブラリと同じ種類の機能を提供するように見えます。機能とは、コンパイル時にコードを操作できることを意味します。 私が見ているライブラリの例は、AspectJ、PostSharp、Cecilです。 片方でできること、もう片方ではできないことはありますか?彼らは実際に同じ問題を解決していますか、それともリンゴとオレンジを比較していますか?

3
プログラミング言語でのマクロサポートは有害と見なされますか?
Cで私の頭に浮かぶ最初の乱用は: #define if while しかし同時に、正しく使用すると非常に便利で強力です。 Common Lispマクロでも同様のことが起こります。 すべてのプログラミング言語がこのようなマクロをサポートしていないのはなぜですか? 彼らは有害だと考えられていますか?

3
関数ではなくマクロが必要になるのはいつですか?
私はClojureを初めて使用し、Macrosを初めて使用します。Lispの経験はありません。私はフォームのような自分のスイッチケースを作成し続け、これで終わりました: (defmacro switch-case [v cases default] (if (cases v) (cases v) default )) そして、関数を作ってみて、これで終わりました: (defn fn-switch-case [v cases default] (if (cases v) (cases v) default )) どちらも (switch-case 5 {6 "six" 7 "seven"} "not there") そして (fn-switch-case 5 {6 "six" 7 "seven"} "not there") うまくいきます。 マクロが必要で、関数が機能しないシナリオは何ですか?関数やマクロの実装に欠点はありますか?
7 clojure  macros 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.