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很抱歉我的问题不详细,我已经更新了。