2010-10-24 70 views
0

所以我用一個簡單的文檔字符串系統玩弄如在方案熱身,其想法是,你可以這樣做:綁定函數名作爲參數的內部宏觀

(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「第一個參數「),以便每個調用所關聯的函數是已知的。這是我遇到麻煩的地方,我所做的每一次嘗試都沒有做到我想做的。

+0

你可以發佈一個前後的例子嗎? (你已經有了之前的版本,但是你的最終結果應該是什麼並不明顯。) – erjiang 2010-10-25 17:02:52

+0

用示例顯示了我的目標是什麼。 – 2010-10-26 12:36:48

回答

1

我建議使用define-syntax,因爲它很衛生,它的syntax-rules很容易理解。 syntax-rules處於模式到結果的格式;如果你能理解cond,你可以瞭解syntax-rules

我認爲這是做你想做的,通過片段前後來判斷。

(define-syntax def-with-doc 
    (syntax-rules() 
     ;; this pattern 
     [(_ (func params ...) 
      (tag attributes ...) 
      ... 
      code) 
     ;; is converted into 
     (begin 
     (tag (quote func) attributes ...) 
     ... 
     (define (func params ...) 
      code))])) 

原諒我的術語,因爲我從來沒有使用過文檔字符串。 基本上,這匹配任何遵循該模式的函數+ params def,具有屬性的0個或更多標記以及代碼語句。

然後,它只是重新排列一切。

+0

我會給這個鏡頭,謝謝! – 2010-10-27 12:39:24