打印价值和通话功能?

时间:2014-03-07 12:22:33

标签: scheme

我是计划新手,并提出以下问题: 如果我想要一个函数也打印 - 表达式的值然后调用一个函数,那么会怎么做呢?

例如,我需要函数foo(n)来打印n mod 2的值并调用foo(n/2),我会做的:

  

(定义foo(lambda(n)(modulo n 2)(foo(/ n 2))))

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

4 个答案:

答案 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"