2012-11-18 57 views
1

我有一個非常簡單的代碼,我只是想跟隨的流量,我想我理解,但我只是想確保Scheme-使用set!改變一個變量

(define count 
    (let ([next 0]) 
    (lambda() 
     (let ([v next]) 
     (set! next (+ next 1)) 
     v)))) 

基本上,計數跟蹤它被調用的次數。當你第一次調用它時,使用let將下一個設置爲0。然後,使用set!更改爲1。我試圖弄清楚爲什麼(let([next 0])在接下來的每次調用該程序時都沒有設置爲0)。我可以告訴的是,(lambda()...)是實際功能開始(不帶參數),所以當你再次調用count時,它只是從那裏執行,使用該範圍中下一個的值(set!one)

我想......我老實說還是一個不確定是否設置!只是自動改變下一個永久性,所以當你再次調用計數時,即使第一行是(let((next 0)))它實際上並沒有回到零?

回答

2

你的直覺是此部分:(let ([next 0])僅執行一次,之前lambda被綁定到名稱count - 這是因爲第一個let將其最後一個表達式作爲其值返回,這恰好是lambda,這就是綁定到變量count的原因。

函數定義結束後,count過程的實際執行從這一行開始:(let ([v next]),每次調用該過程時都會發生這種情況。 next變量對於count過程的所有調用都是相同的,因此它在count內部可訪問,因爲它在創建時在閉環內作爲lambda的環境的一部分被捕獲。

+1

謝謝!這實際上消除了我也有的一些混亂。 –