首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语法中的文字-规则在Scheme中的库中无效

语法中的文字-规则在Scheme中的库中无效
EN

Stack Overflow用户
提问于 2022-04-04 08:38:10
回答 1查看 72关注 0票数 1

我想要定义新的语法。如果我在没有库的情况下定义它

代码语言:javascript
复制
(define-syntax sample1
  (syntax-rules (:times)
    [(_ n :times body ...)
     (list n (sample1 body ...))]
    [(c body ...)
     '(body ...)]))

它按预期工作,但如果我把它放在图书馆里:

代码语言:javascript
复制
(library (alib)
  (export sample2)
  (import
    (rnrs))
  (define-syntax sample2
    (syntax-rules (:times)
      [(_ n :times body ...)
       (list n (sample2 body ...))]
      [(c body ...)
       '(body ...)])))

:times文本停止工作。如果我将:times替换为已经存在的宏(如=>else )中的文本表示,则可以工作。

以下是Chez中的完整示例:

代码语言:javascript
复制
(define-syntax sample1
    (syntax-rules (:times)
      [(_ n :times body ...)      
       (list n (sample1 body ...))]
      [(c body ...)
       '(body ...)]))
(sample1 a b c d)
;; => (a b c d)

(sample1 10 :times a b c d)
;; => (10 (a b c d))

(library (alib)      
    (export sample2)
    (import 
      (rnrs))
    (define-syntax sample2
      (syntax-rules (:times)
        [(_ n :times body ...)      
         (list n (sample2 body ...))]
        [(c body ...)
         '(body ...)])))
(import (alib))
(sample2 10 :times a b c d)
;; => (10 :times a b c d)
EN

回答 1

Stack Overflow用户

发布于 2022-05-20 14:50:20

您可以使用挡泥板表达式作为辅助关键字的替代。

代码语言:javascript
复制
(library (alib)
  (export sample2)
  (import
   (chezscheme)) ;; <= required for syntax-rules fenders
  (define-syntax sample2
    (syntax-rules ()
      [(_ n :times body ...)
       (eq? (datum :times) ':times) ;; <= fender
       (list n (sample2 body ...))]
      [(c body ...)
       '(body ...)])))
(import (alib))
(sample2 10 :times a b c d) ;; => (10 (a b c d))

定义一个keyword?宏以使护舷更干净。

代码语言:javascript
复制
(library (meta)
  (export keyword?)
  (import (chezscheme))
  (define-syntax keyword?
    (syntax-rules ()
      [(_ x) (eq? (datum x) 'x)])))

(library (alib)
  (export sample2)
  (import (meta) (chezscheme))
  (define-syntax sample2
    (syntax-rules ()
      [(_ n :times body ...)
       (keyword? :times)
       (list n (sample2 body ...))]
      [(c body ...)
       '(body ...)])))
(import (alib))
(sample2 10 :times a b c d) ;; => (10 (a b c d))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71734227

复制
相关文章

相似问题

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