首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏调用宏在Gambit方案中给出“未定义的变量”

宏调用宏在Gambit方案中给出“未定义的变量”
EN

Stack Overflow用户
提问于 2017-05-08 03:50:40
回答 2查看 237关注 0票数 1

在Gambit Scheme中,如果我编译文件,我似乎不能在另一个宏的定义中调用另一个宏。下面是一个人为设计的例子:

代码语言:javascript
复制
;;;; example.scm

(define-macro (w/gensyms gs body)
  `(let ,(map (lambda (g) `(,g (gensym ',g)))
              gs)
     ,body))

(define-macro (compose-macro f g)
  (w/gensyms (x)
    `(lambda (,x) (,f (,g ,x)))))

(define my-cadr
  (lambda (x)
    ((compose-macro car cdr) x)))

;; $ gsc example.scm
;; *** ERROR IN #<procedure #2> -- Unbound variable: w/gensyms

但是,如果我在解释器中加载带有(include ...)特殊格式的文件,它就能正常工作

代码语言:javascript
复制
$ gsi
> (include "example.scm")
> (pp my-cadr)
(lambda (x) ((lambda (#:x0) (car (cdr #:x0))) x))

有人知道这是怎么回事吗?我能说服Gambit允许我在编译文件中的另一个宏的定义中使用w/gensyms吗?

EN

回答 2

Stack Overflow用户

发布于 2017-05-08 05:02:33

这很可能与阶段有关。

试试这个:

w/gensyms放在文件a.scm中,将compose-macro放在导入a.scm的文件b.scm中。

票数 0
EN

Stack Overflow用户

发布于 2017-05-09 13:55:47

这是一个阶段性问题。您希望w/gensyms的定义在后续宏的主体中可用。这可以通过在语法扩展时强制计算宏定义的for-syntax宏来实现:

代码语言:javascript
复制
(define-macro (for-syntax . body)
  (eval `(begin ,@body))
  `(begin))

(for-syntax
 (define-macro (w/gensyms gs body)
   `(let ,(map (lambda (g) `(,g (gensym ',g)))
               gs)
      ,body)))

如果希望宏既可以在其他宏定义中使用,也可以在非宏定义代码中使用,则可以使用以下代码:

代码语言:javascript
复制
(define-macro (for-syntax . body)
  (eval `(begin ,@body))
  `(begin ,@body))

对于此特定示例,由于您在单个位置使用宏,因此可以执行以下操作:

代码语言:javascript
复制
(define-macro (compose-macro f g)

   (define-macro (w/gensyms gs body)
     `(let ,(map (lambda (g) `(,g (gensym ',g)))
                 gs)
        ,body))

  (w/gensyms (x)
    `(lambda (,x) (,f (,g ,x)))))

解决阶段化问题的一种相关方法是将w/gensyms和其他宏的定义放在文件"macros.scm“中,并执行以下操作:

代码语言:javascript
复制
(define-macro (compose-macro f g)

  (include "macros.scm")

  (w/gensyms (x)
    `(lambda (,x) (,f (,g ,x)))))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43835958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档