簡體   English   中英

如何調試迭代程序?

[英]How to debugg iterative procedures?

我將Racket博士和Racket博士用於教育目的(研究SICP書)。 Racket博士很棒,並且有一個很棒的工具叫做“ trace”。

使用后:

(require trace/racket)
(trace function)

可以看到遞歸過程中發生了什么。

但是,此功能不適用於迭代過程。 我希望我可以“看到”我的代碼在執行時發生了什么。 我希望我能看到狀態變量值的變化。

是否有其他工具或做法可以在迭代過程中獲得此類信息?

跟蹤不是調試。 在DrRacket中,您可以按DEBUG按鈕並右鍵單擊感興趣的部分的邊緣,例如, if它確定了助手中的基本情況或解除情況,然后選擇“此時暫停”。 然后,每當您按下Go時,您就可以一次看到綁定的參數。

如果您只想跟蹤,可以像這樣跟蹤一個助手:

(require racket/trace)
(define (reverse lst)
  (define (aux lst acc)
    (if (null? lst)
        acc
        (aux (cdr lst)
             (cons (car lst) acc))))
  (trace aux) ; tracing the helper
  (aux lst '()))

(reverse '(1 2 3 4))

>(aux '(1 2 3 4) '())
>(aux '(2 3 4) '(1))
>(aux '(3 4) '(2 1))
>(aux '(4) '(3 2 1))
>(aux '() '(4 3 2 1))
<'(4 3 2 1)
;==> (4 3 2 1)

如果你想使用一個名為let剛,取而代之的是trace-let

(define (reverse lst)
  ;; TODO: Put back to let
  (trace-let aux ((lst lst) (acc '()))
    (if (null? lst)
        acc
        (aux (cdr lst)
             (cons (car lst) acc)))))

使用調試器比必須添加行並刪除代碼中的行以進行測試要快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM