2016-06-18 15 views
4

を再コンパイルを自動化:それは自分自身を再コンパイルされるまで、ライブ環境でmac1は、Emacs /スライムライブ環境でこのような状況を考えると

(defmacro mac1 ...) 

(defun func1() 
    (mac1 ...)) 

再定義はfunc1には影響しません。

mac1を再コンパイルするたびにemacsまたはlispを自動的に再コンパイルする方法はありますか?func1実装する

(watch 
    (defmacro mac1 ...)) 

(on-signal (mac1) 
    (defun func1 ...)) 

そのハードではない、私はむしろ、ホイール改革を避けるだろう:ソースでこのよう

何かが許容可能です。

+1

本当の答えではありませんが、 'cl'パッケージに侵入しようとするなら、' defun'の周りのラッパーにシンボル名のプロパティとして関数のソースを隠しておき、 'defmacro'は' who-macroexpands'を見て、隠されたソースを繰り返し処理します。または、あなたのマクロの編集内容を追跡できなくなったら、 'slime-compile-and-load-file'を実行してください。 – BRFennPocock

答えて

5

マクロは必ずしもコンパイルされません。 SBCL(manualを参照)を使用している場合は、sb-ext:*evaluator-mode*という変数があり、評価中にマクロが展開されるように:interpretに設定できます。他の実装も同様のものを提供するかもしれない。これにより、すでに関数を使用しているようにコールサイトを再コンパイルせずにマクロの定義を変更することができます。

また、スライムはslime-who-macroexpandsという名前の関数を定義します。 Common Lisp環境(swank)かemacs側のどちらかで、それがどのように動作し、それを悪用しているかを少し調べなければなりません。

1

たとえば、LispWorksでは次のことができます。おそらくSBCLにも同様の機能があります。

のは、我々はこれを持っているとしましょう:

(defmacro foo() 
    `(list 1 2 3)) 

(defun bar() (first (foo))) 
(defun baz() (second (foo))) 

は今、あなたはfooを呼び出して誰尋ねることができます。

CL-USER 11 > (who-calls 'foo) 
(BAZ BAR) 

これは、再コンパイルの両方の機能を容易にします:

CL-USER 12 > (mapcar 'compile (who-calls 'foo)) 
;;;*** Warning in BAZ: The definition of BAZ is already compiled. 
;;;*** Warning in BAR: The definition of BAR is already compiled. 
(BAZ BAR) 

LispWorksはwho-callsデータベースを保持しているので、oを直接使用し、それに依存するすべての関数を再コンパイルできます。 ther関数/マクロ。

エディタには、Edit CallersContinue Tags Searchというコマンドがあり、発信者を見つけて手動で再コンパイルすることができます。すべての呼び出し元を再コンパイルするエディタコマンドを簡単に書くことができます。

+0

最後の例はちょっと誤解を招いています。すでにコンパイルされた関数を再コンパイルすることは、ほとんどの実装に影響を与えません。ネイティブマシンコードにコンパイルされた現在のすべての実装には間違いありません。例の前に発言を追加してください。 – acelent

+1

NB。 SBCLのアナログは 'sb-introspect:who-macroexpands'です。スライム機能は' slime-who-macroexpands'です。しかし、 'sb-introspect:who-macroexpands'はシンボルと' definition-source'構造の連想配列を返し、シンボルを 'compile'に渡すことは効果がありません。多分 'definition-source-pathname'か何かを使ってそれをトレースする必要があります。 – BRFennPocock

関連する問題