z_a*_*xis 4 lisp clisp common-lisp
在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")
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何将它变为"1 2 3"像haskell那样:
concat $ intersperse " " ["1","2","3","4","5"] => "1 2 3 4 5"
Run Code Online (Sandbox Code Playgroud)
祝商祺!
seh*_*seh 10
在Common Lisp中,您可以将此read-from-string功能用于此目的:
> (read-from-string "123")
123 ;
3
Run Code Online (Sandbox Code Playgroud)
如您所见,主返回值是读取的对象,在这种情况下恰好是整数.第二个值 - 位置 - 更难解释,但这里它表示字符串中的下一个可能的字符,在后续调用消耗相同输入的读取函数时需要读取.
请注意,这read-from-string显然不是为了读取整数而定制的.为此,您可以转到该parse-integer功能.它的界面类似于read-from-string:
> (parse-integer "123")
123 ;
3
Run Code Online (Sandbox Code Playgroud)
鉴于你要求模拟atoi,该parse-integer功能是更合适的选择.
解决问题的第二部分,即编辑后,您可以将字符串与format函数交错(或"散布").本实施例中硬编码为单个空格字符作为分隔串,使用该format迭代控制指令 ~{(开始), ~}(结束),和~^(如果终止剩余的输入是空的):
> (format nil "Interleaved: ~{~S~^ ~}." '(1 2 3))
"Interleaved: 1 2 3."
Run Code Online (Sandbox Code Playgroud)
松散翻译,格式字符串说,
对于输入列表(
~{)中的每个项目,按正常转换(~S)打印项目.如果没有剩余项目,请停止迭代(~^).否则,打印一个空格,然后使用下一个项目(~})重复该过程.
如果您想避免对单个空间进行硬编码,并将分隔符字符串作为单独提供的值接受,则有几种方法可以做到这一点.目前尚不清楚您是否需要这么大的灵活性.