Racket 的语法分析:标识符不符合预期

Racket's syntax-parse: identifier not matching as expected

我在使用 Racket 的 syntax-parse 时遇到了问题。特别是,我收到以下错误消息:

unknown: rule: expected one of these identifiers: `model', `line', or `rule'
at: rule
in: (rule (predicate (symbol "T") "[" (symbol-list (symbol "X")) "]") "<-" (predicate (symbol "Q") "[" (symbol-list (symbol "X")) "]"))

为什么 rule 语法对象与标识符不匹配?我正在按如下方式调用函数:

(define (parse-carl s)
(syntax-parse s
    [((~literal model) ~rest x)
        (with-syntax ([x (map parse-carl (syntax-e #'x))]) #'x)]
    [((~literal line) x) (with-syntax ([x (parse-carl #'x)]) #'x)]
    [((~literal rule) p1 "<-" p2) 'ok]))

这是输入(通过 syntax->datum):

(model (line (rule (predicate (symbol T) [ (symbol-list (symbol X)) ]) <- (predicate (symbol Q) [ (symbol-list (symbol X)) ]))) 
(line (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <-   (predicate (symbol Q) [ (symbol-list (symbol X)) ]))) 
(line (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <- (predicate (symbol T) [ (symbol-list (symbol X)) ]))) 
(line (query (rule (predicate (symbol Y) [ (symbol-list (symbol X)) ]) <- (predicate (symbol T) [ (symbol-list (symbol X)) ])) ?)) 
)

提前致谢。

rule真的定义了吗? ~literal识别绑定,没有绑定就不行。在这种情况下,您需要 ~datum