我是新來的計劃,並有以下問題: 如果我想要一個函數也打印表達式的值,然後調用一個函數,那麼如何才能做到這一點?打印價值和通話功能?
例如,我需要的功能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