在visual 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"
,如同哈克尔所做的那样:
concat $ intersperse " " ["1","2","3","4","5"] => "1 2 3 4 5"
此致!
答案 0 :(得分: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
函数交错(或“散布”)一个字符串。此示例使用the format
iteration control directives ~{
(开始),~}
(结束)和~^
将单个空格字符硬编码为分隔字符串(如果剩余输入为空):
> (format nil "Interleaved: ~{~S~^ ~}." '(1 2 3))
"Interleaved: 1 2 3."
松散翻译,格式字符串显示,
对于输入列表中的每个项目(
~{
),按正常转换(~S
)打印项目。如果没有剩余项目,请停止迭代(~^
)。否则,打印一个空格,然后使用下一个项目~}
)重复该过程。
如果您想避免对单个空间进行硬编码,并将分隔符字符串作为单独提供的值接受,则有几种方法可以做到这一点。目前尚不清楚您是否需要这么大的灵活性。