3

我希望这些代码

(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 的阅读器。

4

2 回答 2

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 > 
于 2014-01-11T18:29:49.450 回答
3

你可以,我猜。但这可能会以眼泪告终,因为您将失去阅读数字的能力。

你想用这个来完成什么,这是无法通过迭代数字列表,用make-symboland创建符号来解决的string

于 2014-01-11T17:25:44.230 回答