Какова соответствующая стандартная функция atoi в clisp? - PullRequest
4 голосов
/ 20 сентября 2011

В визуальном списке вы можете использовать (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", как это делает haskell:

concat $ intersperse " " ["1","2","3","4","5"] => "1 2 3 4 5"

С уважением!

1 Ответ

10 голосов
/ 20 сентября 2011

В 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). Если ничего не осталось, остановите итерацию (~^). В противном случае выведите пробел и повторите процедуру со следующим элементом (~}).

Если вы хотите избежать жесткого кодирования единственного пробела и принять разделительную строку в качестве отдельно предоставленного значения, есть несколько способов сделать это. Не ясно, требуется ли вам такая большая гибкость здесь.

...