2013-02-28 3 views
0

Я искал способ преобразования пользовательского ввода (read-line) в список атомов, с которыми я могу манипулировать более легко. Например:Lisp - Отображение строки в список

SendInput() Это мой вход. Надеюсь, это сработает.

и я хочу, чтобы вернуться .. (Это мой вход. Надеемся, что это работает.)

В конце концов, было бы идеально, чтобы удалить любые периоды, запятые, кавычки и т.д. Но сейчас Я просто хочу сохранить пользователей в списке (NOT AS A STRING)

So. Сейчас я использую

(setf stuff (coerce (read-line) 'list)) 

и возвращается ко мне, как ... (# \ T # \ ч # \ I # \ S # \ Space # \ I # \ S # \ Space # \ m # \ y # \ Space # \ i # \ n # \ p # \ u # \ t #. # \ Space # \ H # \ o # \ p # \ e # \ f # \ u # \ l # \ l # \ y # \ Space # \ t # \ h # \ i # \ s # \ Space # \ w # \ o # \ r # \ k # \ s #.)

Итак, теперь я нахожусь охота за функцией, которая может принять этот список и отформатировать его правильно ... Любая помощь будет принята с благодарностью!

ответ

5

Что вы хотите сделать, так это разбить последовательность символов (строку) на список меньших строк или символов.

Используйте некоторые функции разделения последовательности, доступные в библиотеке Lisp (см., Например, cl-utilities).

В LispWorks, который поставляется с SPLIT-SEQUENCE функции) Я бы, например, пишут:

CL-USER 8 > (mapcar #'intern 
        (split-sequence '(#\space #\.) 
            "This is my input. Hopefully this works." 
            :coalesce-separators t)) 
(|This| |is| |my| |input| |Hopefully| |this| |works|) 

Помните, чтобы получить символы с именами случае сохранения, они окружены вертикальными черточками. Вертикальные столбцы не являются частью имени символа - так же, как двойные кавычки не являются частью строки - они являются разделителями.

Вы также можете распечатать его:

CL-USER 19 > (princ (mapcar #'intern 
          (split-sequence '(#\space #\.) 
              "This is my input. Hopefully this works." 
              :coalesce-separators t))) 
(This is my input Hopefully this works) 
(|This| |is| |my| |input| |Hopefully| |this| |works|) 

Над распечатывает список. Первым выходом являются данные, напечатанные PRINC, а второй выход - REPL.

Если вы не хотите символов, но строки:

CL-USER 9 > (split-sequence '(#\space #\.) 
          "This is my input. Hopefully this works." 
          :coalesce-separators t) 
("This" "is" "my" "input" "Hopefully" "this" "works") 
+0

Я сожалею, я не слишком опытен с Лиспе , Есть ли способ удалить эти разделители? –

+0

@SeanEvans: напечатайте его с помощью 'PRINC'. –

+0

Я имел в виду в самом списке, знаете ли вы способ удалить вертикальные столбцы из элементов после фильтрации моего ввода в новый список? –

5

ответ Райнер лучше в том, что это немного более легкий (и вообще), но вы также можете использовать CL-PPCRE, если у вас уже есть (я знаю, что всегда знаю).

Вы можете использовать SPLIT непосредственно на строку, которую вы получите от READ-LINE, например, так:

(cl-ppcre:split "[ .]+" (read-line)) 

(Теперь у вас есть две проблемы)

+0

+1 для последней строки: P –

Смежные вопросы