方案定义宏 and/or 定义语法
Scheme define-macro and/or define-syntax
我想为简单形式的多态性创建一个重载的 Scheme 宏。也就是说,一个宏足够聪明,可以在给定不同类型的参数时进行不同的扩展,因此(查找密钥容器)对不同类型的容器执行 "right" 操作。
(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))))
想法?
宏是编译时的,而不是 运行 时的。因此,您将无法在宏扩展时查询 container
是否是 table 或对或不是什么。你必须使用一个程序来做到这一点。
那么,为什么不直接使用程序呢?
我认为 Chris 是对的,因为这并不是宏的真正工作。一个简单的过程可能就是您要找的:
(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
过程可能看起来与上面的代码非常相似,只是您 return 一个过程,而不是立即调用查找:
(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
添加一个可选参数,该参数将采用一个过程并使用该过程,而不是您之前定义的特定类型查找之一。
我想为简单形式的多态性创建一个重载的 Scheme 宏。也就是说,一个宏足够聪明,可以在给定不同类型的参数时进行不同的扩展,因此(查找密钥容器)对不同类型的容器执行 "right" 操作。
(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))))
想法?
宏是编译时的,而不是 运行 时的。因此,您将无法在宏扩展时查询 container
是否是 table 或对或不是什么。你必须使用一个程序来做到这一点。
那么,为什么不直接使用程序呢?
我认为 Chris 是对的,因为这并不是宏的真正工作。一个简单的过程可能就是您要找的:
(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
过程可能看起来与上面的代码非常相似,只是您 return 一个过程,而不是立即调用查找:
(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
添加一个可选参数,该参数将采用一个过程并使用该过程,而不是您之前定义的特定类型查找之一。