Как преобразовать строку в список, используя clisp? - PullRequest
7 голосов
/ 18 сентября 2011

Как мне элегантно преобразовать строку "1 2 3 4 5 6 7" в список (1 2 3 4 5 6 7)? Я использую CLISP.

Ответы [ 7 ]

3 голосов
/ 18 сентября 2011

Вы должны использовать parse-integer в цикле.

Например, используя loop:

(let ((string "1 2 3"))
  (loop :for (integer position) := (multiple-value-list 
                                    (parse-integer string
                                                   :start (or position 0)
                                                   :junk-allowed t))
        :while integer
        :collect integer))

& rArr; (1 2 3)

Если вам нужно лучше контролировать разбиение, используйте библиотеку split-sequence или cl-ppcre.

Если вам нужно проанализировать более общие числовые форматы, используйте библиотеку parse-number.

Библиотеки доступны из Quicklisp.

2 голосов
/ 12 декабря 2012

Вот рекурсивное решение.

    ;Turns a string into a stream so it can be read into a list
    (defun string-to-list (str)
        (if (not (streamp str))
           (string-to-list (make-string-input-stream str))
           (if (listen str)
               (cons (read str) (string-to-list str))
               nil)))
2 голосов
/ 18 сентября 2011
(with-input-from-string (s "1 2 3 4 5 6 7" :index i :start 0 :end 13)
              (list (read s) (read s) (read s) (read s) (read s) (read s)))
(1 2 3 4 5 6 7)

это работает, но я чувствую, что это не так элегантно, как много звонков read.

еще раз спасибо!

2 голосов
/ 18 сентября 2011

Подсказка: взгляните на с вводом из строки .

1 голос
/ 06 марта 2017

Я вижу, что Сванте прав. Моя предыдущая попытка не сработала. Вот еще одна попытка. Я использую конкатенацию, чтобы изменить строку в представление списка. Затем я использую read-from-string для преобразования строки (s-2) в фактический список.

(setf s-0 "1 2 3 4 5 6 7")
(setf s-1 (concatenate 'string "(" s ")" ))
(setf s-2 (read-from-string s-1))

Я превращаю это в функцию, подобную этой:

(defun from-string-to-list (s)
  (let ((L (read-from-string 
           (concatenate 'string "(" s ")"))))
    L))

Единственная цель "let" и "L" - заставить функцию from-string-to-list возвращать только список и не возвращать несколько значений. Я думаю, что read-from-string возвращает два значения: список и размер строки.

0 голосов
/ 03 марта 2017

Я думаю, это может сработать:

(setf s "1 2 3 4 5 6 7")
(setf L-temp (coerce s 'list))

Это создает список с пробелами в качестве элементов.Удалить пробелы:

(setf L-final (remove #\Space L-temp))
0 голосов
/ 04 августа 2013

Что бы сделать,

(with-input-from-string (s "1 2 3 4 5")
   (let ((r nil))
      (do ((line (read s nil 'eof)
                 (read s nil 'eof)))
          ((eql line 'eof))
          (push line r))
   (reverse r)))
...