最近さまざまなlispsを試して(特にclojure)、cの(サブセット)のs式ベースの表現があるかどうか疑問に思ったので、LISP /クロージャーを使用してマクロを記述し、s-expression cツリーを純粋なcに変換できます。
私はLISP/scheme/clojureのto-cコンパイラーを求めているのではなく、lispsを使用してc構文ツリーを変換することを求めています。
なぜ私がこの質問をしているのかについての小さな背景:スレッドマクロのような特定のclojureマクロを本当に楽しんでいることがわかります->
doto
など。また、FP以外の環境でも同様に優れていると思います。
これは、CプログラムのすべてのAST=表現から取得できます。ツリーを歩いてS式としてダンプするだけです。今必要なのは、ASTを構築する優れたCパーサーだけです。
GNU=曲げることができると思います。方法はわかりません。
ASTのXMLバージョンをエクスポートできるツールがあります。これは、S式と自明に同等です。 DMSソフトウェアリエンジニアリングツールキットは、これらの1つです。一部のプリプロセッサディレクティブを保持することもできます。 Cのダンプではなく、Javaまったく同じことを行う ここにあります のダンプです。
少し難しいのは、ツリーから有効なソーステキストを再生成することです。それができない場合は、ツリーを変換しても意味がありません。
Cコードに変換を適用するためにこれを実行したいと考えていました。はい、LISPのツリー操作で比較的簡単に行うことができます。しかし、LISPでこれらの変換をコーディングします。 DMSは、言語の表面構文を使用して、変換を実行する機能を提供します(たとえば、パターンのC構文を使用して記述された変換)。表面の構文はASTの微視的な詳細を知る必要がないため、これにより一般的に記述が容易になります。 (DMSには、組み込みのツリーのプリティプリンティングもあります)。