2017-04-05 86 views
0

我給出了對lisp-like語言的遞歸閉包建模的兩種方法的描述。假設我有以下代碼:瞭解編譯器中遞歸閉包的建模

(letrec ((f (fun (l) … (map f l) …)))) …) 

對於與f關閉我能:

  1. 款待f作爲自由變量,並把它放在自己的環境,這導致環閉合。
  2. 平坦的封閉,環境是封閉的,可以直接重複使用。

我正在使用扁平關閉的概念,它在其第一個單元格中存儲一個指向函數的指針,其餘的自由變量。但我對第二種選擇感到困惑,因爲在我看來,第一個和第二個呼叫接收不同的參數。那麼他們如何獲得相同的閉包,並且不需要將遞歸調用作爲自由變量來區分它們呢?

也許你可以解釋這是如何解決在典型的編譯器的未來步驟?

回答

1

每次調用f都會爲l(假設爲詞法範圍界定)創建一個新值並創建新值。 f正文中的關閉通常不會包含f,但是父母會關閉,因此您最終將查找調用堆棧。

我寫了一篇文章進入這個更多一點:http://cinigl.io/posts/nested-variable-scoping