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.
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?
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))
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
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!!