clisp中atoi的相应标准功能是什么?

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)打印项目.如果没有剩余项目,请停止迭代(~^).否则,打印一个空格,然后使用下一个项目(~})重复该过程.

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