PIF - Progression

Salutations,

Aujourd’hui fut une journée de grand avancement pour PIF. En effet, nous pouvons maintenant compiler et exécuter la fonction suivante, qui donne un résultat plutôt juste :

func integrate : (f : &(x : float) -> float, x0 : float, x1 : float, n : int) -> float {
    ## Calcul approché d'une intégrale par la méthode des trapèzes

    if x1 == x0 return 0

    let dx = (x1 - x0) / (n : float)

    var sum : float = 0
    var i = 0
    while i < n {
        let x = x0 + (i : float * dx)
        sum = sum + (f(x) + f(x + dx)) / 2 * dx
        i = i + 1
    }
    return sum
}

Ou sinon j’ai ça en stock – qui tourne et qui affiche des nombres premiers, bien sûr :

func find_primes : (max : int) -> {
    var i = 1
    while i < max {
        i = i + 1
        if !is_prime(i) continue
        print_int(i)
    }
    print_nl()
}

func is_prime : (num : int) -> bool {
    var d = 2
    while d*d <= num {
        if num % d == 0 return false
        d = d + 1
    }
    return true
}

(Remarque : print_int et print_nl sont des fonctions externes aux programmes, mais intégrées au compilateur)

À ceux que ça choque le if sans then et sans crochets non plus : en fait, j’ai choisi d’être le plus laxiste possible sur la syntaxe, c’est à dire que tant que le compilateur est capable de comprendre ce que vous voulez dire, alors c’est ok. Dans des cas plus délicats il peut être nécessaire de rajouter de la ponctuation, mais de manière générale vous mettez ce que vous voulez, comme vous voulez pour que ça soit à votre goût. Moi je voulais mettre des if sans then, et en l’occurrence ça ne pose pas de problème donc je me le suis permis.

En bref, les poins importants qui rendent tout ça possible :

  • Opérateurs divers
  • Vérification des types
  • Variables, affectation
  • Structures de contrôle basiques (pas de for pour l’instant, j’aimerai faire un joli for qui soit intégré avec la POO, mais ça va être un peu compliqué je le sens)
  • Pointeurs de fonctions

Ce qui sera fait bientôt :

  • Appel de fonctions et référencement de variables situées dans d’autres paquets
  • (?) Syntaxe pour les déclarations de plusieurs variables à la fois, valeurs par défaut pour les variables non initialisées, arguments par défaut pour les fonctions, syntaxe pour définir plusieurs arguments d’un seul coup, appel de fonctions en nommant les arguments, …
  • … qui sait ? des classes et des objets ? ça serait cool

Le code du compilateur est bien au chaud chez moi pour l’instant. Si quelqu’un en veut, je peux le mettre sur un GitHub. Il suffit de demander.