表达式的模式匹配

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

希望您能对我有所帮助。对于家庭作业,我应该编写一个函数,该函数使用模式匹配来检查表达式是否与某个结构定义相对应。

这些是定义:

(define-struct literal (value))
(define-struct addition (lhs rhs))
(define-struct subtraction (lhs rhs))
(define-struct multiplication (lhs rhs))
(define-struct division (lhs rhs))

我的代码开始如下:

; An Expression is one of:
; - (make-literal Number)
; - (make-addition Expression Expression)
; - (make-subtraction Expression Expression)
; - (make-multiplication Expression Expression)
; - (make-division Expression Expression)
; interp. abstract syntax tree of arithmetic expressions

(define EXPRESSION-1 (make-literal 42))

(define EXPRESSION-2
  (make-addition (make-literal 4) (make-multiplication (make-literal 5) (make-literal 8))))

(define EXPRESSION-3
  (make-division (make-subtraction (make-literal 11) (make-literal 7)) (make-literal 2)))


; Any -> Boolean
; checks whether e is an Expression
(check-expect (expression? EXPRESSION-1) #true)
(check-expect (expression? EXPRESSION-2) #true)
(check-expect (expression? (make-literal "42")) #false)
(define (expression? e)
  (match e
    [(and (literal?) (number? literal-value)) #true]
    [(and (addition?) (number? addition-lhs) (addition-rhs)) #true]
    [substraction? #true]
    [multiplication? #true]
    [division? #true]
    [... #false]   
))

之所以这样做是因为我必须检查表达式是否为结构,并且我还必须确保该结构的元素不过是数字,否则第二项测试就会失败。但是以某种方式我的方式不起作用,因为对EXPRESSION-1和EXPRESSION-2的测试已经失败了,我无法直言不讳,为什么...

我一开始就保留了下面的四行,因为我希望专注于加法行,因为我希望这将是对“加法?”行的简单重复。您将如何进行正确处理?另外,您是否建议将数字检查作为结构的元素外包给单独的功能?

干杯!

data-structures pattern-matching racket
1个回答
0
投票

模式中指定的字段名称将在其各自的子句中绑定。因此,无需谓词。

(define (expression? e)
  (match e
    [(literal v) (number? v)]
    [(addition l r) (and (expression? l) (expression? r))]
    [(subtraction l r) (and (expression? l) (expression? r))]
    [(multiplication l r) (and (expression? l) (expression? r))]
    [(division l r) (and (expression? l) (expression? r))]
    [_ #false]))

最后一个子句是通配符,即评估RHS的任何值。

第2-5条的相同RHS可以抽象如下:

(define (expression? e)
  (match e
    [(literal v) (number? v)]
    [(or (addition l r) (subtraction l r)
         (multiplication l r) (division l r))
     (and (expression? l) (expression? r))]
    [_ #false]))

但是我更喜欢第一个版本,因为它反映了Expression的定义。

© www.soinside.com 2019 - 2024. All rights reserved.