Как заставить Common Lisp трактовать цифры как имена символов?

Надеюсь эти коды

(12 3.5 1e4)

можно рассматривать как три символа

(|12| |3.5| |1e4|)

а не три числа.

Могу ли я выполнить это, установив читатель?


Обновить:

У меня есть коллекция данных, которая организована как вложенные списки:

(abc,d/e-f    12ab, 21e4, %rqa, (foo bar), ....)

Различные элементы разделены запятыми или пробелами (вкладка и новая строка включены). Я хочу читать их по вложенной структуре и без изменения какого-либо символа. Запятые могут быть установлены как пробелы этим:

(set-syntax-from-char #\, #\Space)

Наконец проблема остается в числах. 21e4 переводится в 210000.0 читателем. Я не хочу писать парсер все с нуля, и стараюсь максимально использовать читатель common-lisp.

2 ответа

Пример для 1, работает в LispWorks:

CL-USER 1 > (setf rt0 *readtable*)
#<READTABLE 40F0038923>

CL-USER 2 > (setf rt1 (copy-readtable nil))
#<READTABLE 4020008C23>

CL-USER 3 > (defun read-digit-symbol (stream char)
              (let ((*readtable* rt0))
                (unread-char char stream)
                (intern
                  (princ-to-string
                    (read stream t nil t)))))
READ-DIGIT-SYMBOL

CL-USER 4 > (set-macro-character #\1 #'read-digit-symbol t rt1)
T

CL-USER 5 > (defun test ()
              (let ((*readtable* rt1))
                (read-from-string "(1 11 111)")))
TEST

CL-USER 6 > (test)
(\1 |11| |111|)
10

CL-USER 7 > 

Вы могли бы, я думаю. Но это, вероятно, закончится слезами, так как вы потеряете способность читать цифры.

То, что вы пытаетесь достичь, с этим, что не решаемо, перебирая список чисел, создавая символы с make-symbol а также string?

Другие вопросы по тегам