我是计划新手,并提出以下问题: 如果我想要一个函数也打印 - 表达式的值然后调用一个函数,那么会怎么做呢?
例如,我需要函数foo(n)
来打印n mod 2
的值并调用foo(n/2)
,我会做的:
(定义foo(lambda(n)(modulo n 2)(foo(/ n 2))))
但是,当然,这不会打印n mod 2
的价值。
答案 0 :(得分:1)
这是一件简单的事情:
(define foo
(lambda (n)
(display (modulo n 2))
(when (positive? n)
(foo (/ n 2)))))
请注意(positive? n)
的检查,以确保您永远避免(/ 0 2)
。
答案 1 :(得分:0)
我在Lisp上很糟糕,但这里有一个想法:也许你可以定义一个打印一个值并返回它的函数
(define (debug x) (begin (display x) (newline) x))
然后只需调用函数
(some-fun (debug (some expression)))
答案 2 :(得分:0)
@Juho写道,您需要添加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
答案 3 :(得分:0)
通常在处理多个事物时,通常会在过程完成时构建列表以提供解决方案。
(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"