<div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">
> 3) Operations include (erlang-style) matching, (grep-style) finding,<br>
> converting, splitting, joining and trimming.<br>
<br>
</div>Note that splitting is a tricky concept for languages like Japanese<br>
that don't have wordspacing, and in which the analogous thing might be<br>
splitting based on shifts between any of four distinct character sets<br>
(plus punctuation) within the overall Japanese character set.<br>
Othewise, +1.<br>
<div class="im"><br></div></blockquote><div><br></div><div><br></div><div>From what I recall, Kanji and Romanji has well-defined word separation, but Katakana and Hiragana requires semantic analysis and/or user hinting. It's been a long time since I've done i18n, though, so I may remember wrong.</div>
<div>Anyway -- this is complex, which is why I'd want the library to do it, rather than me :-)</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">
> 4) Random access is important! As is slicing. string:substr(from,to) should<br>
> be O(1).<br>
<br>
</div>Binaries get you most of this already, so it goes back to how<br>
important (1) and (2) are to you. Erlang isn't used much for<br>
</blockquote><div><br></div><div><br></div><div>I don't see why a native string that stores code points (similar to, say, std::string<wchar_t> in C++) couldn't also give me random access and O(1) slicing.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">
> 8) Easy conversion between binary, list (if needed at all), iolist, and<br>
> string. Strings should be "native" in iolists.<br>
<br>
</div>I'm getting nervous about how big this job would be. ;-)<br>
<div class="im"><br></div></blockquote><div><br></div><div><br></div><div>Hey, the question was "what would your ideal string API for Erlang look like" and I answered that question :-) If the question is "what's the biggest bang for the smallest buck" then you'd have to start making engineering trade-offs. I still like to be able to make such trade-offs in the context of a longer road map, though, to avoid globally pessimizing through some short-term local optimization.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">
> Sub-question: Can you find a nicer syntax than just "string" module functino<br>
> calls?<br>
<br>
</div>"Functino"? You mean those functions they discovered recently that go<br>
slightly faster than light?<br></blockquote><div> </div><div><br></div><div>I wish I was that smart, but no -- a simple typo :-) The main question is -- if lists and binaries already have nice, built-in syntax, how about strings?</div>
<div>If any guard has to be expressed as a string:whatever() function, it's inelegant. However, some of the things you want to express may be counter to traditional Erlang syntax. If random access is O(1), you can do "endswith" just as easily as "startswith" -- and maybe you even want to match string-insensitive (for the current locale, or a specified locale)...</div>
<div>Which ends up being immutable guards, still, but not necessarily particularly fast to execute.</div><div><br></div><div>do_command(Cmd) when string:startswith_case_insensitive(Cmd, "whatever", locale:cyrillic()) -></div>
<div>    do_whatever();</div><div>...</div><div><br></div><div>Can a nice syntax be found that looks more like binary matching, but has these parameters?</div><div><br></div><div></div></div>Using angle+bracket doesn't strike me as particularly good looking, but then, does any language have a string syntax that doesn't use any of the two ASCII quotes nor the double-angles, that could be stolen?<br>
<div>Caret (^a string^)? Pipe (|a string|)? Backtick (`a string`)?</div><div><br></div><div>Sincerely,</div><div><br></div><div>jw</div><div><br></div>