/ / Sostituisci elementi di una struttura in Racket: ricorsione, booleana, schema, racchetta

Sostituisci elementi di una struttura in Racket: ricorsione, booleana, schema, racchetta

Diciamo che abbiamo la seguente espressione (banda "x (bor" y "z)), dove band e bor boolean struct che hanno arg1 e arg2.

Se voglio cambiare le variabili "xe" y "a" e "b" con una ricorsione profonda sull'espressione, come posso farlo?

risposte:

2 per risposta № 1

Esiste un modulo speciale per l'aggiornamento funzionale di alcuni campi in una struttura che è molto utile da usare in cui sono presenti molti campi:

(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")

Ovviamente questo è solo un modo elegante di scrivere:

(define (change-occupation p new-occupation)
(person (person-name p)
(person-age p)
new-occupation))

Ora non conosco i nomi delle tue due strutture ma potresti aver bisogno di creare un accessorio generico a meno che uno non sia sottotipo dell'altro:

(define (change-first obj new-value)
(if (band? obj)
(band new-value (band-second obj))
(bor new-value (bor-arg2 obj))))

Oppure puoi semplicemente avere un'analisi del caso simile nella tua procedura.