Lorsque vous apprenez un nouveau langage de programmation, vous rencontrez parfois une fonctionnalité de langage qui vous donne envie de l'avoir dans vos autres langages de programmation que vous connaissez.
Quelles sont les fonctionnalités de langage qui étaient au moment de l'apprentissage très nouvelles pour vous et que vous souhaiteriez avoir pour vos autres langages de programmation.
Un exemple de ceci est les générateurs en Python ou C #. D'autres exemples peuvent inclure des listes de compréhension en Python, un modèle en C ++ ou LINQ en .NET ou une évaluation paresseuse en Haskell.
Quelles autres fonctionnalités de langage semi-uniques avez-vous rencontrées qui étaient complètement nouvelles et instructives pour vous? Y a-t-il d'autres caractéristiques des anciens langages de programmation qui étaient uniques et qui sont tombées en désuétude?
la source
Macros Lisp.
Le langage macro Lisp est Lisp, avec quelques fonctionnalités de syntaxe prédéfinies pour des raisons de commodité. En les utilisant, il est possible d'ajouter des fonctionnalités majeures au langage, telles que le choix des styles d'orientation d'objet ou la correspondance déterministe de type Prolog, sans regarder à sa place. Cela rend la
setf
macro possible, qui est une macro conceptuellement très puissante:(setf A B)
signifie que, lorsque vous évaluez,A
vous obtiendrezB
, et qui peut être étendu à n'importe quelle limite que vous aimez.La métaprogrammation de modèles C ++ est capable de choses similaires, mais dans un langage très différent du C ++ normal.
la source
Décorateur de Python.
Il est extrêmement facile de mettre en œuvre la mémorisation ou le timing de la fonction à l'aide du décorateur.
Exemple de temporisateur de fonction.
Maintenant, si vous avez une fonction que vous voulez chronométrer, vous pouvez simplement le faire,
Vous verrez quelque chose comme,
La fonction 'foo' a pris 3 secondes.
la source
Casting
void*
en C. Vous pouvez tout caster en octets bruts et faire ce que vous voulez avec ces données.(Oui, de nos jours c'est unique ...)
la source
void*
...Pointer
en Pascal et Object Pascal fait la même chose.int64_t
que vous ne pouvez pas toujours lancer en toute sécuritévoid *
(Désolé pour la fin - 2 ans - réponse).Rendement en Python
En Python (et je crois en C #), vous pouvez définir un soi-disant générateur qui suspend l'exécution de la fonction à une
yield
instruction, renvoie la valeur et lors des appels suivants, redémarre la fonction là où elle s'était arrêtée (avec l'état préservé entre les appels). C'est idéal pour générer de longues listes de valeurs où vous n'êtes intéressé que par la valeur actuelle de la fonction (ce qui est très courant). Il vous permet de créer des séquences potentiellement infiniment longues tout en n'occupant qu'un espace très limité en mémoire.la source
Expressions lambda (fermetures, fonctions imbriquées, méthodes anonymes, peu importe comment vous les appelez).
Je les ai rencontrés pour la première fois en Perl, je les ai immédiatement aimés et je me suis demandé pourquoi d'autres langues ne les avaient pas. De nos jours, je suppose que ce n'est plus si unique; même PHP a réussi à les pirater d'une manière ou d'une autre. Mais ils étaient semi-uniques à l'époque.
la source
Continuations de Scheme (adopté plus tard par quelques autres langues dont Ruby.)
la source
Les ensembles dans Delphi sont très utiles, à peu près juste un tableau booléen nommé. Ils sont très utiles pour enregistrer un formulaire de paramètres avec 32 cases à cocher. Mais ils ont tous les mêmes fonctions de théorie des ensembles (c'est-à-dire la différence, l'intersection, l'union).
Je ne sais pas s'ils sont passés de mode, mais je les utilise tout le temps.
la source
Envoyer
Depuis Erlang. Envoie un message asynchrone à un autre thread.
Recevoir
Depuis Erlang. Reçoit un message d'un autre fil.
la source
Propriétés C #
contre
(Java)
la source
Les syndicats en C
Je ne peux honnêtement pas dire que je n'ai pas écrit assez de C pour en faire moi-même mais j'ai travaillé avec le code des autres qui le fait.
Lorsqu'il s'agit d'empaqueter des mélanges de données différentes dans des applications qui manipulent des bits / octets bruts tels que la mise en réseau ou le stockage de données binaires. Dans les langues fortement typées, il n'y a tout simplement pas de moyen facile de faire l'équivalent.
Avertissement:
Bien que les unions soient extrêmement utiles dans certains cas, elles ne se trouvent pas dans la plupart des langues de niveau supérieur car elles ne sont pas sécurisées. IE, vous pouvez faire saigner les données au-delà des limites des variables en utilisant les unions (un grand non non dans le monde sûr de type). Un grand pouvoir implique de grandes responsabilités.
la source
union
utilisation est sûre, certains sont des idiomes bien pris en charge (bien que techniquement incorrects) - voir cellperformance.beyond3d.com/articles/2006/06/… (bien que ce soit plus un problème avec des pointeurs, les syndicats peuvent bien le simuler).record
syntaxe pour prendre en charge les syndicats:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
J'aime vraiment le modificateur sauf dans Ruby . Cela semble si naturel et remplace de nombreux scénarios où votre code semble être très désordonné sans lui.
Comment peux tu ne pas aimer cela? :RÉ
la source
unless
etwhen
qui remplacent les scénarios de branchement les plus courants qui seraient traditionnellement utilisésif/else
.syntaxes d'argument fantaisie python
Je ne sais pas à quel point c'est unique, mais en python, vous pouvez faire des trucs sympas comme avoir des paires de mots clés automatiquement transformées en dictionnaire et inversement. Idem pour les listes:
documents python (faites défiler vers le bas pour plus d'informations sur le passage d'arguments)
la source
Le préprocesseur C. Vous pouvez même écrire du code commun sur différentes plates-formes avec - moins ou plus - ifdefs.
la source
Catégories Objective-C
Les catégories offrent un moyen simple d'étendre les fonctionnalités d'un objet au moment de l'exécution (pensez à la composition plutôt qu'à l'héritage). L'exemple classique consiste à ajouter un correcteur orthographique à la classe NSString.
Également utile pour les corrections de bogues à faible impact, car l'implémentation d'une méthode d'une catégorie remplacera l'implémentation de ses parents.
la source
La méthode d' injection de Ruby combinée avec le symbole # to_proc de Ruby 1.9 permet d'écrire du code incroyablement concis (mais toujours lisible):
par exemple
(1..10).inject(:+)
qui additionne les entiers 1 à 10 => 55
Voir des exemples comme celui-ci m'a donné envie d'apprendre Ruby, ce que je viens de commencer à faire.
la source
Le mécanisme de liaison dans JavaFX (RIP). Le mot clé bind vous permet de lier la valeur d'une variable à la valeur d'une expression et de vous débarrasser de tous ces vilains Listener quel que soit le code passe-partout.
Bien que JavaFX ait été un échec à bien des égards, j'ai trouvé de nombreuses fonctionnalités du langage de script assez agréables.
la source
Les mixages de chaînes plus l'évaluation de la fonction de temps de compilation en D sont une caractéristique de tueur assez unique. Oui, techniquement, ce sont deux fonctionnalités, mais la vraie puissance vient de leur combinaison. Avec cette combinaison, vous pouvez écrire des fonctions D normales qui génèrent du code sous forme de chaîne au moment de la compilation, puis mélanger ce code dans n'importe quelle étendue et le faire évaluer en tant que code D normal. Le code est entièrement compilé statiquement et s'exécute exactement comme s'il avait été écrit à la main. Cette fonctionnalité est même utilisée pour contourner quelques situations délicates dans la bibliothèque standard.
la source