How to convert a string to list using clisp?

一曲冷凌霜 提交于 2019-12-30 08:38:07

问题


How can i convert the string "1 2 3 4 5 6 7" into the list (1 2 3 4 5 6 7) elegantly? I am using CLISP.


回答1:


Hint: Take a look at with-input-from-string.




回答2:


You should use parse-integer in a loop.

For example, using 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))

(1 2 3)

If you need better control about the splitting, use the split-sequence or cl-ppcre library.

If you need to parse more general number formats, use the parse-number library.

Libraries are available from Quicklisp.




回答3:


Here is a recursive solution.

    ;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)))



回答4:


(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)

it works however i feel it is not so elegant as there are many read call .

thanks again!




回答5:


I see that Svante is right. My previous attempt did not work. Here is another attempt. I use concatenate to change the string into a list representation. Then I use read-from-string to convert the string (s-2) into an actual list.

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

I roll it into a function like this:

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

The only purpose of "let" and "L" is to make the function from-string-to-list return only the list and not return multiple values. read-from-string returns two values: The list and the size of the string, I think.




回答6:


That would do,

(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)))



回答7:


I think this might work:

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

This makes a list with spaces as elements. Remove spaces:

(setf L-final (remove #\Space L-temp))


来源:https://stackoverflow.com/questions/7459501/how-to-convert-a-string-to-list-using-clisp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!