[英]Replace elements of a struct in Racket
假设我们有以下表达式(band'x(bor'y'z)),其中band和bor布尔结构分别具有arg1和arg2。
如果我想通过表达式的深度递归将变量'x和'y更改为'a和'b,我该怎么做?
有一种特殊的形式可以在功能上更新结构中的某些字段,如果您有很多字段,可以很好地使用它:
(struct person (name age occupation) #:transparent)
(define p (person "Per" 19 "Painter"))
(define (change-occupation p new-occupation)
(struct-copy person p [occupation new-occupation]))
(change-occupation p "Programmer") ; ==> (person "Per" 19 "Programmer")
当然,这只是一种奇特的书写方式:
(define (change-occupation p new-occupation)
(person (person-name p)
(person-age p)
new-occupation))
现在,我不知道您的两个结构的名称,但是您可能需要创建一个通用的访问器,除非一个是另一个的子类型:
(define (change-first obj new-value)
(if (band? obj)
(band new-value (band-second obj))
(bor new-value (bor-arg2 obj))))
或者,您也可以在过程中进行类似的案例分析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.