Posso pensare a tre principali motivi per cui in genere non è possibile invertire a livello di codice una funzione arbitraria nella maggior parte dei linguaggi di programmazione generale:
-
Solo una funzione one-to-one (ovvero una "biiezione") può essere invertita anche in linea di principio. Ciò significa che la funzione deve produrre un valore di output univoco per ogni singola combinazione possibile di input. In pratica la maggior parte delle funzioni non sono uno a uno, né avrebbe alcun senso per loro. Ad esempio, una funzione di analisi JSON corretta produrrà lo stesso POJO per molte stringhe diverse.
-
La funzione dovrebbe essere composta interamente da operazioni / funzioni che hanno inversioni note. Persino le operazioni aritmetiche di base non sono del tutto invertibili (a causa di overflow, underflow, errori di arrotondamento e problemi di divisione per zero), e per quanto ne so i metodi incorporati della maggior parte dei linguaggi sono in gran parte non invertibili (concatenando stringhe, accesso gli elementi dell'array, le sottostringhe, ecc. non sono tutti uno a uno).
-
Non ha senso parlare di invertire una funzione che ha effetti collaterali. Qual è l'opposto dell'invio di dati tramite una connessione di rete, il salvataggio di dati su un disco rigido o la stampa di un carattere su uno schermo? In alcuni contesti queste operazioni potrebbero essere annullabili, ma non è possibile annullare la stampa di un carattere prima che i caratteri siano stati stampati, mentre è possibile decrementare un intero senza prima accrescerlo.
Tuttavia, è teoricamente possibile progettare una lingua (o una DSL nella tua lingua preferita) che consiste esclusivamente di operazioni strettamente invertibili, in cui sarebbe possibile invertire a livello di codice qualsiasi funzione. I link nella risposta di Jörg coprono molto meglio di me.
Ai fini del tuo importatore / esportatore JSON, è probabile che semplicemente scrivendo due percorsi separati del codice sarebbe molto meno lavoro rispetto alla costruzione di un DSL invertibile con tutte le operazioni di costruzione di stringhe e oggetti necessarie per fare ciò che vuoi. / p>