3
給定一個函數,如斐波那契循環的樹遞歸實現,我如何顯示錶達式的評估中的每個步驟,如(fib 5)
?計劃擴展程序調用
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1)
(fib (- n 2))))))
例如,我想輸出:
(fib 5)
(+ (fib 4) (fib 3))
(+ (+ (fib 3) (fib 2)) (+ (fib 2) (fib 1)))
(+ (+ (+ (+ (fib 1) 0) (fib 1) (+ (fib 1) 0)) (+ (+ (fib 1) 0) (fib 1)))
(+ (+ (+ (+ 1 0) 1 (+ 1 0)) (+ (+ 1 0) 1))
我知道,使用quasiquoting,可以部分地計算表達式,如:
`(+ ,(* 3 4) (- 0.1 2)) ; evaluates to -┐
(+ 12 (- 0.1 2)) ; <----┘
不過,我有無法用這個來展示評估中的每一步。我知道我可以修改像Peter Norvig的lis.py這樣的翻譯解釋器,但是我希望能夠在語言本身中使用它。我怎樣才能做到這一點?
啊,我在錯誤的地方進行了quasiquoting,我一直在程序體外使用它。謝謝! – tlehman 2013-02-09 16:48:51
@TobiLehman我的榮幸! – 2013-02-09 16:50:34
我必須看看球拍,它看起來很酷。我想要做的是生成一個類似於SICP第68頁的樹形圖。如果我使用GraphViz,那麼我只需要輸出父子對,比如「(fib3) - >(fib2)」,「(fib3) - >(fib1)」,並使用「dot」將其渲染爲PNG。我可以將每個函數調用包裝在一個(begin(display ..))語句中。 – tlehman 2013-02-09 17:01:34