所以我用一个简单的文档字符串系统玩弄如在方案热身,其想法是,你可以这样做:绑定函数名作为参数的内部宏观
(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