我希望这些代码
(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的读者。
答案 0 :(得分:4)
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 >
答案 1 :(得分:3)
我猜你可以。但这可能会以泪流满面,因为你会失去阅读数字的能力。
你想要实现什么,通过迭代数字列表无法解决,用make-symbol
和string
创建符号?