我是新来的计划,并有以下问题: 如果我想要一个函数也打印表达式的值,然后调用一个函数,那么如何才能做到这一点?打印价值和通话功能?
例如,我需要的功能foo(n)
打印的n mod 2
价值,并呼吁foo(n/2)
,我就做了:
(foo定义(拉姆达(N)(模数n 2)(FOO(/n 2))))
但是,那当然不会打印n mod 2
的值。
我是新来的计划,并有以下问题: 如果我想要一个函数也打印表达式的值,然后调用一个函数,那么如何才能做到这一点?打印价值和通话功能?
例如,我需要的功能foo(n)
打印的n mod 2
价值,并呼吁foo(n/2)
,我就做了:
(foo定义(拉姆达(N)(模数n 2)(FOO(/n 2))))
但是,那当然不会打印n mod 2
的值。
下面是一些简单:
(define foo
(lambda (n)
(display (modulo n 2))
(when (positive? n)
(foo (/ n 2)))))
注(positive? n)
的检查,以确保你永远永远避免(/ 0 2)
。
我可怕的Lisp的,但这里有一个想法:也许你可以定义打印值,并将其功能
(define (debug x) (begin (display x) (newline) x))
然后,只需调用诸如
(some-fun (debug (some expression)))
由于功能@Jhoho写道,你需要添加一个display
。但是,你的过程是递归的,没有基本的情况,所以它不会终止。有超过一两件事是共同建立名单时,该过程完成后提出的解决方案打交道时
(define foo
(lambda (n)
(cond
((integer? n) (display (modulo n 2))
(newline)
(foo (/ n 2)))
(else n))))
然后
> (foo 120)
0
0
0
1
7 1/2
一般:
试试这个。
(define (get-digits number base)
(let loop ((nums '()) (cur number))
(if (zero? cur)
nums
(loop (cons (remainder cur base) nums)
(quotient cur base)))))
(get-digits 1234 10) ; ==> (1 2 3 4)
现在,既然你用DrRacket你有一个调试器,所以你可以实际步骤虽然这个代码,但你更应该努力使简单的位像这样的是可测试和没有做的副作用。
当你打开粉红色和蓝色的输出,直到打开DrRacket,确实出现这种情况时,我很困惑。一切都是粉红色的来自程序,蓝色的一切通常都不会被输出,但是由于它是IDE中顶级窗体的结果,REPL无论如何都会显示它。它们之间的差异确实是你不应该依赖生产代码中的蓝色输出。
正如其他人建议您可以在代码中使用display
进行调试输出。我想向你展示另一种方式。想象一下,我不知道做什么用的元素做,我给你机会自己做:
(define (get-digits number base glue)
(let loop ((nums '()) (cur number))
(if (zero? cur)
nums
(loop (glue (remainder cur base) nums)
(quotient cur base)))))
(get-digits 1234 10 cons) ; ==> (1 2 3 4)
(define (debug-glue a d)
(display a)
(newline)
(cons a d))
(get-digits 1234 10 debug-glue) ; ==> (1 2 3 4) and displays "4\n3\n2\n1\n"
display将显示ascii,而不是实际值。 – TheNotMe