【问题标题】:How to force Common Lisp to treat numerals as symbol names?如何强制 Common Lisp 将数字视为符号名称?
【发布时间】:2014-01-11 16:55:21
【问题描述】:

我希望这些代码

(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的reader。

【问题讨论】:

    标签: common-lisp reader-macro


    【解决方案1】:

    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 > 
    

    【讨论】:

    • 我喜欢他可以指定他的数据不包含比率,例如111/111 -> |1|在我当地的 sbcl。我还想在某些时候绑定 *read-base* 和 *print-base* 以确保它们在读取和打印过程中同步。即使他在 TEST 中将它们绑定到 2,他也需要为所有 10 位数字设置读取器宏,否则浮点数仍将读取为数字。
    • 首先感谢您的回答,但这并不是我想要的。例如,如果文本是123.000,则(intern (princ-to-string ... 会将其转换为|123.0|,这不等于|123.000|。在您的解决方案中,文本首先转换为数字,然后再转换回符号,在此过程中内容可能会发生变化。
    • @SaltyEgg:您可能需要编辑您的问题以更详细地描述要求...
    • @RainerJoswig 抱歉我的问题不详细。我已经更新了。
    【解决方案2】:

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

    你想用这个来完成什么,这不能通过迭代一个数字列表来解决,用make-symbolstring创建符号?

    【讨论】:

    • 这是一个很好的回应,但应该是评论而不是答案。
    • 我只需要处理一组符号,其中一些是普通 lisp 的合法数字。我不希望 CL 将它们转换为数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多