我的任务是解析该列表
(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会读它,所以......
你知道我怎么做这个解析吗?
使用或不使用上面的代码
答案 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))