Journal Portage de TapTempo en Wren

Posté par . Licence CC by-sa
Tags :
14
2
mar.
2018

Wren est un langage de script assez simple, basé sur des classes et destiné à être embarqué dans des applications (notamment des jeux vidéos). J'avais envie d'essayer ce langage depuis un moment, je me suis dit qu'il fallait participer à la hype du moment.

Donc, suite au portage de TapTempo en divers langage: Rust, Ada, JavaScript, Perl, Python 2.7, Bash, Perl6 Haskell et PWA, voici la version en Wren.

import "io" for Stdin, Stdout

class TapTempo {
  construct new() {
    _sampleSize = 5
    _resetTime = 5.0
    _precision = 0
    _hitTimePoints = []
  }

  computeBpm(currentTime, lastTime, occurenceCount) {
    if (occurenceCount == 0) {
      occurenceCount = 1
    }

    var elapsedTime = currentTime - lastTime

    System.print("elapsedTime: %(elapsedTime)")

    var meanTime = elapsedTime / occurenceCount
    var bpm = 60.0 / meanTime

    return bpm
  }

  isResetTimeElapsed(currentTime, lastTime) {
    var elapsedTime = currentTime - lastTime
    return elapsedTime > _resetTime
  }

  run() {
    System.print("Hit enter key for each beat (q to quit).")

    var shouldContinue = true

    while (shouldContinue) {
      var i = "q"

      while (i.count != 0) {
        i = Stdin.readLine()

        if (i == "q") {
          shouldContinue = false
          System.print("Bye Bye!")
          break
        }
      }

      if (shouldContinue) {
        var currentTime = System.clock

        System.print("currentTime %(currentTime) %(System.clock)")

        if (_hitTimePoints.count > 0 && isResetTimeElapsed(currentTime, _hitTimePoints[_hitTimePoints.count - 1])) {
          _hitTimePoints.clear()
        }

        _hitTimePoints.add(currentTime)

        if (_hitTimePoints.count > 1) {
          System.write("\r")

          var bpm = computeBpm(_hitTimePoints[_hitTimePoints.count - 1], _hitTimePoints[0], _hitTimePoints.count - 1)
          System.write("Tempo: %(bpm.round) bpm\t")
        } else {
          System.write("\r")
          System.write("[Hit enter key one more time to start bpm computation...]")
        }

        Stdout.flush()

        while (_hitTimePoints.count > _sampleSize) {
          _hitTimePoints.removeAt(0)
        }

      }
    }

  }
}

var tapTempo = TapTempo.new()
tapTempo.run()

