On Thu, May 7, 2020 at 10:10 PM Daniel Colascione wrote: > On 5/7/20 2:06 PM, Stefan Monnier wrote: > > > I thought your previous message was saying you don't like this approach > > (when you said "I don't like reader magic"). Is it that I misunderstood > > or that you don't much like the solution but think that from a pragmatic > > point of view it's still the better option? > > I don't like reader magic in general, but I don't think of the CL > approach as being all that magical: it has uniform rules and a long > history. CL namespaces *are* reader magic all right, but it's reader > magic with which a lot of people are familiar > Not only that, but CL the reader itself is programmable. So it's really _not_ "magic", it's all (hyper)spec'ed! http://www.lispworks.com/documentation/HyperSpec/Body/23_a.htm However, Daniel, my proposal doesn't have much magic. Is is really dumb ;-). Here's the gist of it (a pure elisp solution using advice, very lightly tested) (require 'cl-lib) (eval-when-compile (advice-add 'read :around #'read-aware-of-shorthands) (defvar shorthand-shorthands '(("^vlp-" . "very-long-prefix-")))) (defun shorthand-expand (form) (cond ((consp form) (setcar form (shorthand-expand (car form))) (setcdr form (shorthand-expand (cdr form)))) ((arrayp form) (cl-loop for i from 0 for e across form do (aset form i (shorthand-expand e)))) ((symbolp form) (let ((name (symbol-name form))) (cl-loop for (short-pat . long-pat) in shorthand-shorthands do (setq name (replace-regexp-in-string short-pat long-pat name)) finally (setq form (intern name)))))) form) (defun read-aware-of-shorthands (oldread &rest stuff) (let ((form (let ((obarray (obarray-make))) (apply oldread stuff)))) (shorthand-expand form))) (defun vlp-foo () 42) ;; => very-long-prefix-foo (vlp-foo) ;; => 42 (defun vlp-aref1 (array) (aref array 1)) (vlp-aref1 [2 vlp-shiiz 4]) ;; => very-long-prefix-shiiz (let ((shorthand-shorthands nil)) ;; pretend this was some other file (eval (car (read-from-string "(vlp-foo)"))) ;; => errors (eval (car (read-from-string "(very-long-prefix-foo)"))) ;; => 42 )