如何调试 scheme if 语句

How to debug scheme if statment

我发现自己经常想检查语句并打印那里发生的事情。例如,使用这个基本示例:

(define (example-debug lst)
  (if (null? lst)
      '()
      (example-debug (cdr lst))))

(example-debug '(1 2 3))

如何在 if 语句的两个部分中显示?以 python 为例,我可能有这样的东西:

def example_debug(lst):
    if not lst:
        print ("End of list reached")
    else:
        print ("Element is: %s" % lst[0])
        example_debug(lst[1:])

在上面的方案中是否有一种干净的或类似的方法来做到这一点?不平凡的程序通常如何 'debugged'?

if 用 print 语句进行调试会很麻烦,因为您不能为结果或替代项编写一个以上的表达式,如果您想要,则强制您使用 begin做不止一件事(我使用的是 Racket 特有的 printf,请根据您的解释器进行调整):

(define (example-debug lst)
  (if (null? lst)
      (begin
        (printf "End of list reached~n")
        '()) ; this proc always returns '(), not very useful!
      (begin
        (printf "Element is: ~a~n" (first lst))
        (example-debug (cdr lst)))))

使用 cond 会稍微更具可读性,其中隐含 begins:

(define (example-debug lst)
  (cond ((null? lst)
         (printf "End of list reached~n")
         '())
        (else
         (printf "Element is: ~a~n" (first lst))
         (example-debug (cdr lst)))))

但要真正回答你的问题:不要使用打印来调试 :)。一个好的 IDE(比如 Racket)有一个内置的调试器。