Comment puis-je modifier le lecteur d'Elisp?


12

Modifier le lecteur permettrait d'introduire une nouvelle syntaxe de lecture (comme #(hash table)et '(quoted)). De nombreux lisps ont cette capacité, mais aucune telle fonctionnalité ne semble exister pour elisp.


Piratez les sources C.
wasamasa

3
Emacs Lisp n'a pas de lecteur programmable Lisp.
Drew

@wasamasa Eh bien, c'est toujours une option :) Pas une option portable , mais une option.
Sean Allred

Je pense que "beaucoup de Lisps l'ont." n'est pas une vraie question. Je préférerais de loin avoir une vraie question. Je suggère de raccourcir le titre et de le reformuler dans le corps.
YoungFrog

Les modifications de @YoungFrog sont les bienvenues. Je ne pouvais penser à rien de plus direct ou approprié sans être trop verbeux. La question est simple; ça ne doit pas être long.
Sean Allred

Réponses:


11

Il s'avère que le manuel implique que vous ne pouvez pas réellement faire de macros de lecture.

Selon l' annexe C Porting Common Lisp :

Macros de lecture. Common Lisp comprend un deuxième type de macro qui fonctionne au niveau des caractères individuels. Par exemple, Common Lisp implémente la notation quote par une macro de lecture appelée ', tandis que l'analyseur Emacs Lisp traite simplement quote comme un cas spécial. Certains packages Lisp utilisent des macros de lecture pour se créer des syntaxes spéciales, que l'analyseur Emacs est incapable de lire.


Je pense que cela concerne le logiciel Common Lisp qui utilise des macros de lecture spéciales, plutôt que Elisp. La page concerne le portage du code CL vers Elisp. Et oui, officiellement le lecteur n'est pas personnalisable, mais voyez ma réponse ci-dessous ...
mishoo

L'autre problème ici est que même si vous avez en quelque sorte introduit une nouvelle syntaxe de lecteur, le reste d'Emacs n'en est pas conscient, vous devrez donc y remédier syntax.caussi ...
wasamasa

9

Apparemment, cela peut être fait, mais préparez-vous à beaucoup de travail. (ou pas, car je vais m'y attaquer un week-end ;-).

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

Maintenant, "tout" ce qui reste à faire est d'implémenter un lecteur Lisp complet qui supporte tout ce que fait Elisp et tout ce que vous voulez de plus. Je pense que cela pourrait être utilisé pour fournir defpackagedes symboles internes de type CL et des packages, à titre d'exemple. De plus, une syntaxe spéciale pour les expressions rationnelles est quelque chose que je veux vraiment faire (ou plus exactement, une syntaxe de chaîne qui n'interprète pas les barres obliques inverses).

Edit: voici une implémentation de preuve de concept: https://github.com/mishoo/elisp-reader.el


Il est probablement préférable de ne pas publier cela comme une réponse avant d'avoir réellement implémenté un lecteur Lisp complet comme vous l'avez suggéré (ce qui, je suppose, n'est pas une entreprise banale).
Dan

@Dan C'est faisable, c'est juste que le faire en C est tellement plus pénible que ça craint pour le traitement des chaînes.
wasamasa

1
@Dan l'a fait fonctionner, j'ai édité la réponse pour ajouter le lien vers l'implémentation.
mishoo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.