我經常發現有用的下列類型的增量定義的:增量宏定義可能嗎?
(define (foo) (display "bar"))
(foo)
;prints bar
(define foo (let ((bar foo))
(lambda()
(display "foo")
(bar))))
(foo)
;prints foobar
如何母材,宏這種類型的增量定義的? 我無法讓let-syntax提供相同的功能。
目前我使用plt方案,但希望在不同的lisp實現中看到答案。
編輯:
天真我想做到以下幾點:天真的宏
(define-syntax foo
(syntax-rules()
((_) (display "bar"))))
(define-syntax foo
(let-syntax ((old-foo (syntax-rules() ((_) (foo)))))
(syntax-rules()
((_) (begin
(display "foo")
(old-foo))))))
轉換到工作PLT的計劃宏:
(require-for-syntax scheme/base)
(define-syntax foo
(syntax-rules()
[(foo) (display "bar")]))
(define-syntax foo
(let ([old (syntax-local-value #'foo)])
(lambda (stx)
#`(begin #,((syntax-rules()
[(_) (begin (display "foo"))]) stx)
#,(old #'(_))))))
(foo)
如果我缺少一個更好的方法讓我知道。
謝謝,我必須包含(需要語法方案/基礎)才能在語法階段定義組合(要在定義語法中定義組合)。你可以評論我的天真方法(添加到問題)沒有實施?天氣是不是很實際,或者它與現有的語法不一致? – Davorak 2010-05-04 04:09:32
是的,你需要'計劃/基地'來組成;但是您可以按任何您想要的方式組合宏函數 - 它們只是從語法到語法的函數,而'syntax-rules'是生成此類函數的方便(通常爲第2級)宏。 至於你的幼稚方法,它有一些基本的問題:它試圖以某種方式捕獲舊的語法,但你不能以這種方式得到它的*值*,所以結果是一個擴展到調用自身的宏。另一個問題是在試圖使用'display'來調試東西 - 宏不會*做*它,他們會*擴大*。 – 2010-05-04 04:35:17
謝謝,我知道我無法以這種方式捕捉舊的語法,並且它會擴展到自己。我只是認爲它很好地處理了我熟悉的語法,並想知道爲什麼它存在於函數層次,爲什麼它不存在於宏觀層面,即使似乎沒有任何根本阻止編譯器以這種方式行事。我試圖使用顯示作爲測試,看看宏是否構建正確,我編輯我的問題翻譯我的天真宏到一個工作的PLT計劃宏。 – Davorak 2010-05-04 08:35:57