删除字符串常见的lisp中的管道点

时间:2013-12-09 12:02:28

标签: parsing common-lisp clisp

我的任务是解析该列表

(100 30 5。50 6)

编号135.56

输入列表的格式始终相同

我写道:

(reduce 
    'string-concat 
    (mapcar 
        (lambda (x) (remove #\0 x)) 
        (mapcar 
            'write-to-string
            l
        )
    )
)

输出我“135 |。| 56” 然后read-from-string会读它,所以......

你知道我怎么做这个解析吗?

使用或不使用上面的代码

2 个答案:

答案 0 :(得分:1)

您的方法看起来并不特别健壮。此外,很难理解输入列表是什么。点是一个符号,就像在|.|中一样吗?垂直条正在转义名称,因此它不会与Lisp中点字符的内置使用冲突。它用于虚线对,代表缺点单元格:(a . b)

如果是符号,则可以编写符号而不转义为字符串。首先,逃避:

CL-USER 5 > (write-to-string '|.|)
"\\."

接下来,没有:

CL-USER 6 > (princ-to-string '|.|)
"."

答案 1 :(得分:0)

您的列表(100 30 5。50 6)不是Common Lisp中的有效列表结构。 “点对”必须在点后只有一个元素。如果您想了解更多信息,请查看您最喜欢的Common Lisp Book如何从cons单元构建列表。 (例如Peter Seibels "Practical Common Lisp"

因此您无法将此字符串解析为列表 - 您需要进行预处理步骤。

(defun pre-processing (str)
  (let ((idx (position #\. str)))
    (list (read-from-string (concatenate 'string (subseq str 0 idx) ")"))
          (read-from-string (concatenate 'string "(" (subseq str (1+ idx)))))))

此函数将您的字符串拆分为两个列表,您可以按照自己的方式进行处理。

CL-USER 1 > (pre-processing "(100 30 5 . 50 6)")
((100 30 5) (50 6))