newLISP 入門/偵錯程式
本節簡要介紹內建偵錯程式。
關鍵函式是 trace。 要啟動和停止偵錯程式,使用 true 或 nil
(trace true) ; start debugging
(trace nil) ; stop debugging
不帶引數使用時,如果偵錯程式當前處於活動狀態,則返回 true。
trace-highlight 命令允許你控制當前正在評估的表示式的顯示方式,以及一些提示。 我正在使用一個與 VT100 相容的終端,因此可以使用奇怪的轉義序列來設定顏色。 在 newLISP 提示符下輸入以下內容
(trace-highlight "\027[0;37m" "\027[0;0m")
但由於我永遠記不住這個,它在我的 .init.lsp 檔案中,該檔案在啟動 newLISP 時載入。 如果你不能使用這些序列,你可以使用普通字串代替。
另一個除錯函式是 debug。 這實際上只是切換跟蹤開啟、在偵錯程式中執行函式,然後再次切換跟蹤關閉的快捷方式。 因此,假設我們要執行一個名為 old-file-scanner.lsp 的檔案,其中包含以下程式碼
(define (walk-tree folder)
(dolist (item (directory folder))
(set 'item-name (string folder "/" item))
(if (and (not (starts-with item ".")) (directory? item-name))
; folder
(walk-tree item-name)
; file
(and
(not (starts-with item "."))
(set 'f-name (real-path item-name))
(set 'mtime (file-info f-name 6))
(if
(> (- (date-value) mtime) (* 5 365 24 60 60)) ; non-leap years :)
(push (list mtime item-name) results))))))
(set 'results '())
(walk-tree {/usr/share})
(map (fn (i) (println (date (first i)) { } (last i))) (sort results))
這會掃描目錄和子目錄,查詢 5 年或更長時間前修改過的檔案。(請注意,該檔案以將在載入檔案時立即評估的表示式結束。) 首先,開啟跟蹤
(trace true)
然後載入並開始除錯
(load {old-file-scanner.lsp})
或者,代替這兩行,輸入這一行
(debug (load {old-file-scanner.lsp}))
無論哪種方式,你都會看到 walk-tree 函式中的第一個表示式突出顯示,等待評估。
現在,你可以按 s、n 或 c 鍵(步驟、下一步和繼續)來執行你的函式:步驟評估每個表示式,並在呼叫其他函式時進入其他函式;下一步評估所有內容,直到到達同一級別的下一個表示式;繼續執行而不再次停止。
如果你很聰明,你可以在想要開始除錯的地方之前放置一個 (trace true) 表示式。 如果可能,newLISP 將在該表示式之前停止,並向你顯示它即將評估的函式。 在這種情況下,你可以使用簡單的 (load...) 表示式開始執行指令碼 - 如果你想跳過指令碼的初步部分,不要使用 debug。 我認為 newLISP 通常更喜歡在函式或函式呼叫的開頭進入偵錯程式 - 你可能無法在執行過程中進入函式。 但你可能會設法組織事情,以便你可以做類似的事情。
以下是如何在迴圈中間進入偵錯程式。 這是一小部分程式碼
(set 'i 0)
(define (f1)
(inc i))
(define (f2)
(dotimes (x 100)
(f1)
(if (= i 50) (trace true))))
(f2)
從檔案載入它
> (load {simpleloop.lsp})
-----
(define (f1)
(inc i))
[-> 5 ] s|tep n|ext c|ont q|uit > i
50
[-> 5 ] s|tep n|ext c|ont q|uit >
注意函式 f1 如何出現 - 你沒有機會在 f2 中看到任何東西。 在偵錯程式提示符下,你可以輸入任何新的 LISP 表示式,並評估任何函式。 在這裡,我輸入了 i 來檢視該符號的當前值。 newLISP 很樂意讓你更改某些符號的值。 例如,你應該能夠更改迴圈變數。 但不要重新定義任何函式... 如果你試圖從 newLISP 的腳下拉走地毯,你可能會成功地讓它摔倒!
偵錯程式顯示的原始碼不包括註釋,因此如果你想在檢視程式碼時留下有用的備註或靈感,請使用文字字串而不是註釋
(define (f1)
[text]This will appear in the debugger.[/text]
; But this won't.
(inc i))