• [^] # Re: Lisibilité

    Posté par . En réponse au journal La recherche en langages de programmation au quotidien. Évalué à 9.

    La grande majorité des langages de programmation permettent d'écrire des choses que quelqu'un qui ne connaît pas le langage trouvera difficile à lire. (Ceux qui ne le permettent pas sont jugés trop verbeux.). Je ne pense pas que cet exemple montre que OCaml est plus "abscons" qu'un autre langage dans l'absolu, mais plutôt que tu n'es pas déjà habitué à sa syntaxe.

    En l'occurrence, il s'agit d'un filtrage de motif:

    • { row = []; _ } est un motif qui teste si la valeur observée est un bien un enregistrement ({ ... }) (record en OCaml, un type produit avec des champs nommés, comme une struct en C) avec un champ row contenant la liste vide (row = []) et potentiellement d'autres champs ; _. Il se trouve que ce record est défini dans le module Varsets, d'où le Varsets. pour qualifier.
    • (Negative [] | Positive Varsets.{ row = []; _ }) est un motif qui filtre une entrée de type (Varsets.row, Row.row) signed, c'est-à-dire soit une valeur de la forme Positive foofoo est une liste (c'est la définition de Row.row), ou une valeur de la forme Negative barbar est de type Varsets.row (l'enregistrement). Ce motif-ci accepte soit la liste vide dans le cas Negative, soit un Varsets.row dont le champ row est la liste vide dans le cas Positive — donc une ligne vide, qu'elle soit positive ou négative.
    • (Negative [] | Positive Varsets.{ row = []; _ }) :: _ est un motif de liste (p :: q filtre une liste chaînée dont le premier élément filtre p et la suite filtre q), qui filtre une liste dont le premier élément est une ligne vide (positive ou négative), et la suite n'importe pas.

    La ligne de code complète dit donc que si on prend en entrée une matrice dont la première ligne est vide (positive ou négative), alors on fait un assert false: cette fonction ne doit être appelée que sur des matrices dont la première ligne est non-vide. Les clauses suivantes du filtrages vont donc pouvoir gérer le cas où la première colonne est négative non-vide (Negative (n :: ns)) ou positive non-vide (Positive Varsets.{ row = p::ps; varsets; }).