newLISP Fan Club

Forum => newLISP newS => Topic started by: methodic on January 10, 2009, 11:20:38 PM

Title: Convert string to list?
Post by: methodic on January 10, 2009, 11:20:38 PM
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.
Title: Re: Convert string to list?
Post by: DrDave on January 11, 2009, 12:39:56 AM
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?
Title:
Post by: cormullion on January 11, 2009, 12:56:47 AM
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))
Title:
Post by: DrDave on January 11, 2009, 01:40:20 AM
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
Title:
Post by: methodic on January 11, 2009, 11:44:42 AM
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!!