【问题标题】:Can't use expressions in clauses for racket pattern matching?不能在子句中使用表达式进行球拍模式匹配?
【发布时间】:2019-05-02 10:51:41
【问题描述】:

在球拍中,我编写了这段基本代码。但是球拍似乎不喜欢第一个子句 - 尝试运行它,我收到错误 "match: syntax error in pattern in: (- 3 9)"

(define/match (prob i)
    [((- 3 9)) 0]
    [(_) 4]
)

奇怪的是,如果我使用“列表”过程(即 ((list 3 9)) 而不是 ((- 3 9)) )而不是减法过程,则代码可以工作。什么给了?

【问题讨论】:

  • 如果您想评估表达式并比较值是否相等,请尝试(== (- 3 9))
  • 谢谢,这正是我一直在寻找的东西

标签: pattern-matching racket


【解决方案1】:

如果您的目标是检查参数 i 是否等于 (- 3 9) 解析为的值,那么问题是 Racket match 表单不接受任意表达式作为模式。有关match 表单可以使用哪种模式的更多信息,请查看Pattern Matching 上的Racket 文档(您可能会注意到(list ...) 包含在允许的模式中,正如您所观察到的!)。然而,简单的答案(正如 Alex Knauth 评论的那样)是用 (== (- 3 9)) 替换 (- 3 9)

另一方面,如果您的目标是检查提供给(prob i) 的参数是否字面上是表达式(- 3 9),而不管它的计算结果是什么,那么define/match 就不够了。球拍功能是pass by value。因此,当有人将表达式作为参数 i 传递给您的 prob 函数时,i 等于该表达式的求值结果,即

(define (some-function some-argument)
    some-argument) ; we just get the number 3 for some-argument
                   ; and have no way of knowing via this function
                   ; that someone actually passed us the expression
                   ; (- (- 9 1) 5)

(some-function (- (- 9 1) 5))

我们必须使用不同的工具,称为macro。在评估符号之前,宏对程序文本进行操作。 (prob i) 函数的宏实现将在 REPL 上像这样工作:

> (define-syntax-rule (prob i)
    (if (equal? 'i '(- 3 9))
      0
      4))
> (prob (- 3 9))
0
> (prob -6)
4
> (prob 78)
4

这就是所谓的“语法规则”。它引用了参数i,然后将它与引用的表达式(- 3 9) 进行比较,以查看它是否以i 的形式提供。如果您还有任何问题,请告诉我!祝你好运!

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2023-03-21
    • 2016-07-13
    • 1970-01-01
    • 2020-06-19
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多