2013-09-21 40 views
0

我是新來的lisp,我正在學習。Common Lisp:break,但返回輸入而不是零?

標準的常用lisp中斷函數1.將您彈出到調試器中,2.如果您選擇繼續,則返回nil。

在我看來,一箇中斷函數將您彈入調試器但返回它的輸入將非常有用。然後,您可以將其透明地插入給定的s表達式中,以查看當前程序的狀態。

所以我可以做類似

CL-USER> (break-transparent (+ 1 2)) 

這將彈出我進入調試器,讓我看看周圍,然後將返回

3 

是否有口齒不清這樣的事情,而且,如果沒有,是否有辦法做出這樣的事情?宏我還不好。

感謝,

編輯: 道格·柯里親切回答下面這一個簡單的宏。這裏是我對這個問題的其他人稍作修改的版本,它顯示了在調試器窗口中顯示break-transparent front和center的參數。

(defmacro break-transparent (exp) 
    `(let ((x ,exp)) (break "argument to break: ~:S" x) x)) 

回答

2

你可以寫break-transparent作爲擴展到宏:

(progn 
    (break) 
    (+ 1 2)) 

,或者如果你真的想評估休息前的公式:

(let ((x (+ 1 2))) 
    (break) 
    x) 

所以,

(defmacro (break-transparent exp) 
    `(let ((x ,exp)) (break) x)) 
+0

完美!謝謝。我稍微改了一下,這樣break會在調試器窗口中顯示它的參數,而不必在追蹤中尋找「x」。 '(defmacro break-transparent(exp) \'(let((x,exp))(break「argument break to:〜:S」x)x))''。 (break-transparent(+ 1 2))在調試器窗口中產生輸出「break to:3」參數,並返回3. – vancan1ty

+0

在宏中引入一個新的標識符'x'是不好的。它可能會干擾現有的'x'。使用'gensym'創建一個確保唯一的標識符。 –

+2

新的標識符'x'只會干擾let體內的代碼,而不會干擾'exp'; let的主體完全在我們的控制之下,所以沒有現有的'x'來干涉。通常我會在任何情況下使用'gensym',但這隻會使答案複雜化。 –

0

Si NCE您添加從對方的回答宏觀你的問題在一個稍微修改後的版本,這裏不增加新的IDENTIFER可能與現有的干涉,一個固定的版本:

(defmacro break-transparent (value) 
    (let ((g (gensym))) 
    `(let ((,g ,value)) 
     (break "argument to break: ~:S" ,g) 
     ,g))) 
相關問題