Ho trovato questo post alla ricerca di espressioni idiomatiche comuni in C ++, dato che mi sono approfondito di recente e vorrei che il mio codice non sembrasse così amatoriale come lo sento ... :-P
Dopo aver trascorso un bel po 'di tempo con Perl, ho scoperto che i modi di dire in quella lingua erano molto simili a quelli che si trovano nelle lingue naturali, come l'inglese o lo spagnolo (solo due ne conosco abbastanza bene per conoscere alcuni modi di dire).
Non sono d'accordo sul fatto che un linguaggio sia come un "piccolo modello di progettazione". Sono ancora in disaccordo, sebbene meno, che un linguaggio sia un modo per aggirare una carenza di una lingua.
Forse la risposta di Luc Danton si avvicina di più, ma lasciami spiegare. Penso che un linguaggio sia, beh, idiomatico di coloro che usano la lingua. Di solito, un'espressione o una sequenza di espressioni comuni che, sebbene forse non ovvia, esegue un'operazione o esprime l'intento in un modo che ha senso per coloro che sono abbastanza fluenti da averlo visto prima.
Tornando a Perl, forse il linguaggio più noto è la " Trasformazione di Schwartzian ", un'espressione che esegue una sorta di ordinamento sui dati in modo compatto ed efficiente. Non è il modo più ovvio per eseguire un'operazione del genere, ma è succinta e coloro che l'hanno vista prima sanno immediatamente cosa sta facendo.
Un altro esempio notevole è " The Orcish Maneuver ", che sfrutta le nozioni di perl di operatori veri / falsi, ricchi e precedenza degli operatori.
Uno che personalmente mi piace un po 'è in qualche modo legato alla manovra degli Orchi, ma non conosco alcun nome per questo:
push @{ $some_hash{$key} ||= [] }, $some_value;
Non si tratta in realtà di offuscamento, ma piuttosto di un'espressione chiara e compatta di qualcosa che altrimenti richiederebbe diverse linee. Se la chiave è presente nell'hash e ha un valore vero, de-referenziarla come matrice e spingere $ some_value su quella matrice. Se l'elemento hash non è presente o ha un valore falso, assegnagli un array vuoto, quindi fai la dereference e fai il push.
Vale anche la pena notare che a partire da Perl 5.14, parte di questo idioma è obsoleto - push ora può operare direttamente sul riferimento dell'array, non è necessario @ {}! Inoltre, a partire da Perl 5.10, si può usare // = invece di || = che verifica non la verità ma la definizione.