我見過的How does Lisp let you redefine the language itself? 堆棧溢出的問題(由諾亞拉文回答)一個答案:Lisp或Scheme中是否有整個程序轉換宏?
宏是不是語言的相當完整的重新界定,至少就我所知(I」實際上是一個Schemer;我可能是錯的),因爲有一個限制。宏只能取代碼的單個子樹,並生成一個子樹來替換它。因此,你不能編寫完整的程序轉換宏,就像那樣酷。
閱讀完本文後,我對Lisp或Scheme(或其他語言)中是否存在「整個程序轉換宏」感到好奇。
如果不是那麼爲什麼?
- 這不是有用的,從來沒有要求?
- 同樣的事情可以通過其他方式實現嗎?
- 即使在Lisp中也不可能實現它嗎?
- 這是可能的,但沒有嘗試或實施過?
更新
一種使用情況 例如
正如stumpwm代碼 這裏有一些功能,都在不同的LISP源文件 使用動態/全局變量defvar * 屏幕列表*是在primitives.lisp定義,但在屏幕使用。 lisp,user.lisp,window.lisp。 (這裏的每個文件都函數,類,乏相關的一個方面或對象)
現在,我想封下定義這些功能,其中 *屏幕列表*變量可通過讓利的形式,它不應該是 動態/全局變量,但沒有移動這些所有功能到 一個地方(因爲我不希望這些功能從他們的 相關文件丟失) 因此,這個變量將只能訪問這些功能。
上方例如同樣適用於標籤和flet,因此它將進一步可能使 我們可以使它變成只有需要的變量,函數將可用, 給那些需要它的人。
注意一種方式可能是 實現並使用一些宏defun_with_context defun其中第一個參數是 上下文其中let,flet變量definend。 但除此之外,它可以通過讀者宏來實現,如 Vatine和Gareth Rees回答。