首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将涉及语法大小写的r6rs宏转换为racket?

如何将涉及语法大小写的r6rs宏转换为racket?
EN

Stack Overflow用户
提问于 2022-11-11 05:30:18
回答 1查看 95关注 0票数 1

我正在学习方案/球拍宏,并试图使以下宏从甜宏工作在球拍8.6下。

代码语言:javascript
复制
#lang racket

(require (for-meta 1 srfi/1)) ; for cons* and fold-right
(provide guarded-syntax-case)

;;GUARDED-SYNTAX-CASE
(define-syntax guarded-syntax-case
  (let ((add-clause
         (lambda (clause acc)
           (syntax-case clause ()
             ((pattern skeleton . rest)
                (syntax-case #'rest ()
                  ((cond? else1 else2 ...)
                   (cons*
                    #'(pattern cond? skeleton)
                    #'(pattern (begin else1 else2 ...))
                    acc))
                  ((cond?)
                   (cons #'(pattern cond? skeleton) acc))
                  (()
                   (cons #'(pattern skeleton) acc))
                  ))))))
    (lambda (x)
      (syntax-case x ()
        ((guarded-syntax-case y (literal ...) clause ...)
         (with-syntax (((c ...) (fold-right add-clause '() #'(clause ...))))
           #'(syntax-case y (literal ...) c ...)))))))
;;END

宏是为plt-r6rs编写的,但我想在球拍解释器/REPL中进行实验(这在球拍的r6rs中是禁止的)。

除了添加进口产品之外,我无法取得很大进展:

代码语言:javascript
复制
(require (for-meta 1 srfi/1))

现在,在测试guarded-syntax-case时,我假设它类似于racket/r6rs syntax-case,但是有一些附加的功能。因此,我测试了以下经过调整的示例:

代码语言:javascript
复制
(syntax->datum
   (guarded-syntax-case #'(+ 1 2) ()
    [(op n1 n2) #'(- n1 n2)]))

但有个错误:

代码语言:javascript
复制
. . null-list?: argument out of domain #<syntax:my-sweet.rkt:26:61 (((op n1 n2) (syntax (- n1 n2))))>

很长一段时间后,我不知道如何修复这个错误,因为我刚刚开始学习宏。

有人能帮我解释一下为什么这个宏不适用于球拍,以及如何让它与球拍一起工作?

我只能猜到树枝:

代码语言:javascript
复制
              (()
               (cons #'(pattern skeleton) acc))

在上面的示例中达到。我看到不同的方案实现在转换到/从语法对象时可以不同地处理#'(pattern skeleton)。所以这里的cons可能是个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-11-14 22:07:55

(不是对问题的回答,而是太长,不能发表评论):

人们可能会注意到,guarded-syntax-case似乎在模仿syntax-case的标准R6RS护舷选项,这是在球拍中提供的。可以编写在multi-define中使用guarded-syntax-case甜宏示例:

代码语言:javascript
复制
#lang racket
(require test-engine/racket-tests)
        
(define-syntax multi-define
  (lambda (x)
    (syntax-case x ()
      [(_ (name ...) (value ...))                       ; pattern
       (or (= (length (syntax->datum #'(name ...)))     ; fender ("guard")
              (length (syntax->datum #'(value ...))))   ;
         (raise-syntax-error 'multi-define "Names and values do not match" #f #f
                             (list #'(name ...) #'(value ...))))
       #'(begin (define name value) ...) ])))           ; template ("skeleton")

(multi-define (a b) (1 2))
(check-expect a 1)
(check-expect b 2)

(multi-define (a b c) (1 2))

(test)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74398383

复制
相关文章

相似问题

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