• [^] # Re: Ca traduit bien un état d'esprit de la part des développeurs de systemd

    Posté par . En réponse au journal Systemd vs Linux, quand l'intransigeance d'un développeur tourne au ridicule.... Évalué à 2.

    Et moi je te dis que c'est idiomatique. Et citer Perl n'est pas forcément une bonne façon de donner du crédit à ton opinion : les gens que j'ai vus critiquer ce langage font partie (la plupart du temps) de ceux qui voudraient que Perl s'écrive comme du C, sans tenir compte — tadaaaa ! — des idiomes propres au langage. Si j'écris

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Carp qw/croak/;
    croak "USAGE: 0ドル <filename>" unless (@ARGV);
    open (my $fh, '<', $filename) or die "Couldn't open $filename: $!";
    my $file_content;
    {
     local $/;
     $file_content = <$fh>;
    }
    do_something_with($file_content);

    ... Oui, j'estime que &#36;/ et &#36;! font partie des variables de Perl à connaître. De même qu'en C, si j'écris :

    #define fatal(...) do { \
     fprintf(stderr,__VA_ARGS__); \
     if (errno != 0) perror(errno); \
     exit(errno); \
    } while(0)
    static inline void do_something_with(char* string, off_t sz) {
     string[sz-1] = '0円';
     puts(string);
    }
    int 
    main(int argc, char ** argv)
    {
     if (argc != 2) 
     fatal("USAGE: %s <filename>",argv[0]);
     char *filename = argv[1];
     int fd = open(filename,O_RDONLY);
     if (fd == -1) 
     fatal("Couldn't open %s",filename);
     struct stat file_info;
     fstat(fd,&file_info);
     off_t sz = file_info.st_size;
     char *file_content = malloc(sz);
     if (file_content == NULL)
     fatal("Couldn't allocate string of size %lu",sz);
     int nbytes = 0;
     do {
     nbytes = read(fd, file_content, sz);
     } while (nbytes == -1 && errno == EINTR);
     if (nbytes == -1)
     fatal("Couldn't read %lu bytes from %s\n", sz, filename);
     do_something_with(file_content,sz);
     free(file_content);
     return 0;
    }

    J'estime que le lecteur doit savoir ce que malloc signifie, qu'il sait faire un man fstat s'il n'a jamais rencontré la fonction en question (de même que pour un programme Perl on appellerait perldoc -f *fonction* ou perldoc -q *expression*), etc. Si je voyais ce code pour la première fois, je me demanderais sans doute pourquoi le programmeur s'est fait chier à écrire le read dans un block do-while aussi bizarre1. Bref, il s'agit de connaître le langage qu'on utilise (pour lire ou écrire).

    Donc, histoire d'enfoncer le clou sur cette histoire de décider que Perl est illisible/write-only/bla par définition, je maintiens que quelqu'un qui n'a (par exemple) jamais programmé en C ou en Perl, mais a de l'expérience en Common LISP par exemple, aura sans doute autant de mal à piger un programme que l'autre.

    [1] Note que je ne dis pas que cette manière d'écrire soit top-moumoute. C'est juste un exemple à la con qu'on peut trouver (même si généralement des fonctions d'adaptations du genre xmalloc ou xread sont créées pour masquer ce genre de mécanique).