宏對於調試非常有用。但在任何宏觀上使用時,它會停下來。就像如果我嘗試做到以下幾點:宏以及如何跟蹤它們
CL-USER> (trace push)
然後,它會給出一個錯誤說:
can't use encapsulation to trace anonymous function #<FUNCTION (MACRO-FUNCTION
PUSH) {100053FB9B}>
[Condition of type SIMPLE-ERROR]
嗯,這是顯而易見的,因爲trace
的CLHS頁,清楚地界定它在職能。那麼,沒有任何工具在Common Lisp中跟蹤宏的原因是什麼?
有沒有其他(非傳統)的方式來跟蹤Common Lisp中的宏?
那麼,如果宏在編譯時被擴展,你將如何跟蹤它們的調用?您可以編寫一個宏來選擇擴展宏的第一種形式,並在其上調用「trace」。 – Carcigenicate
在什麼情況下你想跟蹤一個宏?在SBCL中,使用非標準的':ENCAPSULATE'參數來追蹤:'(trace push:encapsulate nil)'似乎是可能的。通常宏展開是調試宏的更好方法(使用Sly,你也可以使用宏步)。宏中任何複雜的邏輯都可以在一個單獨的函數中實現,這個函數也可以被正常地跟蹤。 – jkiiski
謝謝@jkiiski!當我需要知道它在程序中實際做了什麼時,宏擴展內置宏(比如'push')不會有太大幫助。 – Mooncrater