45 votes

Jusqu'où peuvent aller les macros LISP?

J'ai lu beaucoup de choses que LISP peut redéfinir la syntaxe à la volée, sans doute avec des macros. Je suis curieux de savoir dans quelle mesure ce fait aller? Vous pouvez redéfinir la structure de la langue, si bien qu'il devient limite un compilateur pour une autre langue? Par exemple, pourriez-vous changer la nature fonctionnelle de LISP dans un plus orienté-objet, de la syntaxe et de la sémantique, peut-être dire que d'avoir une syntaxe plus proche de quelque chose comme le Rubis?

Surtout, est-il possible de se débarrasser de la parenthèse de l'enfer à l'aide des macros? J'ai appris assez (Emacs)LISP pour personnaliser Emacs avec mon propre micro-fonctions, mais je suis très curieux de savoir dans quelle mesure les macros peuvent aller dans la personnalisation de la langue.

34voto

Eric Normand Points 2030

C'est vraiment une bonne question.

Je pense que c'est nuancée mais certainement répondre:

Les Macros ne sont pas coincés dans les s-expressions. Voir la BOUCLE de macro pour un très complexes de la langue écrite à l'aide de mots-clés (symboles). Ainsi, alors que vous pouvez de début et de fin de la boucle entre parenthèses, à l'intérieur, il a sa propre syntaxe.

Exemple:

(loop for x from 0 below 100
      when (even x)
      collect x)

Cela étant dit, la plupart des macros simples suffit d'utiliser s-expressions. Et vous souhaitez être "coincé" à les utiliser.

Mais s-expressions, comme Sergio a répondu, commencer à se sentir bien. La syntaxe devient hors de la voie et vous commencer à coder dans l'arbre syntaxique.

Comme pour les lecteurs de macros, oui, vous pourrait écrire quelque chose comme ceci:

#R{
      ruby.code.goes.here
  }

Mais vous auriez besoin d'écrire votre propre syntaxe Ruby analyseur.

Vous pouvez également imiter certains des Rubis constructions, comme des blocs, avec des macros que les compiler l'existant Lisp constructions.

#B(some lisp (code goes here))

serait traduit en

(lambda () (some lisp (code goes here)))

Consultez cette page pour savoir comment faire.

22voto

Sean Harrison Points 181

Oui, vous pouvez redéfinir la syntaxe, de sorte que Lisp devient un compilateur. Pour ce faire, utilisez le "Lecteur Macros", qui sont différentes de la normale "Compilateur Macros" que vous êtes probablement à l'esprit.

