URL: https://linuxfr.org/news/rapydscript-le-javascript-qui-se-deguise-en-python Title: RapydScript, le JavaScript qui se déguise en Python Authors: dzecniv Nils Ratusznik, palm123, Nÿco, bubar🦥, Ontologia et ZeroHeure Date: 2015年04月27日T16:06:42+02:00 License: CC By-SA Tags: javascript et python Score: 28 RapydScript est un langage qui se compile en JavaScript, avec une syntaxe et des fonctionnalités qui se veulent proches de Python. Pour ceux qui connaissent coffeeScript, RapydScript est pareil mais inspiré par la lisibilité de Python. Il ne s'agit pas d'une nouvelle tentative de faire tourner Python dans le navigateur, comme par exemple Pyjamas. RapydScript reste du JavaScript, il n'introduit aucune limitation ni surcoût. Il paraît juste plus propre et donne l'impression d'écrire du Python. Ses quelques fonctionnalités : * comme CoffeeScript, RapydScript répare les incohérences et inconsistances de JavaScript ; * un [système de classes](https://github.com/atsepkov/rapydscript#classes) similaire à Python ; * support des [listes en compréhensions](http://fr.wikipedia.org/wiki/Liste_en_compr%C3%A9hension) ; * des [exceptions](https://github.com/atsepkov/rapydscript#exception-handling) comme en Python ; * des [modules, plus flexibles](https://github.com/atsepkov/rapydscript#modules) que les modules Python ; * des arguments optionnels pour les fonctions, comme en Python ; * des décorateurs (sans arguments) ; * un système d'héritage plus puissant que celui de Python et plus clair que celui de JavaScript ; * le support d'objets (dictionnaires) avec fonctions anonymes, comme en JavaScript ; * la possibilité d’appeler n'importe quelle fonction, méthode, code JavaScript ou appel au DOM de n'importe quel framework, sans syntaxe spéciale ; * le choix entre les méthodes et fonctions à la Python ou leurs équivalents JavaScript ; * RapydScript s'auto-compile, c'est à dire que le compilateur est lui-même écrit en RapydScript et compile en JavaScript. ---- [Site officiel](https://www.rapydscript.com/) [Le manuel entier](https://www.rapydscript.com/full-manual/) [Une discussion Reddit](https://www.reddit.com/r/Python/comments/2xcjht/new_website_for_rapydscript_the_pythonic/) [Github](https://github.com/atsepkov/RapydScript) [Le groupe de discussion](http://groups.google.com/group/rapydscript) ---- Voici un court exemple qui utilise JQuery : ```python class Popup: def __init__(self, containterId): # pop-up class will give us absolute position, high z-index and center the container self.$popup = $('#' + containerId).addClass('pop-up').mouseout(def(): self.hide() # unlike 'this', 'self' will reference the object itself ) self._$darkbg = $('#dark-bg') # overlays background with a dim layer to draw focus to the pop-up def show(self): self._$darkbg.show() self.$popup.show() def hide(self): self._$darkbg.hide() self.$popup.hide() msg = Popup('my-popup') msg.show() ``` Notons toutefois quelques limitations : * le source mapping n'est pas implémenté, mais l'auteur compte le faire ; * pas shell (repl) non plus, mais l'auteur le souhaite également ; * RapydScript a [quelques bugs connus](https://github.com/atsepkov/rapydscript#quirks). # Installation Comme d'habitude avec les applications Node.js, on utilise npm : npm install rapydscript -g # Bibliothèque standard Il est assez facile de faire tourner un code Python existant dans le navigateur car RapydScript a ré-implenté quelques bibliothèques standard de Python. Par exemple si vous utilisez `range`, `print`, ou `list.append`, il vous suffit d'importer la `stdlib.js` de rapydscript. Soit par un import explicite dans votre HTML, soit par la ligne `import stlib` dans votre code `.pyj`. Il existe aussi le module `math`, `re`, `unittest`, `random` et `yql`. Mais si vous écrivez du nouveau code, il est conseillé de se baser sur les bibliothèques JavaScript existantes, plus fournies. # Exemples ## Appel à JavaScript Si jamais vous devez appeler directement du JavaScript à cause d'une limitation de RapydScript, vous pouvez le faire avec la fonction `JS` : JS('module').exports # meilleur équivalent à JS('module.exports') ## Définir des fonctions Une fonction tout à fait classique en RapydScript : ```python #regular def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibinacci(n-1) + fibinacci(n-2) a = fibinacci(8) ``` L'équivalent en JavaScript : ```javascript function fibonacci(n) { if (n === 0) { return 0; } else if (n === 1) { return 1; } else { return fibinacci(n - 1) + fibinacci(n - 2); } } a = fibonacci(8); ``` Utiliser des fonctions anonymes : ```python # anonymous math = { add: def(a, b): return a+b;, sub: def(a, b): return a-b;, mul: def(a, b): return a*b;, div: def(a, b): return a/b;, roots: def(a, b, c): r = Math.sqrt(b*b - 4*a*c) d = 2*a return (-b + r)/d, (-b - r)/d } ``` Des arguments optionnels comme en Python : ```python # with optional arguments def get(item, quantity=1): return [item for i in range(quantity)] a = get('hammer') b = get('nail', 3) ``` Ce qui produit le JavaScript suivant : ```javascript function get(item, quantity) { if (typeof quantity === "undefined") quantity = 1; return (function() { var _$rapyd$_Iter = range(quantity), _$rapyd$_Result = [], i; for (var _$rapyd$_Index = 0; _$rapyd$_Index < _$rapyd$_Iter.length; _$rapyd$_Index++) { i = _$rapyd$_Iter[_$rapyd$_Index]; _$rapyd$_Result.push(item); } return _$rapyd$_Result; })(); } a = get("hammer"); b = get("nail", 3); // les deux fonctions utilitaires créées: function range(start, stop, step) { if (arguments.length <= 1) { stop = start || 0; start = 0; } step = arguments[2] || 1; var length = Math.max (Math.ceil ((stop - start) / step) , 0); var idx = 0; var range = new Array(length); while (idx < length) { range[idx++] = start; start += step; } return range; } function _$rapyd$_print() { var args, output; args = [].slice.call(arguments, 0); output = JSON.stringify(args); if ("console" in window) console.log(output.substr(1, output.length-2)); } ``` L'usage de décorateurs (sans arguments) : ```python # and finally, decorated def makebold(fn): return def(): return "" + fn() + "" def makeitalic(fn): return def(): return "" + fn() + "" @makebold @makeitalic def hello(): return "hello world" ``` ## Example: écrire une chaîne de callbacks On fait souvent appel à une suite de callbacks en JavaScript. C'est tout à fait facile en RapydScript : ```python params = { width: 50, height: 30, onclick: def(event): alert("you clicked me"), onmouseover: def(event): $(this).css('background', 'red') , onmouseout: def(event): # reset the background $(this).css('background', '') } ``` Pour plus de détails, voyez "[chaining blocks](https://github.com/atsepkov/rapydscript#chaining-blocks)" dans la documentation. # Autres outils RapydScript est assez jeune et n'a pas autant d'outils que, par exemple, CoffeeScript, mais on commence à voir des extensions pour Django ou d'autres outils Node, comme Gulp ou Grunt, ce qui permet de l'intégrer facilement à son projet AngularJS ou autre. ## un dé-compileur JavaScript->RapydScript : https://github.com/charleslaw/RapydScript-Decompiler ## RapydFiddle pour partager du code en ligne http://rapydscript.pyjeon.com/ (cliquer sur "démo") ## gulp https://github.com/vindarel/gulp-rapyd (utilisable mais pas fini) ## grunt https://github.com/loolmeh/grunt-rapydscript ## extension pour Django https://github.com/pztrick/DjScript ## adaptation à Django-pipeline https://github.com/traverseda/django-pipeline-rapydscript ## mode emacs https://gitlab.com/emacs-stuff/rapyd-mode ## vim https://github.com/atsepkov/vim-rapydscript (la configuration de l'auteur) ## atom https://atom.io/packages/language-rapydscript # Conclusion Nous n'avons pas expliqué tout le fonctionnement de RapydScript, pour cela il y a la bonne documentation. Nous espérons vous avoir fait miroiter de nouveau ce vieux rêve: écrire une application web dans un seul langage, en Python.

AltStyle によって変換されたページ (->オリジナル) /