Question

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, la syntaxe et 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.

Était-ce utile?

La solution

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)))

Voir cette page pour savoir comment faire.

Autres conseils

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 le 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 la Schéma de sources pour 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 pour affecter 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 de 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 d'autres cesse de dire que Lisp est un bon langage pour écrire un compilateur.

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.

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!

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.

Régulièrement des macros fonctionnent sur des listes d'objets.Le plus souvent, ces objets sont les autres listes (formant ainsi des arbres) et des symboles, mais ils peuvent être d'autres objets tels que des cordes, des tables de hachage, objets définis par l'utilisateur, etc.Ces structures sont appelées s-exps.

Donc, lorsque vous chargez un fichier source, votre compilateur Lisp va analyser le texte et de produire des s-exps.Les Macros fonctionnent sur ces.Cela fonctionne très bien et c'est un merveilleux moyen de prolonger la langue dans l'esprit de la s-exps.

En outre, celui-ci analyse le processus peut être étendu par le biais de "lecteur de macros" qui vous permettent de personnaliser la façon dont votre compilateur transforme le texte en s-exps.Je suggère, cependant, que vous embrasser Lisp de la syntaxe au lieu de le plier en quelque chose d'autre.

Vous sembler un peu confus, quand vous parlez de Lisp de la "nature fonctionnelle" et de Rubis "syntaxe orientée objet".Je ne suis pas sûr de ce que "syntaxe orientée objet" est censé être, mais Lisp est un multi-paradigme de la langue et il prend en charge la programmation orientée objet extremelly bien.

BTW, quand je dis Lisp, je veux dire Common Lisp.

Je vous suggère de mettre vos préjugés à l'écart et donner Lisp un honnête aller.

La parenthèse de l'enfer?Je ne vois pas plus de parenthèse dans l':

(function toto)

que dans:

function(toto);

Et dans

(if tata (toto)
  (titi)
  (tutu))

pas plus que dans l':

if (tata)
  toto();
else
{
  titi();
  tutu();
}

Je vois de moins en moins entre parenthèses et ';' si.

Ce que vous demandez est un peu comme demander comment devenir un expert chocolatier de sorte que vous pouvez supprimer tout ce qui infernale brown choses à partir de votre favori un gâteau au chocolat.

Oui, vous pouvez changer fondamentalement la syntaxe, et même d'échapper à la "parenthèses de l'enfer".Pour cela vous aurez besoin de définir un nouveau lecteur de syntaxe.Regardez-la dans le lecteur de macros.

Je ne pense toutefois que pour atteindre le niveau de Lisp expertise à le programme de ces macros, vous devez vous immerger dans la langue à un point tel que vous ne le considérera plus parenthese "l'enfer".I. e.par le temps que vous savez comment les éviter, vous devrez venir à accepter comme une bonne chose.

Si vous voulez lisp pour ressembler à utiliser Ruby Ruby.

Il est possible d'utiliser Ruby (et Python) dans un très lisp comme la façon qui est l'une des principales raisons pour lesquelles ils ont gagné l'acceptation de sorte rapidement.

voir cet exemple de la façon dont le lecteur de macros peut prolonger le lecteur lisp avec des tâches complexes comme XML template:

http://common-lisp.net/project/cl-quasi-quote/present-class.html

cette l'utilisateur de la bibliothèque compile les éléments statiques de l'XML en UTF-8 littérale des tableaux d'octets au moment de la compilation qui sont prêtes à être l'écriture de la séquence avais dans le flux réseau.et ils sont utilisables dans la normale lisp macros, ils sont orthogonaux...le placement de la virgule influences dont les pièces sont constants et qui doit être évaluée au moment de l'exécution.

plus de détails sont disponibles à: http://common-lisp.net/project/cl-quasi-quote/

un autre projet que pour Common Lisp syntaxe extensions: http://common-lisp.net/project/cl-syntax-sugar/

@william

Parfois, LISP est le choix de la langue, à savoir Emacs extensions.Je suis sûr que je pourrais utiliser Ruby étendre Emacs si je le voulais, mais Emacs a été conçu pour être étendu avec LISP, donc il semble logique d'utiliser dans cette situation.

C'est une question délicate.Depuis lisp est structurellement déjà si proche de l'arbre d'analyse de la différence entre un grand nombre de macros et de la mise en œuvre de votre propre mini-langue dans un analyseur générateur n'est pas très clair.Mais, sauf pour l'ouverture et la fermeture de parenthèse, vous pourriez très facilement se retrouver avec quelque chose qui ne ressemble en rien lisp.

L'une des utilisations de macros qui a soufflé mon esprit a été la compilation de vérification des requêtes SQL à l'encontre de DB.

Une fois que vous réalisez que vous avez la pleine langue à portée de main au moment de la compilation, il ouvre de nouvelles perspectives.Ce qui signifie également que vous pouvez tirer dans le pied dans de nouvelles façons intéressantes (comme le rendu de compilation non reproductibles, qui peut très facilement se transformer en un débogage cauchemar).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top