Imagine un langage de programmation objet dans lequel on ne peut avoir que des méthodes qui renvoient des chaînes de caractère. Tu peux avoir un objet du genre Fonction, qui fournit une méthode Fonction::dérivée, mais cette méthode ne renvoit pas une fonction mais une chaîne, que tu dois parser pour avoir une fonction. Pour calculer une dérivée seconde, on fait:
f = Fonction.parse("3x2+4x+6")
f'' = Fonction.parse( (Fonction.parse(f.dérivée).dérivée )
Tout le monde sera d'accord pour dire que ce n'est pas très efficace: la méthode dérivée est obligée de convertir sa valeur de retour en chaîne de caractères, et après on est obligé de parser à nouveau pour avoir une fonction. Il serait bien plus simple de manipuler les objets sans passer par des chaines:
f = Fonction.parse("3x2+4x+6")
f'' = f.dérivée.dérivée
Dans cette analogie, le premier langage c'est les commandes Unix et la communication par flux. Comme tu ne peux pas échanger des objets, tu dois te taper les conversions de données à chaque fois.
Maintenant, pour en venir à ton objection:
Si tu passes un objet, imagine faire un grep, si tu n'a acces qu'à des méthodes, c'est comme si grep était inclus dans l'objet d'entrée ! Donc il n'y plus d'interet à piper.
Je te répondrais que ce n'est pas vrai dans l'analogie des langages de programmation, et que ce n'est pas vrai non plus dans le cas de programmes qui communiquent avec des objets. Pourquoi ? Parce que si on peut emboîter des objets dans un langage objet, on peut aussi emboiter des programmes qui manipulent des objets.
Typiquement, un programme Grep n'est applicable qu'à des objets contenant des chaînes de texte. Donc, le programme Grep serait défini comme recevant en entrée des objets implémentant la méthode read_char, et c'est tout ce qui est nécessaire, pas besoin de coder un grep dans l'objet lui même. Dans ce cas, l'objet reçu en entrée est en pratique un flux, comme dans le bon vieux Unix, parce que par définition Grep fonctionne sur des flux.
Maintenant si on prend un programme qui manipule autre chose que des flux, par exemple des dates, on a intéret à pouvoir lire en entrée directement un objet Date avec ses méthodes day, week, year, etc.
Pour prendre un exemple idiot, qui ne s'est jamais énervé sur son script shell qui ne donnait pas de bons résultats, simplement parce qu'on a donné en entrée un nombre décimal comme "3.14", alors que dans la locale fr, awk considère que le séparateur est une virgule, et qu'il fallait entrer "3,14" ?
[^] # Re: ...
Posté par Yusei (Mastodon) . En réponse au journal Langages pour desktop. Évalué à 5.
f = Fonction.parse("3x2+4x+6")
f'' = Fonction.parse( (Fonction.parse(f.dérivée).dérivée )
Tout le monde sera d'accord pour dire que ce n'est pas très efficace: la méthode dérivée est obligée de convertir sa valeur de retour en chaîne de caractères, et après on est obligé de parser à nouveau pour avoir une fonction. Il serait bien plus simple de manipuler les objets sans passer par des chaines:
f = Fonction.parse("3x2+4x+6")
f'' = f.dérivée.dérivée
Dans cette analogie, le premier langage c'est les commandes Unix et la communication par flux. Comme tu ne peux pas échanger des objets, tu dois te taper les conversions de données à chaque fois.
Maintenant, pour en venir à ton objection:
Je te répondrais que ce n'est pas vrai dans l'analogie des langages de programmation, et que ce n'est pas vrai non plus dans le cas de programmes qui communiquent avec des objets. Pourquoi ? Parce que si on peut emboîter des objets dans un langage objet, on peut aussi emboiter des programmes qui manipulent des objets.
Typiquement, un programme Grep n'est applicable qu'à des objets contenant des chaînes de texte. Donc, le programme Grep serait défini comme recevant en entrée des objets implémentant la méthode read_char, et c'est tout ce qui est nécessaire, pas besoin de coder un grep dans l'objet lui même. Dans ce cas, l'objet reçu en entrée est en pratique un flux, comme dans le bon vieux Unix, parce que par définition Grep fonctionne sur des flux.
Maintenant si on prend un programme qui manipule autre chose que des flux, par exemple des dates, on a intéret à pouvoir lire en entrée directement un objet Date avec ses méthodes day, week, year, etc.
Pour prendre un exemple idiot, qui ne s'est jamais énervé sur son script shell qui ne donnait pas de bons résultats, simplement parce qu'on a donné en entrée un nombre décimal comme "3.14", alors que dans la locale fr, awk considère que le séparateur est une virgule, et qu'il fallait entrer "3,14" ?