Pourquoi Jaop? Pourquoi raquette?

Il s'agit de la suite de l'article «Pourquoi une raquette? Pourquoi Lisp? " J'ai écrit environ un an après avoir découvert Racket . En tant que débutant, je ne pouvais pas comprendre les éloges qui ont coulé sur Lisp de tous les côtés. Je ne savais que penser. Comment comprendre que Lisp finira par provoquer une «illumination profonde» . D'accord, mon frère, dites-vous.

J'avais une question simple: à quoi ça sert? Dans un article précédent, j'ai essayé d'y répondre et j'ai résumé les raisons pour lesquelles quelqu'un voudrait apprendre le Lisp ou, en particulier, le Racket.

J'ai compilé une liste des neuf fonctionnalités linguistiques les plus précieuses pour moi en tant que novice de Racket. Par exemple, la caractéristique numéro 5 est «la création de nouveaux langages de programmation». Cette méthode est également appelée programmation orientée langage ou JOP .

Depuis lors, IOP est devenu ma partie préférée de Racket, et j'ai partagé mon admiration dans le livre en ligne Beautiful Racket , qui explique la technique ROP et l'outil Racket.

Un exemple dans mon travail est Pollen . J'ai écrit ce langage de programmation pour une typographie pratique de mes livres en ligne. Dans Pollen, le paragraphe précédent est programmé comme suit:

#lang pollen     ◊link["https://beautifulracket.com/appendix/why-racket-why-lisp.html#so-really-whats-in-it-for-me-now"]{  },        Racket. ,  № 5 — «   ».     ◊em{- },  ◊em{}. 

Un autre exemple est brag , un générateur d'analyseur (dans le style de lex/yacc ), qui prend la grammaire BNF comme code source. Un exemple simple pour le langage bf :

 #lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]" 

Les deux langues sont implémentées dans Racket et peuvent être exécutées avec l'interpréteur Racket habituel ou à l'intérieur de Racket IDE (appelé DrRacket).

Problèmes principaux


Et pourtant ... Malgré le fait que le livre ait forcé des milliers de personnes à commencer à explorer Racket, il me semble parfois que je marche sur le même terrain rapide que les fans de Lisp que j'ai un jour critiqué.

Si NOP est si cool, alors pourquoi passer quelques jours à lire un livre. Non? Je peux tout expliquer brièvement, sans plus tarder. Il faut répondre à deux questions simples:

  1. Quels problèmes conviennent le mieux à la programmation linguistique?
  2. Pourquoi Racket est-il le meilleur pour créer des langues?

La deuxième question est simple. Le premier ne l'est pas. On m'a demandé à plusieurs reprises. J'ai souvent cité la célèbre phrase du juge Potter Stewart: vous la comprendrez quand vous la verrez. La réponse est assez bonne pour ceux qui sont vraiment intéressés. Mais pas pour ceux qui sont du côté et qui aimeraient entendre des arguments de fond.

Je vais donc essayer. Gardez à l'esprit que je ne suis pas professeur d'informatique et que je ne peux pas parler de la théorie des langages de programmation. J'utilise plutôt le racket et les langages spécifiques au domaine (DSL) à des fins pratiques: mon travail quotidien en dépend. Par conséquent, je me concentrerai sur les aspects pratiques.

