4

在视觉 lisp 中,您可以使用(atoi "123")转换"123"123. clisp 中似乎没有类似“atoi”的功能?

任何建议表示赞赏!


现在我想转换'(1 2 3 20 30)"1 2 3 20 30",那么最好的方法是什么?

parse-interger可以将字符串转换为整数,以及如何将整数转换为字符串?我需要使用format功能吗?

(map 'list #'(lambda (x) (format nil "~D" x)) '(1 2 3)) => ("1" "2" "3")

但我不知道如何将其转换"1 2 3"为 haskell 所做的那样:

concat $ intersperse " " ["1","2","3","4","5"] => "1 2 3 4 5"

真挚地!

4

1 回答 1

10

在 Common Lisp 中,您可以read-from-string为此目的使用该函数:

> (read-from-string "123")
123 ;
3

如您所见,主要返回值是读取的对象,在这种情况下恰好是一个整数。第二个值——位置——更难解释,但在这里它表示字符串中的下一个可能的字符,在随后调用读取相同输入的函数时需要读取该字符。

请注意,这read-from-string显然不是为读取整数而量身定制的。为此,您可以使用该parse-integer功能。它的界面类似于read-from-string

> (parse-integer "123")
123 ;
3

鉴于您要求与 类似atoi,该parse-integer功能是更合适的选择。


解决问题的第二部分,即后期编辑,您可以将字符串与format函数交错(或“穿插”)。此示例使用迭代控制指令(start)、(end) 和(如果剩余输入为空则终止)format 单个空格字符硬编码为分隔字符串:~{~}~^

> (format nil "Interleaved: ~{~S~^ ~}." '(1 2 3))
"Interleaved: 1 2 3."

松散地翻译,格式字符串说,

对于输入列表 ( ~{) 中的每个项目,通过其正常转换 ( ) 打印该项目~S。如果没有剩余项目,则停止迭代 ( ~^)。否则,打印一个空格,然后对下一项 ( ~}) 重复该过程。

如果您想避免硬编码那里的单个空格,并接受分隔符字符串作为单独提供的值,有几种方法可以做到这一点。目前尚不清楚您是否需要这么大的灵活性。

于 2011-09-20T04:14:00.023 回答