Скажемо, що у нас є такий вираз (смуга "x (bor" y "z)), де діапазон і bor булеві структури, які мають arg1 і arg2.
Якщо я хочу змінити змінні "x і" y на "a і" b глибокою рекурсією виразу, як я можу це зробити?
Відповіді:
2 для відповіді № 1Існує спеціальна форма для функціонального оновлення лише деяких полів у структурі, яку дуже приємно використовувати там, де у вас багато полів:
(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))))
Або ви можете просто провести подібний аналіз справи у своїй процедурі.