2014-03-07 53 views
0

我是新来的计划,并有以下问题: 如果我想要一个函数也打印表达式的值,然后调用一个函数,那么如何才能做到这一点?打印价值和通话功能?

例如,我需要的功能foo(n)打印的n mod 2价值,并呼吁foo(n/2),我就做了:

(foo定义(拉姆达(N)(模数n 2)(FOO(/n 2))))

但是,那当然不会打印n mod 2的值。

回答

1

下面是一些简单:

(define foo 
    (lambda (n) 
    (display (modulo n 2)) 
    (when (positive? n) 
    (foo (/ n 2))))) 

(positive? n)的检查,以确保你永远永远避免(/ 0 2)

0

我可怕的Lisp的,但这里有一个想法:也许你可以定义打印值,并将其功能

(define (debug x) (begin (display x) (newline) x)) 

然后,只需调用诸如

(some-fun (debug (some expression))) 
+0

display将显示ascii,而不是实际值。 – TheNotMe

0

由于功能@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 
+0

再一次,显示会给ascii字符,而不是价值! – TheNotMe

+0

否... 0是模数。是什么让你认为它是一个ASCII字符? – uselpa

+0

该文档。注意0的颜色,它是粉红色的。如果它是实际值,那就是蓝色 – TheNotMe

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"