String into comma-separated characters

Can you think of a way to turn a string into comma-separated characters, ideally as an array? as in:

"yes" ----> [y, e, s]
"vanilla" ----> [v, a, n, i, l, l, a] 



Btw arrays aren’t comma-separated. They print with comma separation but they aren’t stored that way.

But… what do you need to do with this array that you can’t do with a string? You can already do, collect, at, put etc directly on strings. So I’d suggest to try it on the string first. You might find out that .as(Array) only wastes time.


I want to split up strings, often numbers, into individual figures
12345 >>> [1,2,3,4,5]

i always assumed arrays were actually comma-separated. i’ve been living in a lie :slight_smile:

a = "abc";
-> abc { |char| char.postln };
a  // separated and looped over
-> abc

a.collect { |char| (char.ascii + 4).asAscii };
-> efg  // each char operated on, and the result reassembled;
-> b

-> c  // both 'at' syntaxes work transparently

// string literals are immutable
a.put(1, $x);
ERROR: Primitive '_BasicPut' failed.
Attempted write to immutable object.

// but copy it, or do any other non-in-place operation on it,
// and it's no longer immutable
b = a.copy;
-> abc

b.put(1, $x);
-> axc

So, for instance,

"12345".do { |char|
	var digitValue = char.digit;
	... do something with the digit...

// this fails because it tries to 'collect' a new String
// and Strings may contain only characters
"12345".collect { |char|

// but you can force a different collection type
b = "12345".collectAs({ |char|
}, Array);
-> [ 1, 2, 3, 4, 5 ]

The last bit might be useful to you because it converts from a collection of ASCII characters into a collection of actual numbers. That is, the important thing about it is not that the result is displayed with commas – the important thing is that "12345".at(0) is $1 (a Char) while, after running those three lines, is 1 (an Integer).

Storage format is for the computer’s convenience. Display format is for human convenience. There are many, many cases where it’s good for these to be different.


1 Like