Чтение квалифицированных символов - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над средством форматирования кода для Lisp, который использует программу чтения для чтения кода в формате S-выражений.

Это прекрасно работает для простых символов.

Это не 'так хорошо работает для квалифицированных символов.foo:bar доступен для чтения только в том случае, если пакет foo был определен, но, разумеется, в отношении средства форматирования это не так, поскольку, в отличие от компилятора, средство форматирования только читает код, а не выполняет его.

Как я могу сказать читателю, что нужно либо продолжить и автоматически создать пакет foo на лету, либо потерпеть неудачу в этом, не парьтесь, просто прочитайте foo:bar, не как символ как таковой, нов каком-то однозначном формате, который я могу рассматривать как особый случай?

1 Ответ

0 голосов
/ 19 сентября 2018

Я считаю, что вам не следует использовать ридер для этого, потому что это с потерями (вы теряете комментарии и все, что изменяется с помощью макросов ридера, например, значения времени чтения, ссылки на время чтения и т. Д.).

Но если вы хотите, вы можете автоматически создать пакет и, возможно, также экспортировать символ, обработав ошибку, например, на SBCL:

(handler-bind ((sb-int:simple-reader-package-error
                (lambda (e)
                  (let ((p (sb-int::package-error-package e)))
                    (ctypecase p
                      (string
                       (make-package p)
                       (invoke-restart 'retry))
                      (package
                       (export (intern (first (simple-condition-format-arguments e)) p) p)
                       (invoke-restart 'retry)))))))
  (with-simple-restart (retry "Retry")
    (read-from-string "foo:bar")))

Это немного взломано, и у нас нет гарантиичто формат условия остается таким.

...