所以我用一個簡單的文檔字符串系統玩弄如在方案熱身,其想法是,你可以這樣做:綁定函數名作爲參數的內部宏觀
(def-with-doc (foo a b)
(desc "Takes two parameters and sums them")
(param 'a "First parameter")
(param 'b "Second parameter")
(return "Sum of arguments")
(+ a b)
這將是開啓成:
(begin
(begin
(desc 'foo "Takes two parameters and sums them")
(param 'foo 'a "First parameter")
(param 'foo 'b "Second parameter")
(return 'foo "Sum of arguments"))
(begin
(define (foo a b)
(+ a b))))
我寫的宏:
(define doc-symbol-list '(param desc return))
(define-macro (def-with-doc arg-list #!rest body)
;; Loop over body, splitting into doc calls and everything else
(let loop ((remaining body) (docs '()) (main '()))
(if (null? remaining)
; Reverse accumulation order of docs and main
; And build re-ordered begin tree
(let ((docs (cons 'begin (reverse docs)))
(main (cons 'begin (reverse main))))
(cons 'begin `(,docs ,`(define ,arg-list ,main))))
; Accumulate into docs list if expression is reserved
; Otherwise into the body list
(let ((sexp (car remaining)) (rest (cdr remaining)))
(if (member (car sexp) doc-symbol-list)
(loop rest (cons sexp docs) main)
(loop rest docs (cons sexp main)))))))
注意到定義,移動帕拉姆/遞減/換貨政... rn調用begin語句中的頂層並重新構造函數的主體,這樣,文檔字符串調用只在文件加載時執行一次,而不是在每次調用函數時執行。我知道我可以手動將文檔字符串的東西放在頂層,但我試圖模擬Python的文檔字符串。
無論如何,最後認爲我需要做的是將函數名稱(上面的foo)綁定到doc-string調用中,以便(param'a「第一個參數」)變成(param'foo'a「第一個參數「),以便每個調用所關聯的函數是已知的。這是我遇到麻煩的地方,我所做的每一次嘗試都沒有做到我想做的。
你可以發佈一個前後的例子嗎? (你已經有了之前的版本,但是你的最終結果應該是什麼並不明顯。) – erjiang 2010-10-25 17:02:52
用示例顯示了我的目標是什麼。 – 2010-10-26 12:36:48