2017-02-05 11 views
0

Итак, у меня есть список элементов, которые я создал из файла. Я могу прочитать файл и поместить элементы в свой список успешно, но у меня возникли проблемы с преобразованием/литьем этих элементов в строки.Как нарисовать элементы в списке строк в Racket

Так, например:

(print myList) 

производит:

'(Apple Orange banana pickle) 

и:

(for ([i lst]) 
     (print i) 
    ) 

производит:

'Apple'Orange'banana'pickle 

, которые не являются строками.

Мне действительно нужен список строк, чтобы я мог ими управлять позже. Документация по ракетке, похоже, показывает только, как заботиться о символах. Как мне это сделать? Спасибо за любую помощь!

+0

Я бы рекомендовал книгу новичка, такую ​​как «The Little Schemer» или «Как разработать программы», чтобы понять, как мы решаем проблемы на Схеме. В настоящее время вы пишете код не-идиоматическим способом, как если бы вы использовали традиционный процедурный язык. –

+0

Обратите внимание, что 'display' - это правильная функция для использования, если вы хотите, чтобы данные отображались без инкапсуляции. Кроме того, если вы хотите что-то вроде этого, то, возможно, лучше использовать 'write'. – Sylwester

ответ

0

Я думаю, что нашел свой ответ. Я считаю, что элементы, которые у меня есть в моем списке, называются «символами» в ракетке. Таким образом, существует метод «symbol-> string», который вы можете использовать.

Так я определил новый список под названием «StringList», и сделал это:

;Create new list to be list of strings 
(define stringList '()) 

;convert symbols from list into strings and add to stringList 
(for ([i myList]) 
    (set! i (symbol->string i)) 
    (set! stringList (cons i stringList)) 
) 

еще хотелось бы услышать любые отзывы!

+0

Обратите внимание, что элементы в выходном списке отображаются в обратном порядке. –

+2

Не используйте 'for' для этого, используйте' for/list' (или 'map', как предлагает @ ÓscarLópez). 'set!' почти никогда не то, что вы хотите. –

+0

Пожалуйста, не используйте 'set!'! –

1

Там более простой, более идиоматический способ с помощью встроенного в map процедуре вместе с symbol->string, который выполняет именно преобразование вам нужно:

(map symbol->string '(apple orange banana pickle)) 
=> '("apple" "orange" "banana" "pickle") 

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

Также обратите внимание, что мы избегаем явного цикла: есть встроенные процедуры для манипулирования списками любым способом, который вы можете себе представить, и для тех редких случаев, когда мы не находим процедуру, которая соответствует нашим потребностям, мы используем рекурсию ,