Scheme 是否有可能实施;定义宏“;麻省理工学院计划

Scheme 是否有可能实施;定义宏“;麻省理工学院计划,scheme,mit-scheme,Scheme,Mit Scheme,看完之后。我发现很难记住如何使用define syntax来代替define macro,所以我想在mit scheme中实现define macro(或者至少找到一些等价物) 以下是我的(有问题的)实现: (define-syntax define-macro (rsc-macro-transformer (let ((xfmr (lambda (macro-name macro-body) (list 'define-syntax macro-name

看完之后。我发现很难记住如何使用
define syntax
来代替
define macro
,所以我想在mit scheme中实现
define macro
(或者至少找到一些等价物)

以下是我的(有问题的)实现:

(define-syntax define-macro
  (rsc-macro-transformer
    (let ((xfmr (lambda (macro-name macro-body)
      (list 'define-syntax macro-name
        (list 'rsc-macro-transformer
          (let ((m-xfmr macro-body))
            (lambda (e r)
              (apply m-xfmr (cdr e)))))))))
      (lambda (e r)
        (apply xfmr (cdr e))))))

(define-macro my-when
  (lambda (test . branch)
    (list 'if test (cons 'begin branch))))

(my-when #t
  (begin
    (display "True")
    (newline)))
而REPL抱怨说:

;The object (lambda (test . branch) (list (quote if) test (cons (quote begin) branch))) is not applicable.

我是scheme新手,不知道出了什么问题,有人能帮我吗?

首先,你应该学会使用准旋转,这样你的宏更容易阅读。像这样:

(define-macro (my-when test . branch)
  `(if ,test
     (begin ,@branch)))
不过,更严重的是,使用
语法规则编写这篇文章相当容易,您确实应该更喜欢它而不是
定义宏

(define-syntax-rule (my-when test branch ...)
  (if test
    (begin branch ...)))
哦,您以前没有看过
定义语法规则
?这是一个简单的宏,可用于编写一个子句
define syntax
宏,其定义如下:

(define-syntax define-syntax-rule
  (syntax-rules ()
    ((define-syntax-rule (name . pattern) template)
     (define-syntax name
       (syntax-rules ()
         ((name . pattern) template))))))
注意,使用
定义语法规则
,简单的宏变得非常非常容易编写。下面是另一个例子:

(define-syntax-rule (let ((name value) ...)
                      expr ...)
  ((lambda (name ...)
     expr ...)
   value ...))

如果您确实需要定义宏语义,可以在mit scheme中获得合理的近似值,如下所示:

(define-syntax define-macro
  (syntax-rules ()
    ((define-macro (name . args) body ...)
     (define-syntax name
       (rsc-macro-transformer
         (let ((transformer (lambda args body ...)))
           (lambda (exp env)
              (apply transformer (cdr exp)))))))))
然后,您可以将我的时间定义为:

(define-macro (my-when test . branch)
  `(if ,test (begin ,@branch)))

+1,特别是建议只使用语法规则。它很卫生,可以避免您以后调试一些非常可怕的错误。谢谢,我以前没有听说过
define syntax rule
。它确实简化了代码。但在这里我遇到了一个问题:当我试图求值
(定义语法规则(我的when测试分支)(if测试(begin分支))
时,它说
;未绑定变量:测试
。顺便说一句,我的方案版本是麻省理工学院方案9.0。1@Javran您是否运行了我粘贴的
(定义语法定义语法规则…
?你需要先这么做。对不起,我以为它已经被定义了。现在它工作了,提前谢谢你@Javran在一些方案实现中,比如Racket和Guile,已经定义了它。在麻省理工学院的计划中,我想情况并非如此。:-)无论如何,很高兴这有帮助。:-)