Page 1 of 1

Convert string to list?

Posted: Sun Jan 11, 2009 7:20 am
by 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.

Re: Convert string to list?

Posted: Sun Jan 11, 2009 8:39 am
by DrDave
Does list do enougfh for you?
(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?

Posted: Sun Jan 11, 2009 8:56 am
by cormullion
Perhaps you can do this:

Code: Select all

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

Code: Select all

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

Posted: Sun Jan 11, 2009 9:40 am
by DrDave
Thanks for the reminder about read-expr. Now we can readily convert a string to a list without even applying list.

Code: Select all

(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

Posted: Sun Jan 11, 2009 7:44 pm
by methodic
cormullion wrote:Perhaps you can do this:

Code: Select all

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

Code: Select all

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