Jusqu'où peuvent aller les macros LISP ?

J'ai beaucoup lu que LISP peut redéfinir la syntaxe à la volée, probablement avec des macros. Je suis curieux de savoir jusqu'où cela va-t-il réellement? Pouvez-vous redéfinir la structure du langage au point qu'il devienne limite un compilateur pour un autre langage ? Par exemple, pourriez-vous changer la nature fonctionnelle de LISP en une syntaxe et une sémantique plus orientées objet, par exemple avoir une syntaxe plus proche de quelque chose comme Ruby ?

En particulier, est-il possible de se débarrasser de l'enfer des parenthèses à l'aide de macros ? J'ai suffisamment appris (Emacs-)LISP pour personnaliser Emacs avec mes propres micro-fonctionnalités, mais je suis très curieux de savoir jusqu'où les macros peuvent aller dans la personnalisation du langage.

请先 登录 后评论

4 réponses

sparkes

Si vous voulez que Lisp ressemble à Ruby, utilisez Ruby.

Il est possible d'utiliser Ruby (et Python) d'une manière très lisp, ce qui est l'une des principales raisons pour lesquelles ils ont été acceptés si rapidement.

请先 登录 后评论
Mike Stone

@étincelles

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

请先 登录 后评论
John with waffle

C'est une question délicate. Étant donné que lisp est déjà structurellement si proche d'un arbre d'analyse, la différence entre un grand nombre de macros et l'implémentation de votre propre mini-langage dans un générateur d'analyseur n'est pas très claire. Mais, à l'exception des parenthèses d'ouverture et de fermeture, vous pourriez très facilement vous retrouver avec quelque chose qui ne ressemble en rien au lisp.

请先 登录 后评论
Jerry Cornelius

L'enfer des parenthèses ? Je ne vois plus de parenthèse dans :

(function toto)

que dans :

function(toto);

Et dans

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

pas plus que dans :

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

Je vois moins de parenthèses et ';' cependant.

请先 登录 后评论
  • 14 abonnés
  • 0 favoris,462 Feuilleter
  • Mike Stone posée à 2023-03-03 12:51

problème similaire