Convert string to list?

Started by methodic, January 10, 2009, 11:20:38 PM

Previous topic - Next topic

methodic

I have a string whose contents look like this:

(S A (S (V B (N (N C) (P D (N (N E) F))))) X)



My question is, how do I convert this to a list so I can use it with functions like ref-all? I've tried playing around with eval as it seems most appropriate, but wasn't able to get very far with that.



Thanks in advance.

DrDave

#1
Does list do enougfh for you?
Quote(set 'astring "(S A (V B D) E)")

(list astring)

--> ("(S A (V B D) E)")


But maybe you actually want a simple flat list like (S A V B D E) ? If so, you have to first strip the quotes from the list, then apply flat.



From the looks of your example string, I suspect you built it from a list any way. So don't you already have the list available to you?
...it is better to first strive for clarity and correctness and to make programs efficient only if really needed.

\"Getting Started with Erlang\"  version 5.6.2

cormullion

#2
Perhaps you can do this:


(set 's {(S A (S (V B (N (N C) (P D (N (N E) F))))) X)})
(eval-string (append "'" s))
; so
(ref-all 'N (eval-string (append "'" s)))
;-> ((2 1 2 0) (2 1 2 1 0) (2 1 2 2 2 0) (2 1 2 2 2 1 0))


Also, now, there's read-expr:


(ref-all  'N (read-expr s))
((2 1 2 0) (2 1 2 1 0) (2 1 2 2 2 0) (2 1 2 2 2 1 0))

DrDave

#3
Thanks for the reminder about read-expr. Now we can readily convert a string to a list without even applying list.
(set 's {(S A (S (V B (N (N C) (P D (N (N E) F))))) X)})
(set 'list-from-string (read-expr s))
-->(S A (S (V B (N (N C) (P D (N (N E) F))))) X)
(list? list-from-string)
-->true
...it is better to first strive for clarity and correctness and to make programs efficient only if really needed.

\"Getting Started with Erlang\"  version 5.6.2

methodic

#4
Quote from: "cormullion"Perhaps you can do this:


(set 's {(S A (S (V B (N (N C) (P D (N (N E) F))))) X)})
(eval-string (append "'" s))
; so
(ref-all 'N (eval-string (append "'" s)))
;-> ((2 1 2 0) (2 1 2 1 0) (2 1 2 2 2 0) (2 1 2 2 2 1 0))


Also, now, there's read-expr:


(ref-all  'N (read-expr s))
((2 1 2 0) (2 1 2 1 0) (2 1 2 2 2 0) (2 1 2 2 2 1 0))


That worked great, read-expr is a great new addition! Thanks again!!