跳轉到內容

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))
華夏公益教科書