1751


マクロやインライン関数の場合、再定義してもそれらを利用する関数は、再コンパイルしない限り元の定義が使われるままになってしまいます。

[code]

    (declaim (inline foo))
    (defun foo (x)
      (cons x :foo))
    
    
    (defun bar (x)
      (foo x))
    
    
    (defun baz (x)
      (foo x))
    
    
    (bar 8)
    ;=>  (8 . :FOO)
    
    (baz 8)
    ;=>  (8 . :FOO)
    
    
    ;;; 再定義
    (defun foo (x)
      (list x :bar))
    
    ;; 古いまま
    (bar 8)
    ;=>  (8 . :FOO)
    
    ;; 古いまま
    (baz 8)
    ;=>  (8 . :FOO)
    
[/code]

新しい定義を利用するようにさせたいのですが、ファイル全体をコンパイルし直すことなく目的の関数だけコンパイルし直すことは可能ですか?


CC BY-SA 3.0
2014-12-16T12:04:42.030
1746
2014-12-16T12:41:23.533
2014-12-16T12:41:23.533
3510
3510
question
common-lisp
マクロやインライン関数を再定義したのでそれらを利用している関数すべてを再コンパイルしたい


処理系によっては、目的の関数を利用している (マクロの場合、展開先) 関数一覧を得ることが可能です (who-calls)

これらの情報を利用して目的の関数だけ再コンパイルする機能をサポートする開発環境があります。

## SLIMEの場合

インライン関数の場合は、 slime-who-calls (C-c C-w c)

マクロの場合は、slime-who-macroexpands (C-c C-w m)

を使用すると一覧が表示されますので、 このバッファの目的の関数名の上で、C-c C-cします。全体の一括処理は、slime-recompile-all-
xrefs(C-c C-k)で可能です。


CC BY-SA 3.0
2014-12-16T12:13:52.640
1751
2014-12-16T12:13:52.640
3510
1746
answer