【问题标题】:Scheme/Racket: Syntax parser matching confusedScheme/Racket:语法解析器匹配混淆
【发布时间】:2020-02-13 05:44:19
【问题描述】:

这段代码运行良好:

(require syntax/parse/define (only-in racket [#%app racket:#%app]))
(define-syntax-parser #%app
    [(_ Cond {~datum ?} Form1 ...) 
    #'(when Cond Form1 ...)]
    [(_ Cond {~datum ??} Form1 ... {~datum :} Form2 ...) 
    #'(if Cond (begin Form1 ...) (begin Form2 ...))]
    [(_ Xs ...) 
    #'(racket:#%app Xs ...)]
)

(#t ? (displayln 1))
(#t ?? (displayln 1) : (displayln 2))

但是,我希望将 ?? 更改为单个 ?。 Racket 显示错误,为什么 Racket 不匹配第二种语法?

:: undefined;
 cannot reference an identifier before its definition

Racket 是否将 if 语法与右上方的 when 语法混淆了? 如何修复它以对 whenif 使用相同的 ?

【问题讨论】:

    标签: parsing syntax scheme lisp racket


    【解决方案1】:

    我发现了如何,whendefine-syntax-parser 中的if 之前首先定义,它的语法包括省略号... 匹配它后面的所有内容,包括if-else 中的:

    修复如下,把if的语法放在前面:

    (require syntax/parse/define (only-in racket [#%app racket:#%app]))
    (define-syntax-parser #%app
        [(_ Cond {~datum ?} Form1 ... {~datum :} Form2 ...) 
        #'(if Cond (begin Form1 ...) (begin Form2 ...))]
        [(_ Cond {~datum ?} Form1 ...) 
        #'(when Cond Form1 ...)]
        [(_ Xs ...) 
        #'(racket:#%app Xs ...)]
    )
    
    (#t ? (displayln 1))
    (#t ? (displayln 1) : (displayln 2))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      相关资源
      最近更新 更多