我是新來的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))
完美!謝謝。我稍微改了一下,這樣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
在宏中引入一個新的標識符'x'是不好的。它可能會干擾現有的'x'。使用'gensym'創建一個確保唯一的標識符。 –
新的標識符'x'只會干擾let體內的代碼,而不會干擾'exp'; let的主體完全在我們的控制之下,所以沒有現有的'x'來干涉。通常我會在任何情況下使用'gensym',但這隻會使答案複雜化。 –