Mi chiedo se qualcuno abbia provato a creare un linguaggio in cui si possano scrivere le mutazioni in uno stile imperativo diretto, e il compilatore trasforma automaticamente le modifiche in azioni puramente in stile Redux. Ad esempio (pseudo-js):
atomic function repaint_car(car) {
car.color = "Blue"
car.value += 1000
}
sarebbe convertito in:
{
type: REPAINT_CAR,
new_color: "Blue",
delta_value: 1000
}
Per chiarire, non mi aspetto che questo funzioni per il codice arbitrario , naturalmente. Lo applicheresti a un ambito di codice che muta uno o più plain-old -Data (POD) oggetti. La lingua o lo strumento creerebbe quindi un oggetto "azione" equivalente.
Penso che questo sarebbe di aiuto se si desidera modificare qualcosa profondamente annidato nello stato. Spesso è difficile nella programmazione funzionale costruire il nuovo stato, ma nel codice mutevole basta scrivere state.garage[0].cars.cupholder.color = "blue"
(come esempio esagerato).
Puoi anche convertire il codice per utilizzare il schema di comando . Sebbene non sia funzionale, contiene la mutazione di stato e svolge un ruolo simile a Redux:
class RepaintCarCommand extends Command {
constructor(color, value) {
this.color = color;
this.value = value;
}
function do(car) {
this.previous_color = car.color;
this.previous_value = car.value;
car.color = this.color;
car.value += this.delta_value;
}
function undo(car) {
car.color = this.previous_color;
car.value = this.previous_value;
}
}
Inoltre renderebbe più semplice la transizione dall'app semplice a quella complessa. Se si inizia con una semplice applicazione sequenziale e, a un certo punto, si decide di aggiungere la funzionalità di annullamento, è necessario riscrivere tutto per utilizzare lo schema di comando. Questa funzionalità ti consentirebbe di isolare le mutazioni, senza ristrutturare troppo l'applicazione.
Questa idea ha un nome? Qualche lingua lo implementa? O ci sono dei motivi per cui sarebbe impossibile o non sarebbe una buona idea?
(Nota: non sto cercando una raccomandazione per la lingua: questa è una domanda sulla programmazione del linguaggio di programmazione. Mi piacerebbe sapere se questa idea ha un merito, e spero di imparare qualcosa sulle equivalenze tra mutevole e immutabile / costrutti funzionali. Non chiudere questa domanda come una domanda di "raccomandazione".)