• [^] # Re: Contraintes

    Posté par (site web personnel) . En réponse au journal Letlang, encore un nouveau langage de programmation. Évalué à 1.

    Je comprends l'intérêt de "let x = y2 - 3*y + 2", mais pas de "let x2 -5*x + 3 = 6*y".

    La deuxième forme n'est qu'une conséquence du fait que = est une opération. La plupart des langages appellent cette opération ==, du coup je comprend la confusion.

    Au niveau de l'AST, j'ai :

    pubstruct LetStatement{
    expression: Box<Expression>
    }
    pubenum Expression{
    Add{lhs: Box<Expression>,rhs: Box<Expression>},// +
    Sub{lhs: Box<Expression>,rhs: Box<Expression>},// -
    // ...
    Eq{lhs: Box<Expression>,rhs: Box<Expression>},// =
    // ...
    }

    Autoriser la première forme, c'est autoriser la seconde. Sachant que pour la seconde, si je connais la valeur de x et de y, il est logique de pouvoir faire ce test.

    Ce qu'il faut comprendre, c'est que let ajoute des contraintes (qui doivent être compatibles avec les contraintes existantes) :

    let (x, y): (int, int)
    let x**2 - 5 * x + 3 = 6 * y # tout seul ne sert pas a grand chose
    x := get_int_from_stdin()
    # si le user tape "0" alors :
    # l'equation devient 3 = 6 * y
    # il n'y a pas de solutions dans int
    # ==> runtime error!
    

    Ce qui pourrait aussi être utilisé comme il suit :

    data := csv_data
     |> filter(record =>
     record.x ** 2 - 5 * record.x + 3 = 6 * record.y
     )
    # data ne contient que les lignes qui valident l'équation
    

    https://link-society.com - https://kubirds.com - https://github.com/link-society/flowg