В Common Lisp вы можете использовать для этой цели функцию read-from-string
:
> (read-from-string "123")
123 ;
3
Как видите, первичным возвращаемым значением является объект read, который в данном случае является целым числом. Второе значение - позиция - объяснить сложнее, но здесь оно указывает следующий потенциальный символ в строке, который необходимо будет прочитать следующим при следующем вызове функции чтения, потребляющей то же самое вход.
Обратите внимание, что read-from-string
явно не предназначен только для чтения целых чисел. Для этого вы можете обратиться к функции parse-integer
. Его интерфейс похож на read-from-string
:
> (parse-integer "123")
123 ;
3
Учитывая, что вы запрашивали аналог atoi
, функция parse-integer
является более подходящим выбором.
Обращаясь ко второй части вашего вопроса, после редактирования, вы можете чередовать (или «перемежать») строку с помощью функции format
. Этот пример жестко кодирует один пробел в качестве разделительной строки, используя директивы управления итерациями format
~{
(начало), ~}
(конец) и ~^
(завершается, если остается ввод пуст):
> (format nil "Interleaved: ~{~S~^ ~}." '(1 2 3))
"Interleaved: 1 2 3."
Свободно переведенный, строка формата говорит,
Для каждого элемента в списке ввода (~{
) распечатайте элемент путем его обычного преобразования (~S
). Если ничего не осталось, остановите итерацию (~^
). В противном случае выведите пробел и повторите процедуру со следующим элементом (~}
).
Если вы хотите избежать жесткого кодирования единственного пробела и принять разделительную строку в качестве отдельно предоставленного значения, есть несколько способов сделать это. Не ясно, требуется ли вам такая большая гибкость здесь.