Qual è la logica alla base della possibilità di riconciliare le variabili in elisir, quando Erlang non lo consente?Elixir: logica alla base della possibilità di legare nuovamente le variabili
risposta
Perché è più semplice.
Date un'occhiata a this question inviato alla mailing list Erlang nel 2009. In particolare questa parte:
mi piace pattern matching nella maggior parte dei casi, ma trovo che scrivo abbastanza codice dove necessario aggiornare incrementalmente una struttura di dati, e sostenendo che il codice è un dolore quando ho codice come:
X = foo(),
X1 = bar(X),
X2 = xyzzy(X1),
blah(X2).
e successivamente si desidera cambiarlo in:
X = foo(),
X1 = whee(X),
X2 = bar(X1),
X3 = xyzzy(X2),
blah(X3).
Ndr - questa è la risposta a questa domanda.
Questo passa attraverso IRC molto. Questo è il risultato della pratica di denominazione variabile delle variabili e non è necessario introdurre il rebinding per "correggerlo"; smetti di usare lettere singole e contatori come nomi di variabili.
Se per esempio che è stato scritto
FooStateX = foo(),
PostBarX = bar(FooStateX),
OnceXyzziedX = xyzzy(PostBarX),
blah(OnceXyzziedX).
Il codice ha dimostrato, non v'è tutto ciò che raro in Erlang (notare la scritta "questo passa attraverso IRC molto"). L'abilità di Elisir di rifondare semplicemente i nomi ci salva dal dover generare nuovi nomi fittizi per le cose in ogni momento. È tutto. È saggio ricordare che i creatori originali di Erlang non stavano cercando di costruire un linguaggio funzionale. Erano semplicemente degli sviluppatori pragmatici che avevano un problema da risolvere. L'approccio di Elisir è semplice pragmatismo.
Ecco la logica direttamente dalla bocca del cavallo:
http://blog.plataformatec.com.br/2016/01/comparing-elixir-and-erlang-variables/
lingue più funzionale non consentono rilegatura di variabili nello stesso ambito. Quindi, l'elisir che consente questo, gli conferisce sicuramente un aspetto non funzionale e imperativo. Il problema di Erlang è piuttosto la mancanza di scopo, o per essere più precisi che esiste un solo ambito in un'intera clausola di funzione. Abbiamo avuto serie discussioni riguardo l'introduzione del campo di applicazione, ma alla fine abbiamo deciso di non farlo perché era incompatibile con il sistema esistente. E gli sviluppatori odiano le modifiche inconsistenti al contrario.
Il modo in cui Erlang ha un grave vantaggio: quando si sbaglia in generale si verifica un errore in modo che è possibile VEDERE l'errore.Questo ha messo a confronto solo un comportamento strano quando una variabile non ha il valore che ci si aspetta che sia MUCH più difficile da rilevare e correggere.
Personalmente penso che il problema dei nuovi nomi di variabili, ad esempio utilizzando lo schema numerico, sia enormemente esagerato. Rispetto al tempo che mi ci vuole per risolvere WHAT Ho intenzione di fare cambiare i nomi delle variabili è banale. E dopo un po 'lo vedi senza rifletterci. Onestamente.
EDIT:
Anche quando concatenamento dati attraverso una successione di funzioni il significato reale dei dati cambia così riutilizzare lo stesso nome della variabile può essere molto fuorviante. Può finire per significare solo un generico "dati che sto passando da una funzione all'altra".
concordato. Penso che gli esempi con variabili numerate siano o inventati o mostrano solo una codifica scadente. Passando ripetutamente i risultati da una funzione come argomenti alla funzione successiva, si urla per la piegatura, non per la rilegatura variabile. –
@SteveVinoski o grida per il pipelining che è un'idea che alcuni linguaggi FP hanno adottato. –
@OnorioCatenacci Ho un problema con il termine "pipelining" e ciò a cui si riferisce. Per me, come vecchio utente Unix e programmatore concorrente, la parola "pipe" urla concorrenza e parallelismo mentre il modo in cui è stato definito in alcuni linguaggi funzionali non ha nulla a che fare con nessuno dei due. È usato solo come zucchero sintattico per chiamate di funzioni annidate. Mentre ciò può essere utile di per sé dovrebbe essere chiamato qualcos'altro, il termine perderà ogni significato. – rvirding
- 1. Logica alla base std :: bool_constant
- 2. Qual è la logica alla base di boost :: none_t?
- 3. Avviso sulla possibilità di nascondere le variabili membro?
- 4. Qual è la logica alla base della rimozione di crt0.o da gcc4.7.x?
- 5. Aggiungere le variabili alla tupla
- 6. Qual è la logica alla base del modo Qt di classificare le classi?
- 7. Ragioni alla base della scelta di 172.16/192.168?
- 8. Qual è la logica alla base dell'uso di def e defn invece di definire solo?
- 9. div di dimensionamento in base alla larghezza della finestra
- 10. buon IDE per Elixir
- 11. estensione logica proposizionale alla logica modale in Haskell
- 12. Qual è l'idea alla base dell'utilizzo di uno stack per le variabili locali?
- 13. Accesso alla variabile EJS nella logica Javascript
- 14. Elixir - Looping e aggiunta alla mappa
- 15. XSLT: imposta più variabili in base alla condizione
- 16. NHibernate SchemaAggiornare nuovamente le chiavi esterne esistenti?
- 17. Motivo logico alla base di STL
- 18. Inserimento della logica di aggiornamento nelle migrazioni
- 19. Consigli architetturali sull'implementazione della logica della GUI
- 20. Lingue che ottimizzano l'utilizzo della programmazione logica
- 21. Incapace di legare i valori dopo aver inserito le righe della tabella con jQuery
- 22. Come chiamare metodo della classe base attraverso puntatore alla classe base che punta alla classe derivata
- 23. CMake obiettivi di costruzione in base alla esistenza della libreria
- 24. Qual è la logica alla base del comportamento di tipo "pretty-printing" dei contenuti misti di XmlDocument?
- 25. Possibilità di una galleria curva
- 26. Rappresentazione visiva della logica di programma
- 27. Qual è l'operatore "pin" per e sono mutabili le variabili Elixir?
- 28. Base 10 alla base n conversioni
- 29. Richiamare nuovamente l'inizializzatore statico
- 30. Clojure che estrae il valore dalla mappa in base alla logica prioritaria
Sì, ma il rebinding significa che perdo il significato unico di una variabile. Ora devo effettivamente analizzare tutto il codice per scoprire cosa significa una variabile solo ora. Questo complica le cose. Questo penso sia peggio di dover generare nuovi nomi. Inoltre, quando si passa il dato attraverso il reale ** significato ** può cambiare, quindi riutilizzare un nome di variabile significa che è appena diventato un nome fittizio. – rvirding
Questa è un'interessante conversazione di Robert e sicuramente una che preferirei avere in un forum in cui abbiamo più spazio per spiegare il nostro modo di pensare su questo. Capisco esattamente quello che stai ricevendo, ma ci sono anche problemi pragmatici; luoghi in cui consentire il rebinding è un approccio più pragmatico della purezza funzionale. –
Onorio inizia una discussione a riguardo sulla mailing list di elisir e ci entrerò. – rvirding