Réponse courte


  1. JOP est en fait une méthode de conception d'interface. Il est idéal pour les tâches qui nécessitent une notation minimale tout en conservant une précision maximale . La notation minimale signifie la seule notation autorisée. Rien de plus. La précision maximale, c'est-à-dire la signification de cette notation, est exactement ce que vous dites. Aucune ambiguïté ou schéma. IOP arrive au point comme rien d'autre.

    (L'impatient peut passer à des catégories spécifiques de tâches qui bénéficieront du NOP).
  2. La raquette est idéale pour OOP en raison de son système de macro . Ils fonctionnent dans le style du compilateur, simplifiant la conversion de code. Le système de macro Racket est meilleur que tout autre.

À ce stade, la moitié des lecteurs de l'article voudront publier des commentaires anonymes critiquant mes thèses. Mais n'oubliez pas: en tout cas, j'ai gagné. JOP et Racket ont incroyablement augmenté ma productivité de programmation. Je suis heureux de partager ces connaissances afin que vous puissiez vous aussi profiter de ces avantages. Mais je serai également heureux si ces outils restent mon arme secrète. Dans ce cas, je resterai dans 0,01% des programmeurs les plus productifs, obtenant un résultat plus impressionnant et rentable que les 99,9% restants

Donc, le choix vous appartient.

Réponse longue


Si vous pensez aux questions les plus importantes, elles se résument à une méta-question: pourquoi est-il difficile d'expliquer les avantages des armes nucléaires?

Peut-être que lorsque nous parlons de langues , le terme est chargé d'attentes sur ce qu'est une langue et ce qu'elle fait. Bien que nous soyons à l'intérieur de ce paradigme, il est difficile de comprendre la valeur des langages de programmation.

Mais si vous réduisez l'échelle et considérez les langues comme faisant partie d'une catégorie plus large d'interfaces homme-ordinateur, il est plus facile de voir les avantages spécifiques de la POO. Alors faisons-le.

Langues à usage général et langues thématiques


Tout d'abord, un peu de terminologie. La programmation orientée langage (également connue sous le nom de POO) est l'idée de résoudre des problèmes de programmation en créant un nouveau langage, puis en écrivant un programme dessus. Ces "petites langues" sont souvent appelées langues spécifiques au domaine (DSL).

Comme son nom l'indique, une langue orientée sujet est adaptée aux tâches d'un certain domaine. Par exemple, PostScript, SQL, make , les expressions régulières, .htaccess et HTML sont considérés comme des langages orientés sujet. Ils n'essaient pas de tout faire. Ils visent plutôt à bien faire une chose.

À l'autre extrémité du spectre se trouvent les langages à usage général . Nous voyons ici C, Pascal, Perl, Java, Python, Ruby, Racket, etc. Pourquoi ne sont-ils pas considérés comme orientés sujet? Parce qu'ils se positionnent pour un large éventail de tâches informatiques.

Dans la pratique, les langues d'usage général se spécialisent souvent dans un domaine particulier. Par exemple, C est meilleur que d'autres pour la programmation système. Perl - pour les scripts dans l'administration système. Python s'impose comme un langage pour les débutants. Raquette pour une programmation orientée langage. Dans chaque cas, c'est à cela que la langue a été conçue à l'origine.

Il y a une fine ligne entre le DSL et les langages à usage général. Par exemple, Ruby a été créé en tant que langage à usage général, mais est devenu populaire principalement pour les applications Web grâce à son association avec Ruby on Rails. JavaScript, d'autre part, était à l'origine un langage orienté sujet pour les scripts de navigateur Web. Mais il a muté comme un virus et depuis, il a grandi bien au-delà de la tâche d'origine.

Qu'est-ce qu'une langue?


Si tout ce large spectre est appelé langues, alors quelles sont les caractéristiques qui définissent la langue?

Je sais ce que vous pensez: «C'est là que vous vous trompez. HTML n'est pas une langue. C'est juste du balisage. Il ne peut pas décrire l'algorithme. " Ou: «Les expressions régulières ne sont pas une langue. Ils ne travaillent pas seuls. C'est juste une syntaxe pour une autre langue. "

Je le pensais aussi. Mais plus je regardais de plus près, plus ces différences semblaient floues. Ainsi, ma première déclaration principale (sur trois): le langage de programmation est intrinsèquement un moyen d'échange - un système de notation qui est compréhensible pour les personnes et les ordinateurs .

Le système de notation (notation) signifie que le langage a une syntaxe. «Clair» signifie qu'avec sa syntaxe le langage véhicule un sens (ou une sémantique , si vous utilisez un mot plus sophistiqué). Cette définition couvre tous les langages de programmation à usage général. Et tout DSL. (Mais pas tous les flux de données, qui seront discutés plus en détail plus tard).

(Soit dit en passant, bien que «programmation» et «langage» soient des mots idiomatiquement utilisés ensemble, ces langages ne sont pas seulement utilisés par des personnes pour programmer des ordinateurs. Parfois, ils sont utilisés par des ordinateurs pour communiquer avec nous (par exemple, des expressions S), parfois pour communiquer entre eux. (par exemple, XML, JSON, HTML.) Certainement, il semble incorrect d'exclure ces fonctionnalités. Mais dans la pratique, oui - ce que nous faisons habituellement avec un langage de programmation est, en fait, de la programmation).

Considérez le code HTML: un moyen de dire à un ordinateur - en particulier un navigateur Web - comment dessiner une page Web. Il s'agit d'un système de notation (crochets, balises, attributs, etc.) compréhensible pour les humains et les ordinateurs (l'attribut charset indique l'encodage des caractères, la balise p contient un paragraphe, etc.).

Voici une petite page HTML:

 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My web page</title> </head> <body> <p>Hello <strong>world</strong></p> </body> <html> 

Supposons que vous ne conveniez pas que HTML est un langage de programmation. Bon. Nous afficherons notre page en Python. C'est un vrai langage de programmation, non?

 print "<!DOCTYPE html>" print "<html>" print "<head>" print "<meta charset=\"UTF-8\">" print "<title>My web page</title>" print "</head>" print "<body>" print "<p>Hello <strong>world</strong></p>" print "</body>" print "<html>" 

Si Python est un langage de programmation, mais pas HTML, alors cet exemple Python est un programme, mais l'exemple HTML ne l'est pas.

Évidemment, c'est une différence torturée. Ici, la pythonisation n'ajoute rien d'autre que de la complexité et des stéréotypes. Ce qui est piquant, c'est que le seul contenu sémantique intéressant dans un programme Python - du point de vue de la gestion d'un navigateur Web - est qu'il est incorporé en HTML (peut-être que les balises HTML telles que DOCTYPE , meta et strong peuvent être considérées comme des fonctions qui prennent des arguments). La logique nous amène à conclure que le HTML, bien que plus simple et moins flexible, est toujours un langage de programmation.

Langues intégrées


Un exemple avec HTML et Python que nous avons trouvé. Mais l'intégration de DSL dans une autre langue est omniprésente. Les langages utilisés de cette manière sont appelés embarqués . Ils représentent la forme de programmation linguistique la plus courante. En tant que programmeur, vous comptez sur JOP depuis de nombreuses années, même si vous ne connaissiez pas son nom.

Par exemple, les expressions régulières (autres exemples: printf pour formater les chaînes, CLDR pour les modèles de date / heure, SQL). Nous ne pouvons pas considérer l'expression régulière comme une langue indépendante. Mais chaque programmeur sait ce que c'est:

 ^fo+(bar)*$ 

De plus, vous pouvez probablement saisir cette expression régulière dans votre langage de programmation préféré et cela fonctionnera simplement. Ce comportement cohérent n'est possible que parce que la notation des expressions régulières est un langage externe ( POSIX ).

Comme avec HTML, nous pourrions écrire une expression équivalente dans la notation du langage hôte. Par exemple, Racket prend en charge les expressions régulières Scheme (SRE): ce sont des expressions régulières avec une notation d' expression S. Le modèle ci-dessus sera écrit comme ceci:

 (seq bos "f" (+ "o") (* (submatch "bar")) eos) 

Mais les programmeurs de raquettes utilisent rarement les expressions SRE. Ils sont trop longs et difficiles à retenir.

Un autre exemple omniprésent de DSL intégré: les expressions mathématiques. Chaque programmeur sait ce que cela signifie:

 (1 + 2) * (3 / 4) - 5 

Les expressions mathématiques seules ne créent pas de programmes intéressants. Nous devons les combiner avec d'autres constructions de langage. Mais, comme pour les expressions régulières, il s'agit d'un dossier ergonomique et pratique. Les expressions mathématiques ont leur propre notation et leurs propres significations qui sont compréhensibles à la fois pour les personnes et les ordinateurs, elles peuvent donc être considérées comme un langage intégré distinct.

Plaisantez-vous que HTML est en train de programmer?


Non, ça l'est. J'affirme que le HTML (à la fois les expressions régulières et les expressions mathématiques) peut être considéré comme un langage de programmation rudimentaire. Cela signifie que l'écriture de HTML (ou d'expressions régulières ou d'expressions mathématiques) est considérée comme une programmation rudimentaire.

Ne paniquez pas. Bien sûr, un "programmeur" sur LinkedIn ne connaissant que le HTML et l'arithmétique, cela n'a aucun sens (bien que dans une semaine, il obtiendra probablement un emploi pour 180 000 $). Mais c'est une question distincte, que signifie «programmeur» sur le marché du travail. Nous n'en parlons pas.

Piège de la totalité de Turing


Si cette définition des langages de programmation vous agace encore, vous pensez peut-être qu'un vrai langage de programmation devrait exprimer tous les algorithmes possibles - c'est-à-dire qu'il devrait être Turing complet .

Je comprends qu'une telle pensée se suggère intuitivement. Chaque langage de programmation à usage général est Turing complet.

Mais le problème est qu'il s'agit d'une barre basse. L'exhaustivité de Turing est une métrique technique qui ne correspond pas à l'utilisation du langage dans le monde réel. Par exemple, les expressions régulières ne sont pas complètes de Turing, mais elles sont utiles pour exprimer de nombreux calculs avec des notations minimales. HTML n'est pas non plus Turing complet, mais c'est un moyen utile de contrôler le navigateur. Au contraire, le langage bf est Turing complet, mais même les tâches les plus triviales nécessitent des kilomètres de code infranchissable.

Restrictions linguistiques


Est-ce que quelque chose relève de ma définition de la langue? Non.

  • Les formats de données binaires ne sont pas considérés comme des langues. Par exemple, un fichier jpeg . Bien qu'un ordinateur puisse les comprendre, une personne ne le comprend pas. Ou PDF: si vous le piratez, il y a des parties lisibles par l'homme. Mais cela est dû au fonctionnement du PDF. Il est inutile d'écrire des idées à l'aide de constructions PDF.
  • Les fichiers texte ne sont pas des langues. Supposons que nous ayons un dossier avec l'Iliade d'Homère. Nous, humains, pouvons le lire et le comprendre. Bien que l'ordinateur puisse traiter le fichier de manière triviale en imprimant, par exemple, son contenu, le texte qu'il contient est incompréhensible pour l'ordinateur.
  • Les interfaces utilisateur graphiques ne sont pas des langues. Oui, ce sont des systèmes de notation (qui dépendent du texte et de l'image). Mais ils ne sont compréhensibles que par les gens. Les ordinateurs dessinent une interface graphique mais ne les comprennent pas.

Les langues comme interfaces


Ci-dessus, j'ai décrit le langage de programmation comme un "moyen d'échange" entre les gens et les ordinateurs. Ainsi, les langues entrent dans une catégorie plus large, que nous appelons interfaces .

Cela conduit à la deuxième affirmation de base (sur trois): que la programmation de langage est fondamentalement une méthode de conception d'une interface . Si vous aimez penser aux interfaces, vous aimerez JOP. Sinon, vous aimerez toujours JOP pour avoir rendu possibles des interfaces qui seraient autrement inaccessibles.

Un de mes exemples préférés de langage en tant qu'interface est brag , un langage générateur d'analyseur créé avec Racket. Si vous avez déjà utilisé la chaîne d'outils lex / yacc, vous savez que souvent l'objectif est de générer un analyseur à partir d'une grammaire BNF . Par exemple, pour bf, cela ressemble à ceci:

 bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]" 

Pour créer un analyseur dans un langage à usage général, vous devez traduire cette grammaire en un tas de code natif. C'est un travail fastidieux. Et inutile - n'avons-nous pas déjà écrit la grammaire? Pourquoi recommencer?

Cependant, brag répond à notre désir. Pour faire l'analyseur, nous ajoutons simplement la ligne #Lang brag au fichier, qui convertit comme par magie la grammaire BNF en code source de brag :

 #Lang brag bf- : (Bf-op | Bf-loop)* bf-op : ">" | "<" | "+" | "-" | "."| "," Bf-loop : "["(Bf-op | Bf-loop)* "]" 

C'est fait! Lors de la compilation, ce fichier exporte la fonction d' parse , qui implémente cette grammaire BNF.

C'est l'un de mes exemples préférés car il est indéniablement supérieur aux autres options. De plus, avec un langage généraliste, une telle interface est pratiquement impossible.

Mais un programmeur JOP crée constamment de telles interfaces.

Où la langue est la meilleure interface


Cela m'amène à ma troisième et dernière thèse de base selon laquelle les langues ont des avantages uniques par rapport aux interfaces . Bien entendu, les catégories ci-dessous ne sont ni exhaustives ni exclusives. Mais j'ai trouvé que l'IOP a beaucoup à offrir dans de telles situations:

1. Lorsque vous souhaitez créer une interface pour des programmeurs moins qualifiés, des non-programmeurs ou des programmeurs paresseux (ne sous-estimez pas la taille de cette dernière catégorie).

Par exemple, Racket possède une bibliothèque d'applications Web sophistiquée. Mais un simple serveur Web peut également être démarré rapidement en utilisant le langage web-server/insta :

 #lang web-server/insta (define (start request) (response/xexpr '(html (body "Hello LOP World")))) 

Matthew Flatt dans son article "Créer des langues dans une raquette" montre le langage qui génère des aventures de texte jouables. Comme brag , cela ressemble plus à une spécification qu'à un programme, mais cela fonctionne:

 #lang txtadv ===VERBS=== north, n "go north" south, s "go south" get _, grab _, take _ "get" ===THINGS=== ---cactus--- get "Ouch!" ===PLACES=== ---desert--- "You're in a desert. There is nothing for miles around." [cactus, key] north meadow south desert 

2. Lorsque vous souhaitez simplifier la notation. Un exemple est les expressions régulières. Un autre exemple est ma langue orientée sujet Pollen pour écrire des livres en ligne. Pollen est similaire à Racket, seulement ici vous commencez à travailler en mode texte et utilisez des caractères spéciaux pour indiquer les commandes Racket qui sont intégrées dans le contenu (Pollen est basé sur le langage de documentation de Racket appelé Scribble , qui prend la majeure partie de la charge). Ainsi, le début de ce paragraphe est programmé comme suit:

     .    —  .   —  -  ◊link["https://pollenpub.com/"]{Pollen}   -. 

Pollen se soucie de coller toutes les balises nécessaires et de les convertir en HTML infaillible. J'ai toujours tous les avantages du balisage manuel (contrôle total sur la page), mais pas d'inconvénients (par exemple, je ne peux pas accidentellement laisser une balise non fermée).

Un autre exemple de notation simplifiée est lindenmayer , le système de génération et de dessin fractal du système Lindenmayer , comme celui-ci:



Dans une raquette typique, un programme Lindenmayer pourrait ressembler à ceci:

 #lang racket/base (require lindenmayer/simple/compile) (define (finish val) (newline)) (define (A value) (display 'A)) (define (B value) (display 'B)) (lindenmayer-system (void) finish 3 (A) (A -> AB) (B -> A)) 

Mais vous pouvez utiliser la notation simplifiée en changeant simplement la notation #lang en haut du fichier:

 #lang lindenmayer/simple ## axiom ## A ## rules ## A -> AB B -> A ## variables ## n=3 

La langue suppose que vous connaissez déjà le système L. Mais une notation simplifiée permet d'écrire facilement vos souhaits dans un programme qui fait ce que vous voulez.

3. Lorsque vous souhaitez travailler avec une notation existante. Nous avons vu ci-dessus comment brag utilise la grammaire BNF comme code source.

 #lang brag bf-program : (bf-op | bf-loop)* bf-op : ">" | "<" | "+" | "-" | "." | "," bf-loop : "[" (bf-op | bf-loop)* "]" 

Un autre exemple. Les gens qui ont essayé Pollen ont dit: «Oui, c'est super, mais je préfère Markdown.» Pas de problème: pollen/markdown est un dialecte Pollen qui offre la sémantique Pollen mais accepte la notation Markdown habituelle:

     .    —  .   —  -  [Pollen]("https://pollenpub.com/")   -. 

La chose la plus agréable? J'ai écrit ce dialecte en seulement une heure, en combinant l' analyseur Markdown avec le code existant.

4. Si vous souhaitez créer une cible intermédiaire pour d'autres langues. JSON, YAML, les expressions S et XML sont tous des langages orientés sujet qui définissent les formats de données pour la lecture et l'écriture sur machine.

Dans Perfect Racket, un langage de formation est appelé jsonic . Il vous permet d'incorporer des expressions de raquette dans JSON, rendant ainsi JSON programmable. Le code source ressemble à ceci:

 #lang jsonic // a line comment [ @$ 'null $@, @$ (* 6 7) $@, @$ (= 2 (+ 1 1)) $@, @$ (list "array" "of" "strings") $@, @$ (hash 'key-1 'null 'key-2 (even? 3) 'key-3 (hash 'subkey 21)) $@ ] 

Compile en JSON ordinaire:

 [ null, 42, true, ["array","of","strings"], {"key-1":null,"key-3":{"subkey":21},"key-2":false} ] 

5. Lorsque la partie principale du programme est la configuration. Par exemple, les fichiers Dot peuvent être décrits comme DSL. Un exemple plus complexe de Racket est le Riposte de Jesse Alama, un langage pour tester l'API HTTP basée sur JSON:

 #lang riposte $productId := 41966 $qty := 5 $campaignId := 1 $payload := { "product_id": $productId, "campaign_id": $campaignId, "qty": $qty } POST $payload cart/{uuid}/items responds with 200 $itemId := /items/0/cart_item_id GET cart responds with 200 

En tant que langage de script miniature, Riposte est beaucoup plus intelligent que le dotfile moyen. Il masque tout le code intermédiaire nécessaire pour les transactions HTTP et permet à l'utilisateur de se concentrer sur l'écriture de tests. C'est toujours le ménage. Mais au moins, vous pouvez vous concentrer sur le ménage dont vous vous souciez.

Pourquoi raquette?


Souvent, les critiques de JOP demandent: «Pourquoi créer un langage orienté sujet? Est-il plus facile d'écrire une bibliothèque native? "

Non, ce n'est pas plus facile si vous avez le bon outil. La raquette est inhabituelle: elle est conçue de A à Z spécifiquement pour YOP.Ainsi, l'implémentation de DSL sur Racket est plus rapide, moins chère et plus facile que les alternatives. Par exemple, dans la première leçon de mon livre, j'ai montré comment développer un nouveau langage en une heure - même si vous n'avez jamais utilisé Racket.

Sous le capot de chaque DSL dans Racket, le compilateur source à source fonctionne réellement , ce qui convertit la notation et la sémantique DSL en un programme Racket équivalent. Pour cette raison, Racket DSL ne pourra pas fonctionner aussi vite que le code C écrit manuellement. Mais alors tous les outils et bibliothèques Racket sont disponibles pour chaque DSL. Vous perdez en productivité, mais gagnez à plusieurs reprises en commodité. Et lorsque la création d'une DSL est pratique et facile, elle devient une option réaliste pour un éventail de problèmes beaucoup plus large.

Ainsi, pour répondre à la critique - non, DSL ne nécessite pas nécessairement plus de travail que la bibliothèque native. De plus, comme nous l'avons déjà vu, en tant qu'interface, un langage peut faire ce qu'une bibliothèque native ne peut pas faire.

Pourquoi macro?


Étant donné que tous les DSL sont compilés dans Racket, le programmeur doit écrire des transformateurs de syntaxe qui convertissent la notation DSL en Racket natif. Ces convertisseurs de syntaxe sont appelés macros . En fait, ils peuvent être décrits comme des extensions du compilateur Racket.

Le système macro Racket est vaste, élégant et est sans aucun doute la perle de sa couronne. Une grande partie de mon livre traite du plaisir de travailler avec les macros Racket. Je peux nommer deux fonctions exceptionnelles:

  1. Racket , . . , , Racket , , , , , . ( . « » ).
  2. Les macros de raquette sont hygiéniques , c'est-à-dire que par défaut le code créé par la macro préserve le contexte lexical à partir duquel la macro est définie. En pratique, cela élimine l'énorme quantité de gestes inutiles qui sont généralement requis pour DSL (pour plus de détails, voir le chapitre «Hygiène» ).

Est-il possible d'implémenter DSL dans, disons, Python? Bien sûr.En fait, j'ai écrit ma première DSL spécifiquement en Python - et je l'utilise toujours dans mon travail de conception de type . Eh bien, ça. Une seule fois a suffi. Depuis lors, j'utilise Racket.

Conclusion: victoire avec YaOP


Pour le moment, vous pouvez avoir l'une des deux réactions suivantes:

  1. « , , » . , . , , . . . , . .
  2. «, , c Racket » . , - Riposte , — ( ):

    [ ] - Racket. , , - … : « API , ?» : « Riposte». , , [DSL], , . «» Racket. DSL , .

À la fin de l'article «Pourquoi une raquette? Pourquoi Lisp? " J'ai dit que le langage Lisp "vous donne l'opportunité de libérer votre potentiel en tant que programmeur et penseur et ainsi augmenter vos attentes sur ce que vous pouvez réaliser."

IOP offre une opportunité similaire: augmenter nos attentes concernant ce que les langages de programmation peuvent faire pour nous. Les langues ne sont pas des boîtes noires. Ce sont les interfaces que nous pouvons concevoir. Dans le même temps, nous ouvrons de nouvelles possibilités pour ce qui peut être fait à l'aide de programmes.

Si vous pouvez trouver la meilleure technique de programmation, utilisez-la. Maintenant que j'ai OOP et Racket, je ne reviendrai jamais.

Lectures complémentaires


Source: https://habr.com/ru/post/fr445822/


All Articles