Следующий код из https://www.rosettacode.org/wiki/Tokenize_a_string#Common_Lisp разбивает строку запятыми и отправляет список.Как обрезать после разделения строки на список в Lisp
(defun comma-split (string)
(loop for start = 0 then (1+ finish)
for finish = (position #\, string :start start)
collecting (subseq string start finish)
until (null finish)
)
)
Однако подстроки будут иметь пробелы вокруг них, если они находятся в исходной строке.
> (comma-split " a, b ,c , d , e")
(" a" " b " "c " " d " " e")
Как добавить функцию строковой обрезки, чтобы удалить эти пробелы здесь. Я не вижу строку, возвращаемую функцией.
Я пытался иметь локальную переменную, но она не работает:
(defun comma-split2 (string)
(let* ((onestr "")
)
(loop for start = 0 then (1+ finish)
for finish = (position #\, string :start start)
(onestr (subseq string start finish))
(onestr (string-trim onestr))
collecting onestr
until (null finish)
)
))
Ошибка на загрузке файла:
*** - LOOP: illegal syntax near (ONESTR (SUBSEQ STRING START FINISH)) in
(LOOP FOR START = 0 THEN (1+ FINISH) FOR FINISH = (POSITION #\, STRING :START START) (ONESTR (SUBSEQ STRING START FINISH))
(ONESTR (STRING-TRIM ONESTR)) COLLECTING ONESTR UNTIL (NULL FINISH))
The following restarts are available:
Даже обрезку outlist во второй функции не работает:
(defun comma-split2 (string)
(let ((outlist (list))
(setf outlist (comma-split string))
(dolist (str outlist)
(push (string-trim str) outlist)
)
(nreverse outlist)
)))
> (comma-split2 " a, b ,c , d , e")
*** - LET: illegal variable specification (SETF OUTLIST (COMMA-SPLIT STRING))
The following restarts are available:
Я знаю об этом, но я пытаюсь включить его в саму функцию. Pl см. Мое редактирование выше. – rnso