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

时间:2011-09-20 03:49:14

标签: lisp common-lisp clisp

在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"

此致!

1 个答案:

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

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