2014-03-07 52 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"