方案定义宏 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 添加一个可选参数,该参数将采用一个过程并使用该过程,而不是您之前定义的特定类型查找之一。