Common Lisp a l'installation intégrée pour définir une nouvelle syntaxe pour le lecteur et lecteur de macros processus de syntaxe. Ce traitement est effectué à lire en temps (ce qui vient avant la compilation ou de l'eval de temps). Pour en savoir plus sur la définition de lecteur de macros en Common Lisp, voir la Common Lisp Hyperspec -- vous aurez envie de lire Ch. 2, "Syntaxe" et Ch. 23, le "Lecteur". (Je crois que Régime possède la même facilité, mais je ne suis pas aussi familier avec elle -- voir le Schéma des sources de l' Arc langage de programmation).

Comme exemple simple, supposons que vous voulez Lisp pour utiliser des accolades plutôt que des parenthèses. Cela exige quelque chose comme lecteur de définitions:

;; { and } become list delimiters, along with ( and ).
(set-syntax-from-char #\{ #\( )
(defun lcurly-brace-reader (stream inchar) ; this was way too easy to do.
  (declare (ignore inchar))
  (read-delimited-list #\} stream t))
(set-macro-character #\{ #'lcurly-brace-reader)

(set-macro-character #\} (get-macro-character #\) ))
(set-syntax-from-char #\} #\) )

;; un-lisp -- make parens meaningless
(set-syntax-from-char #\) #\] ) ; ( and ) become normal braces
(set-syntax-from-char #\( #\[ )

Vous dites Lisp que l' { est comme un ( et que l' } est comme une ). Ensuite, vous créez une fonction (lcurly-brace-reader) que le lecteur s'appeler chaque fois qu'il voit un {, et que vous utilisez set-macro-character d'attribuer cette fonction à l' {. Ensuite, vous dites Lisp ( et ) sont comme [ et ] (qui est, non significatif de la syntaxe).

D'autres choses que vous pourriez faire comprendre, par exemple, la création d'une nouvelle syntaxe de la chaîne ou à l'aide de [ et ] de joindre à-fix de la notation et de la traiter dans les S-expressions.

Vous pouvez aussi aller bien au-delà de cela, la redéfinition de l'ensemble de la syntaxe avec votre propre macro personnages qui vont déclencher des actions dans le lecteur, de sorte que le ciel est vraiment la limite. Ceci est juste l'une des raisons pour lesquelles Paul Graham et les autres ne cessent de dire que Lisp est un bon langage pour écrire un compilateur.

16voto

Sergio Acosta Points 6450

Je ne suis pas un Lisp expert, diable, je ne suis même pas un programmeur Lisp, mais après un peu d'expérimenter avec la langue je suis venu à la conclusion que, après un certain temps de la parenthèse commencer à devenir "invisible" et vous commencez à voir le code que vous voulez qu'il soit. Vous commencez à payer plus d'attention à la syntaxe des constructions vous créez via s-exprs et les macros, et moins à la forme lexicale du texte des listes et des parenthèses.

Cela est particulièrement vrai si vous profitez d'un bon éditeur qui permet à l'indentation et la coloration de la syntaxe (essayez de régler une parenthèse d'une couleur très similaire à l'arrière-plan).

Vous pourriez ne pas être en mesure de remplacer la langue complètement et obtenir 'Ruby' la syntaxe, mais vous n'en avez pas besoin. Grâce à la langue flexibilité vous pourriez avoir un dialecte qui se sent comme vous êtes la suite de "Ruby style de programmation" si vous voulez, peu importe ce que cela signifie pour vous.

Je sais que c'est juste une observation empirique, mais je pense que j'ai eu un de ces Lisp lumières moments quand j'ai réalisé cela.

15voto

jfm3 Points 13666

Maintes et maintes fois, les nouveaux arrivants au Lisp vouloir "se débarrasser de tous les parenthèses." Il dure quelques semaines. Aucun projet de construction d'un grave usage général syntaxe de programmation sur le dessus de l'habituel S-analyseur d'expression n'est jamais n'importe où, parce que les programmeurs invariablement vent, le préférant à ce que perçoivent comme une "parenthèse de l'enfer." Il faut un peu s'habituer à, mais pas beaucoup! Une fois que vous avez utilisé, et vous pouvez vraiment apprécier la plasticité de la syntaxe par défaut, le retour à l'langues où il n'y a qu'une façon d'exprimer une programmation particulière construire, c'est vraiment insupportable.

Cela étant dit, Lisp est un excellent substrat pour la construction du Domaine des Langues Spécifiques. Tout aussi bon, si ce n'est meilleur, que XML.

Bonne chance!

12voto

Dan Weinreb Points 425

La meilleure explication de Lisp macros que j'ai jamais vu, est à

https://www.youtube.com/watch?v=4NO83wZVT0A

en commençant à environ 55 minutes. C'est une vidéo d'une conférence donnée par Pierre Seibel, l'auteur de "Pratique Common Lisp", qui est le meilleur Lisp manuel, il est.

La motivation pour Lisp macros est généralement difficile à expliquer, parce qu'ils sont vraiment dans leur propre dans des situations qui sont trop longues à présent dans un tutoriel simple. Peter arrive avec un grand exemple; vous pouvez le saisir complètement, et il fait bon, de la bonne utilisation de Lisp macros.

Vous avez demandé: "pourriez-vous changer la nature fonctionnelle de LISP dans un plus orienté-objet, la syntaxe et de la sémantique". La réponse est oui. En fait, Lisp à l'origine, n'avaient pas du tout la programmation orientée objet à tous, n'est pas surprenant car Lisp a été autour depuis avant la programmation orientée objet! Mais quand nous avons d'abord appris à propos de la programmation orientée objet en 1978, nous avons été en mesure de l'ajouter à Lisp facilement, à l'aide, entre autres choses, les macros. Finalement, le Common Lisp Object System (CLOS) a été développé, un très puissant de la programmation orientée objet système qui s'intègre parfaitement dans Lisp. Le tout peut être chargé comme une extension -- rien n'est intégré! Tout est fait avec des macros.

Lisp a une tout autre fonction, appelé "lecteur de macros", qui peut être utilisé pour étendre la surface de la syntaxe de la langue. À l'aide de lecteur de macros, vous pouvez faire des sous-langues qui ont des C-like ou touche de Ruby. Ils transforment le texte en Lisp, en interne. Ce ne sont pas largement utilisés par la plupart des programmeurs Lisp, principalement parce qu'il est difficile d'étendre l'environnement de développement interactif pour comprendre la nouvelle syntaxe. Par exemple, Emacs indentation commandes serait troublé par une nouvelle syntaxe. Si vous êtes énergique, si, Emacs est extensible trop, et vous pourriez enseigner à propos de votre nouveau lexical de la syntaxe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X