[personal profile] dmitry_vk

Reader-macros — это механизм в Common Lisp, позволяющий добавить/переопределить собственный синтаксис объектов.

Одна из основных проблем reader-macros'ов — это коллизии префиксов (dispatch characters).

Непонятно, почему создатели языка не поступили так же, как и с обычными символами — не воспользовались пакетами (packages) для разрешения коллизий. Ведь это кажется таким очевидным.

И использование пакетов для разрешения конфликтов позволяет выбирать, какие синтаксисы использовать, а какие — нет.

Например, такая простая реализация (не факт, что она правильная, но работает) использует символы (symbols) (а не символы (characters)) для выбора способа чтения объекта (с примером простой реализации такого способа чтения объектов для clsql).

(eval-when (:compile-toplevel :load-toplevel)
  (defun get-reader-function (symbol)
    (let ((package (symbol-package symbol))
          (name (symbol-name symbol)))
      (symbol-function (find-symbol (format nil "~A-READER" name) package))))
  (defun symbol-dispatch-reader (stream char arg)
    (declare (ignore arg))
    (let ((dispatch-symbol (read stream t nil t)))
      (funcall (get-reader-function dispatch-symbol) stream char)))
  (set-dispatch-macro-character #\# #\! #'symbol-dispatch-reader)
  (defun sql-reader (stream char)
    (declare (ignore char))
    (let ((*readtable* (copy-readtable)))
      (set-macro-character #\[ #'clsql-sys::sql-reader-open)
      (set-macro-character #\] (get-macro-character #\)))
      (read stream t nil t))))

И используется это дальше так:

(clsql:query #!sql [:select [*] :from :users])

Есть ли у такого решения недостатки?

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

dmitry_vk

April 2023

S M T W T F S
      1
234567 8
9101112131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 5th, 2026 10:59 pm
Powered by Dreamwidth Studios