希望您能对我有所帮助。对于家庭作业,我应该编写一个函数,该函数使用模式匹配来检查表达式是否与某个结构定义相对应。
这些是定义:
(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的测试已经失败了,我无法直言不讳,为什么...
我一开始就保留了下面的四行,因为我希望专注于加法行,因为我希望这将是对“加法?”行的简单重复。您将如何进行正确处理?另外,您是否建议将数字检查作为结构的元素外包给单独的功能?
干杯!
模式中指定的字段名称将在其各自的子句中绑定。因此,无需谓词。
(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的定义。