Common lisp 如何强制Common Lisp将数字视为符号名?

Common lisp 如何强制Common Lisp将数字视为符号名?,common-lisp,reader-macro,Common Lisp,Reader Macro,我希望这些代码 (12 3.5 1e4) 可以看作是三个符号 (|12| |3.5| |1e4|) 而不是三个数字 我可以通过设置读卡器来实现这一点吗 更新: 我有一个以嵌套列表形式组织的数据集合: (abc,d/e-f 12ab, 21e4, %rqa, (foo bar), ....) 不同的项目用逗号或空格分隔(包括制表符和换行符)。我想在w.r.t.嵌套结构中读取它们,并且不改变任何字符。逗号可以通过以下方式设置为空格: (set-syntax-from-char #\,

我希望这些代码

(12 3.5 1e4)
可以看作是三个符号

(|12| |3.5| |1e4|)
而不是三个数字

我可以通过设置读卡器来实现这一点吗


更新:

我有一个以嵌套列表形式组织的数据集合:

(abc,d/e-f    12ab, 21e4, %rqa, (foo bar), ....)
不同的项目用逗号或空格分隔(包括制表符和换行符)。我想在w.r.t.嵌套结构中读取它们,并且不改变任何字符。逗号可以通过以下方式设置为空格:

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

最后,问题仍然在于数字<代码>21e4由读卡器传输到
210000.0
。我不想从头开始编写解析器,而是尽可能多地利用common lisp的读取器。

我想你可以。但这可能会以眼泪结束,因为你将失去阅读数字的能力


通过迭代数字列表,使用
make symbol
string
创建符号,您试图实现哪些无法解决的目标?

例如
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 > 
CL-USER 1>(setf rt0*可读*)
#
CL-USER 2>(setf rt1(副本可读性为零))
#
CL-USER 3>(定义读取数字符号(流字符)
(let((*可读*rt0))
(未读字符流)
(实习生)
(普林斯到字符串)
(读取流t nil t(()()))
可读数字符号
CL-USER 4>(设置宏字符#\1#'读取数字符号t rt1)
T
CL-USER 5>(除雾试验()
(let((*可读*rt1))
(从字符串“(11111)”读取)
试验
CL-USER 6>(测试)
(\1 |11| |111|)
10
CL-USER 7>

这是一个很好的回答,但应该是一个注释而不是答案。我只需要处理一组符号,其中一些符号是common lisp的法定数字。我不希望CL将它们转换为数字。如果他可以指定他的数据不包含比率,例如,在我的本地sbcl中,111/111->1,我喜欢这样。另外,我会在某个时候绑定*read base*和*print base*,以确保它们在读取和princ期间同步。即使他在测试中将它们绑定到2,他也需要为所有10位数字设置读卡器宏,否则浮点数仍将读取为数字。首先感谢您的回答,但这并不是我想要的。例如,如果文本为
123.000
,则
(实习生(princ to string…
将其转换为
|123.0 |
,这不等于
|123.000 |
。在您的解决方案中,文本首先转换为数字,然后再转换回符号,在此过程中,内容可能会发生变化。@SaltyEgg:您可能需要编辑您的问题,以更详细地描述需求…@RainerJoswig很抱歉我的问题不详细,我已经更新了。