使用#lang plai定义类型时出现错误语法错误

问题描述 投票:0回答:1

我在这段代码上遇到了严重的语法错误

(define-type OE
  [group (expr1 OE?) (expr2 OE?)]
  [sequentially (expr1 OE?) (expr2 OE?)]
  [together (expr1 OE?) (expr2 OE?)]
  [join (expr1 OE?) (expr2 OE?)]
  [arrive (expr OE?)]
  [give (expr1 OE?) name (id-ref1 symbol?) in (expr2 OE?)]
  [(string-literal string?)]
  [(id-ref2 symbol?)])

更具体地说,这个错误:

xxx:22.0: define-type: bad syntax in: (define-type OE (group (expr1 OE?) (expr2 OE?)) (s... (arrive (expr OE?)) (give (expr1 OE?) name (id-ref1 symbol?) in (expr2 OE?)) ((string-literal ...
  #(739 316)

我是这门语言的新手,所以有人能告诉我我的代码有什么问题以及如何消除错误吗?

syntax-error racket plai
1个回答
0
投票

以下是导致语法错误的有问题的行:

i   --> [give (expr1 OE?) name (id-ref1 symbol?) in (expr2 OE?)]
ii  --> [(string-literal string?)]
iii --> [(id-ref2 symbol?)]

docs中所述,

define-type
具有结构

(define-type type-id variant ...)

哪里

variant = (variant-id (field-id contract-expr) ...)

因此,每个variant必须有一个variant-id,并且每个field-id必须有一个关联的contract。违反这一点是导致语法错误的原因。

(i)
的情况下,namein 都缺少合约,因此可能的解决方案是将合约添加到字段中,如下所示(使用
string?
作为示例合约):

[give (expr1 OE?) (name string?) (id-ref1 symbol?) (in string?) (expr2 OE?)]

(ii)
(iii)
都缺少variant-ids,因此添加它们将解决问题:

[some-variant-id (string-literal string?)]
[some-other-variant-id (id-ref2 symbol?)]

以下是该类型的可能重写,以及建议的更改:

(define-type OE
  (group (expr1 OE?) (expr2 OE?))
  (sequentially (expr1 OE?) (expr2 OE?))
  (together (expr1 OE?) (expr2 OE?))
  (join (expr1 OE?) (expr2 OE?))
  (arrive (expr OE?))
  (give (expr1 OE?) (name string?) (id-ref1 symbol?) (in string?) (expr2 OE?))
  (some-variant-id (string-literal string?))
  (some-other-variant-id (id-ref2 symbol?)))
© www.soinside.com 2019 - 2024. All rights reserved.