132 lines
No EOL
17 KiB
HTML
132 lines
No EOL
17 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<title>CLiki: collapse-string</title>
|
|
<link rel="alternate" type="application/atom+xml" title="ATOM feed of edits to current article"
|
|
href="https://www.cliki.net/site/feed/article.atom?title=collapse-string">
|
|
<link rel="stylesheet" href="static/css/style.css">
|
|
<link rel="stylesheet" href="static/css/colorize.css">
|
|
</head>
|
|
|
|
<body>
|
|
<span class="hidden">CLiki - collapse-string</span>
|
|
<div id="content"><div id="content-area"><div id="article-title">collapse-string</div><div id="article">A function to remove whitespace from a string, with the option of collapsing each "run" to a single character, while optionally ignoring whitespace on the left, right, or both ends of the string. This function always returns a fresh <a href="string.html" class="category">string</a>, so it may be convenient to use in series with destructive functions like <a href="https://www.cliki.net/site/HyperSpec/Body/fun_string-up_g-capitalize.html" class="hyperspec">nstring-downcase</a>. On the other hand, this function isn't very optimized.<p><div class="code"><span class="nonparen"><span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> whitespace-char-p <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_character.html" class="symbol">character</a></span>)</span>
|
|
<span class="comment">;; Could include non-breaking space, maybe, since
|
|
</span> <span class="comment">;; we're already in semi-standard territory with
|
|
</span> <span class="comment">;; these character names. It's a tricky predicate.
|
|
</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_casecm_ccasecm_ecase.html" class="symbol">case</a> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><span class="character">#\Return</span>
|
|
<span class="character">#\Linefeed</span>
|
|
<span class="character">#\Page</span>
|
|
<span class="character">#\Space</span>
|
|
<span class="character">#\Tab</span>
|
|
<span class="character">#\VT</span></span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> make-scratch <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> to-type buffer-size</span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">string-type <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_array-element-type.html" class="symbol">array-element-type</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a></span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-array.html" class="symbol">make-array</a> buffer-size <span class="keyword">:fill-pointer</span> 0
|
|
<span class="comment">;; The new element-type must accommodate both existing characters
|
|
</span> <span class="comment">;; and the given substitution character (if any was specified).
|
|
</span> <span class="keyword">:element-type</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_subtypep.html" class="symbol">subtypep</a> to-type '<a href="https://www.cliki.net/site/HyperSpec/Body/any_null.html" class="symbol">null</a></span>)</span> string-type</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_subtypep.html" class="symbol">subtypep</a> to-type string-type</span>)</span> string-type</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_subtypep.html" class="symbol">subtypep</a> string-type to-type</span>)</span> to-type</span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> '<a href="https://www.cliki.net/site/HyperSpec/Body/any_character.html" class="symbol">character</a></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> collapse-string <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> &key <span class="paren3">(<span class="nonparen">start 0</span>)</span> end to <span class="paren3">(<span class="nonparen">trim <span class="keyword">:both</span></span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_check-type.html" class="symbol">check-type</a> trim <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_member.html" class="symbol">member</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a> <span class="keyword">:left</span> <span class="keyword">:right</span> <span class="keyword">:both</span></span>)</span> <span class="string">"a trim option"</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">buffer-size <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_-.html" class="symbol">-</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> end <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> end <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_length.html" class="symbol">length</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a></span>)</span></span>)</span></span>)</span> start</span>)</span></span>)</span></span>)</span>
|
|
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_loop.html" class="symbol"><i><span class="symbol">loop</span></i></a> with buffer = <span class="paren4">(<span class="nonparen">make-scratch <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_type-of.html" class="symbol">type-of</a> to</span>)</span> buffer-size</span>)</span>
|
|
with state = <span class="keyword">:initial</span>
|
|
for i from start below end
|
|
for <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> = <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> i</span>)</span>
|
|
<a href="https://www.cliki.net/site/HyperSpec/Body/mac_docm_dost.html" class="symbol">do</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a> <span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren1">(<span class="nonparen">whitespace-char-p <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> to <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> state <span class="keyword">:whitespace</span></span>)</span></span>)</span>
|
|
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_vector-pu_-push-extend.html" class="symbol">vector-push-extend</a> to buffer</span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_vector-pu_-push-extend.html" class="symbol">vector-push-extend</a> <a href="https://www.cliki.net/site/HyperSpec/Body/acc_charcm_schar.html" class="symbol">char</a> buffer</span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> state <span class="keyword">:non-whitespace-sequence</span></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_not.html" class="symbol">not</a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_zerop.html" class="symbol">zerop</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_fill-pointer.html" class="symbol">fill-pointer</a> buffer</span>)</span></span>)</span>
|
|
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_casecm_ccasecm_ecase.html" class="symbol">case</a> trim <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen"><span class="keyword">:left</span> <span class="keyword">:both</span></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Not trimming on left.
|
|
</span> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/spefor_setq.html" class="symbol"><i><span class="symbol">setq</span></i></a> state <span class="keyword">:whitespace</span></span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Deal with any trailing whitespace.
|
|
</span> finally <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">unless</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_casecm_ccasecm_ecase.html" class="symbol">case</a> trim <span class="paren6">(<span class="nonparen"><span class="paren1">(<span class="nonparen"><span class="keyword">:right</span> <span class="keyword">:both</span></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span></span>)</span>
|
|
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> to <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_eq.html" class="symbol">eq</a> state <span class="keyword">:whitespace</span></span>)</span></span>)</span>
|
|
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_vector-pu_-push-extend.html" class="symbol">vector-push-extend</a> to buffer</span>)</span></span>)</span></span>)</span>
|
|
<span class="comment">;; Always a new string.
|
|
</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_return.html" class="symbol">return</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_copy-seq.html" class="symbol">copy-seq</a> buffer</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span></div><p><h2>Quick examples</h2><p><table>
|
|
<tr>
|
|
<th>Call</th>
|
|
<th>Output</th>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " Hello World ")</pre></td>
|
|
<td>HelloWorld</td>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " Hello World " :start 10)</pre></td>
|
|
<td>World</td>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " Hello World " :to #\-)</pre></td>
|
|
<td>Hello-World</td>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " Hello World " :to #\_ :trim :right)</pre></td>
|
|
<td>_Hello_World</td>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " Hello World " :to #\/ :trim nil)</pre></td>
|
|
<td>/Hello/World/</td>
|
|
</tr>
|
|
<tr>
|
|
<td><pre class="inline">(collapse-string " " :to #\/ :trim nil)</pre></td>
|
|
<td>/</td>
|
|
</tr>
|
|
</table><p><h2>See also</h2><p><ul>
|
|
<li>Forum post: <a href="https://www.reddit.com/r/Common_Lisp/comments/t85ioo/collapse_all_white_spaces_in_a_string/">Collapse all white spaces in a string</a>
|
|
</li>
|
|
<li>
|
|
<a href="cl-strings.html" class="internal">cl-strings</a>, with e.g. <tt>clean</tt> and <tt>split</tt> functions
|
|
</li>
|
|
</ul>
|
|
<hr>
|
|
<a href="Apache 2.html" class="category">Apache 2</a></div></div>
|
|
<div id="footer" class="buttonbar"><ul><li><a href="collapse-string.html">Current version</a></li>
|
|
<li><a href="https://www.cliki.net/site/history?article=collapse-string">History</a></li>
|
|
<li><a href="https://www.cliki.net/site/backlinks?article=collapse-string">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=collapse-string&from-revision=3855880160">Edit</a></li><li><a href="https://www.cliki.net/site/edit-article?create=t">Create</a></li></ul></div>
|
|
</div>
|
|
<div id="header-buttons" class="buttonbar">
|
|
<ul>
|
|
<li><a href="https://www.cliki.net/">Home</a></li>
|
|
<li><a href="https://www.cliki.net/site/recent-changes">Recent Changes</a></li>
|
|
<li><a href="CLiki.html">About</a></li>
|
|
<li><a href="Text Formatting.html">Text Formatting</a></li>
|
|
<li><a href="https://www.cliki.net/site/tools">Tools</a></li>
|
|
</ul>
|
|
<div id="search">
|
|
<form action="https://www.cliki.net/site/search">
|
|
<label for="search_query" class="hidden">Search CLiki</label>
|
|
<input type="text" name="query" id="search_query" value="" />
|
|
<input type="submit" value="search" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<div id="pageheader">
|
|
<div id="header">
|
|
<span id="logo">CLiki</span>
|
|
<span id="slogan">the common lisp wiki</span>
|
|
<div id="login"><form method="post" action="https://www.cliki.net/site/login">
|
|
<label for="login_name" class="hidden">Account name</label>
|
|
<input type="text" name="name" id="login_name" class="login_input" />
|
|
<label for= "login_password" class="hidden">Password</label>
|
|
<input type="password" name="password" id="login_password" class="login_input" />
|
|
<input type="submit" name="login" value="login" id="login_submit" /><br />
|
|
<div id="register"><a href="https://www.cliki.net/site/register">register</a></div>
|
|
<input type="submit" name="reset-pw" value="reset password" id="reset_pw" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body></html> |