我想为一个简单的多态形式创建一个重载的Scheme宏。也就是说,当给定不同类型的参数时,一个足够聪明的宏可以进行不同的扩展,这样(查找密钥容器)可以为不同类型的容器做“正确”的事情。
(define-macro (look-up key container)
(cond
((table? container) `(table-ref ,key ,container))
((pair? container) `(assoc ,container ,key))
etc.
(else `(error "Unknown type to look-up))))
想法?
答案 0 :(得分:2)
宏是编译时,而不是运行时。因此,您将无法查询Android SDK Location
是表格还是对,或者是否在宏扩展时不是。你必须使用一个程序来做到这一点。
那么,为什么不使用一个程序?
答案 1 :(得分:0)
我认为克里斯是正确的,因为这不是宏的工作。一个简单的程序可能是您正在寻找的:
(define (lookup key container)
(cond ((type1? container)
(type1-lookup key container))
. ; repeat for whichever types..
.
((typeN? container)
(typeN-lookup key container))
(else 'undefined-lookup))) ; or default value or ...
或许你只需要找出你曾经处理过的东西,这样你就可以动态构建一个更专用的程序。您的make-lookup
过程可能看起来与上面的代码非常相似,除非您返回一个过程,而不是立即调用查找:
(define (make-lookup container)
(cond ((type1? container)
type1-lookup)
. ; repeat for supported types..
.
((typeN? container)
typeN-lookup)
(else default-lookup-procedure)))
(define lookup (make-lookup container))
您甚至可以向make-lookup
添加一个可选参数,该参数将采用一个过程并使用它而不是您之前定义的一个特定于类型的查找。