À noter que cette version peut donner des résultats bizarres. En effet, System.clock est basé sur clock(3) qui fournit le temps CPU, et pas le temps global. Donc quand on a un gros processus qui tourne et qui bouffe le CPU, on peut avoir des temps fourni par cet appel qui ne correspondent pas vraiment à ce qu'on recherche. Mais dans l'idée, le code est juste et essaie de se rapprocher le plus possible de l'original, la gestion des options en moins.

  • # Deviner l’intérêt du langage

    Posté par . Évalué à 6.

    Ou essayer. Parce qu’à la lecture de ce simple helloworld, pas simple de deviner une quelconque spécificité par rapport aux autres.

    C’est assez lisible, comparable à du lua dans la même niche. Au delà de ça, difficile de dire quoi que ce soit :) Il y a un intérêt au delà du fait que ça semble être populaire ?

    • [^] # Re: Deviner l’intérêt du langage

      Posté par . Évalué à 10.

      Je ne suis même pas sûr que ça soit si populaire que ça. En effet, ça se place sur la même niche que Lua, mais c'est plus orienté objet que Lua. C'est une alternative intéressante, à mon avis, pour ceux qui cherchent un langage à embarquer facilement et avec une syntaxe simple. Et le code est suffisamment clair pour pouvoir être adapté s'il le faut. Maintenant, en dehors de ça, je dirais que c'est une question de goût et de couleur.

      L'auteur est très prolifique, c'est déjà son deuxième langage (son premier était à base de prototype), et il en a un troisième pour faire des expérimentations. Il a aussi écrit le livre Game programming patterns qui est plutôt bien fait. Et il est en train d'écrire un autre bouquin Crafting interpreters qui donne envie.

      Donc, voilà, ça permet de faire un peu de pub pour ce langage et cet auteur.

  • # le comique

    Posté par (page perso) . Évalué à -10.

    de répetition, ça lasse.

    • [^] # Re: le comique

      Posté par . Évalué à -10. Dernière modification le 02/03/18 à 12:59.

      Bim -4 ! Tu les a bien mérité tiens ! Tu n'as pas ta brosse a carresser dans le sens du poil ?

      Titre de l'image

      attention chérie ça va moinsser

  • # Portage du vendredi

    Posté par . Évalué à 7.

    A quand un portage en brainfuck ou Ook ? Un vendredi ça serait parfait :P

    Si tu ne sais pas demande, si tu sais partage !

  • # Lourd

    Posté par . Évalué à -10.

    Vous pouvez nous faire ça dans un seul billet svp ? Parce que si vous comptez nous faire 4000 articles pour les 4000 languages existants ça va être lourd. Merci

    • [^] # Re: Lourd

      Posté par . Évalué à 10.

      1. C'est un journal, tu n'es pas obligé de lire
      2. Ça permet de (re)découvrir des langages de programmation
      3. Ce n'est pas si souvent qu'il y a des journaux techniques sur LinuxFr
      • [^] # Re: Lourd

        Posté par (page perso) . Évalué à 7.

        Ce n'est pas si souvent qu'il y a des journaux techniques sur LinuxFr

        Et finalement, ceux-ci sont moins bien notés que les journaux moins techniques (cf. on m'a coupé la fibre, journal intéressant au demeurant) alros que finalement, on parle de logiciel libre.

    • [^] # Moi j'aime bien

      Posté par . Évalué à 10.

      Continuez svp !

    • [^] # Re: Lourd

      Posté par (page perso) . Évalué à 7.

      Bien sur ; et toi en échange, tu écris tous tes commentaires dans un seul, que tu postes tous les 10 ans. Merci

  • # Types

    Posté par (page perso) . Évalué à 2.

    Merci pour ce portage, j'aime bien l'idée de découvrir des langages de niche !

    Question pour la définition des types des variables, je ne vois pas de déclaration en dehors du constructeur :

    class TapTempo {
      construct new() {
        _sampleSize = 5
        _resetTime = 5.0
        _precision = 0
        _hitTimePoints = []
      }
    

    Est-ce que le type est déduit automatiquement, comme dans les langages de script ?

    • [^] # Re: Types

      Posté par . Évalué à 3.

      Dans les langages à typage dynamique tu veux dire ? Le type n’est pas déduit (dans le sens de l’inférence de types en tout cas), il est donné par le type de la valeur affectée lors de l’utilisation de la variable par l’interpréteur.

      Après la construction d’un objet « TapTempo », _sampleSize à la valeur qui correspond au littéral « 5 », qui est probablement un entier. Mais si c’est dynamique on peut affecter une valeur de n’importe quelle autre type plus loin dans le programme, et la seule manière de savoir ce qu’il y a dedans qui marchera à tout les coups c’est de tester ça à l’exécution.

      • [^] # Re: Types

        Posté par . Évalué à 4.

        En fait, tous les nombres sont des réels en Wren. J'ai fait une différence mais au final toutes ces variables ont le type Num.

      • [^] # Re: Types

        Posté par (page perso) . Évalué à 1.

        Merci pour cette précision.

        la seule manière de savoir ce qu’il y a dedans qui marchera à tout les coups c’est de tester ça à l’exécution.

        Ouille :-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.