Как отключить макрос для чтения?

Я использовал макрос чтения по местному времени, пока не понял, что он мне не нужен (хотите прочитать дату? Просто используйте format или local-time:format-datestring, и он не выведет @…).

Однако это конфликтует с кодом Parenscript, использующим ps:@

недопустимый завершающий символ после двоеточия: #@

Можно ли отключить макрос читалки без перезагрузки образа?

Что он делает

(defun enable-read-macros ()
  "Enables the local-time reader macros for literal timestamps and universal time."
  (set-macro-character #\@ '%read-timestring)
  (set-dispatch-macro-character #\# #\@ '%read-universal-time)
  (values))

Я не вижу макроса для чтения на стороне Parenscript.


person Ehvince    schedule 28.10.2019    source источник


Ответы (1)


Возможно, вы можете попытаться отменить изменения в текущей таблице чтения с помощью чего-то вроде этого, что должно получить стандартную таблицу чтения и «восстановить» записи текущей таблицы чтения в стандартную.

(let ((rt (copy-readtable nil)))
  (multiple-value-bind (function non-terminating-p)
      (get-macro-character #\@ rt)
    (set-macro-character #\@ function non-terminating-p))
  (set-dispatch-macro-character #\# #\@ (get-dispatch-macro-character #\# #\@ rt)))
person Renzo    schedule 28.10.2019
comment
Очень хакерский и здесь есть чему поучиться :) Не работает, ошибка остается. get-macro-character возвращает NIL NIL. - person Ehvince; 28.10.2019
comment
NIL является допустимым обозначением для стандартного reable в (set|get)-[dispatch-]macro-character, поэтому вам не нужно использовать (copy-readtable nil) и привязывать его к rt. Но кроме этого, он работает на моей машине, поэтому, возможно, OP должен принудительно перезагрузить систему parenscript (например, (asdf:load:parenscript:force t)) - person coredump; 28.10.2019
comment
mmh asdf:load не определено, пробовал с load-system, :force выдает ошибку файла компиляции, без него запускается, но этого недостаточно. SBCL 1.4.5, asdf 3.3.1. - person Ehvince; 28.10.2019