• [^] # Re: Autres outils

    Posté par . En réponse au journal chaintools, outils unix avec syntaxe pythonique. Évalué à 4.

    coté hack me fait préférer une notation explicite.

    Le côté « hack » c'est juste utiliser un symbole, comme un autre commentaire l'a montré, on peut utiliser un nom de fonction ... par exemple chain,
    ce qui donne (mais qui est « moins joli »)

    cat ().chain (sed ()). chain ( etc ...) . chain ( ... )

    Après, il y a d'autres avantages à encapsuler dans un objet le calcul: tu peux contrôler les actions ! Ainsi, tu peux permettre des trucs utiles dans le genre:

    • lancer en mode debug
    • définir des « variables environnement » pour le programme
    • construire d'autres manière de combiner les actions :
      • pour chaque ligne de résultat lancer une nouvelle chaine de commande et fusionner le tout (en parallèle ou non). Cette fonction serait en gros un « concatMap » sur des générateurs
      • exécuter une partie de code si et seulement si la première a échoué
      • etc ...

    Quand on y regarde de plus près, on se rend compte qu'une action (cat, sed etc ...) c'est simplement une fonction de type action A : () -> [A].
    On peut donc construire tout un tas de combinateurs :

    • chain : action A -> ([A] -> action B) -> action B qui correspond à ta version
    • chainEach : action A -> (A -> action B) -> action B qui lance un appel sur chaque ligne et concatène le résultat
    • alter : action A -> action A -> action A qui essaie la première, et si elle échoue, lance la deuxième (alternative)
    • fmap : (A -> B) -> action A -> action B, applique une fonction « normale » au résultat d'une action
    • apply : action (A -> B) -> action A -> action B (l'utilisation de celle-ci est plus anecdotique, mais on peut en trouver).

    Ensuite, on peut écrire du code comme celui-ci:

    # 1) sélectionne un fichier qui contient une liste de fichiers
    alter (cat ("fichier1"), cat ("fichier2"), erreur ("pas de fichiers"))
    . chainEach (readFile) # lis les fichiers un par un et concatène 
    . chain ( sed (" ... ") ) # applique un filtre (sur la totalité)
    . fmap ( int ) # transforme chaque ligne du résultat en entier 
    . run () # lance le véritable calcul