Quali sono alcuni esempi di "sfarfallio" che rendono più utile un linguaggio di programmazione?

5

Da la risposta accettata a "Perché è utile il Lisp?":

 5. Wartiness. The real world is messy. Pragmatic coding winds up having to either use or invent messy constructs. Common Lisp has sufficient wartiness that it can get stuff done.

Anche questo pensiero mi è venuto in mente. Attualmente sto sviluppando un'applicazione il cui back-end ho scelto di scrivere in Haskell e il cui frontend è in PHP. La mia esperienza è stata che trattare con codice disordinato in PHP è molto più facile che trattare con codice disordinato in Haskell. Tuttavia, è il mio codice e il mio codice PHP probabilmente non è poi così male.

Un semplice esempio di "wartiness" è l'operatore == di PHP (uguaglianza). Sai, il tipo di uguaglianza dove '' == 0 è vero. Dato che sono diffidente con == , spesso scelgo di utilizzare l'operatore === di PHP (uguaglianza rigorosa) invece:

$is_admin = ($gid === 24 || $gid === 25);

Tuttavia, l'utilizzo di cui sopra si è rivelato sbagliato. Il valore $gid proviene dal database ed è ancora una stringa. Questa volta, l'operatore di uguaglianza rigorosa mi ha morso, e mi sarei risparmiato qualche minuto semplicemente dicendo:

$is_admin = ($gid == 24 || $gid == 25);

Considera un'altra identità interessante:

php> var_dump('0012345' == '12345');
bool(true)

Che diamine ?! == su due stringhe non è nemmeno il confronto tra stringhe! Tuttavia, considera se l'utente riceve una carta d'identità che dice 0012345 , ma l'ID del database è semplicemente 12345 . Gli utenti potrebbero avere problemi ad accedere alla tua applicazione se scegli di utilizzare === . Certo, riceverai una segnalazione di bug e sarai in grado di correggere la tua applicazione piuttosto che fare affidamento su questa caratteristica oscura. Ma ci vorrà più tempo. Preferirei trascorrere quel tempo fuori. È davvero una bella giornata.

Al contrario, ecco un esempio di sfortuna non utile nella maggior parte dei casi:

js> parseInt(031);
25

Quali sono alcuni esempi più concreti in cui "sfarfallio" ti aiuta a fare le cose? Per favore spiega perché; non limitarti a elencare le funzionalità di Haskell.

Un altro modo di metterlo: quali sono le caratteristiche del linguaggio viziato di cui essere consapevole e come possiamo usarle per risparmiare tempo?

    
posta Joey Adams 22.12.2011 - 17:49
fonte

3 risposte

7

Penso che il principio generale qui sia che quando la forma delle verruche nella lingua coincide con la forma delle verruche sulle tue esigenze, allora si annullano e puoi programmare come se nessuno dei due fosse verrucoso.

Hai chiesto un esempio, quindi dirò che in java-script puoi "analizzare" JSON semplicemente usando eval ().

Ho scelto quell'esempio perché mostra i pericoli dello stile di programmazione "allineamento delle verruche": fare un eval () sulle stringhe JSON è un enorme rischio per la sicurezza a meno che tu non controlli la stringa che stai valutando completamente. (È per questo che lo chiamo verrucoso - la definizione è un po 'soggettiva).

Nei tuoi esempi, le conversioni da stringa a int incorporate nella lingua erano grandiose quando era così che volevi che funzionasse, ma quando funzionava in modo diverso (come parseInt (031) - > 25) non era la pignoleria che aiutava, ma in realtà la pigrizia dovevi programmare intorno.

Il problema delle sviste in un linguaggio di programmazione è che generalmente hai un controllo limitato su di esso, quindi se le tue esigenze vanno alla deriva un po 'in modo che le verruche non si allineano più, tutto ciò che rimane è due set di verruche da programmare, quelli dei tuoi requisiti più quelli della lingua.

    
risposta data 22.12.2011 - 19:17
fonte
2

Un semplice esempio è circa la metà di C ++. Ci sono sezioni di C ++ che francamente sono solo malattie che dovrebbero essere rimosse, ed è ovvio, ad esempio, decadimento array / pointer. Ma vengono mantenute perché aumenta la compatibilità con C, una cosa utile.

    
risposta data 22.12.2011 - 18:13
fonte
1

Esempio rapido, non il migliore.

In CL, la verità non è nulla. È piuttosto abbozzato, giusto? In genere, vuoi vedere se qualcosa è Vero, non determinare se non è nulla. Vero è un sottoinsieme di non nulla.

Ma se strizzi un po ', ti rendi conto che in realtà non importa più del tempo, e riduce anche la dimensione del codice, invece di chiedere (if (eq foo #t) this that) , puoi fare (if foo this that) . Scheme prende il primo approccio.

Sono ragionevolmente sicuro che un progettista di PL possa dare grandi discussioni qui, ma sfortunatamente non sono io oggi.

Per citare una citazione di vaga provenienza ...

  • Schemer: "Buddha è piccolo, pulito e serio".
  • Lispnik: "Il Buddha è grande, ha le ascelle pelose e ride".

Inoltre, ho citato. Woot!

    
risposta data 22.12.2011 - 22:13
fonte

Leggi altre domande sui tag