<br><div class="gmail_quote">On Tue, Dec 7, 2010 at 12:25 AM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org">eli@barzilay.org</a>&gt;</span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Actually, there&#39;s a problem -- there is already an optional argument<br>
for the prefix, and if an output port is added, it should be added<br>
before that for consistency but that will be incompatible.</blockquote><div><br></div><div>That&#39;s unfortunate.  Looking at v4.2.5 I did not see the input-prefix param, so that&#39;s probably added in v5.0.  I guess it&#39;s either be a new name (something like regexp-replace*/out and regexp-replace/out) or added after the prefix. </div>
<div><br></div><div>I did a quick proof of concept against 4.2.5 (which doesn&#39;t have the inconsistency of input-prefix), and it works AFAICT.  Of course it&#39;s better if this is implemented in the same layer as other regexp functions. </div>
<div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">(define (insert-spec-&gt;callback spec)</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (define (make-substitution matched)</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    (lambda (m . rest)</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      (cond ((bytes=? m #&quot;\\&amp;&quot;) #&quot;&amp;&quot;)</font></div></div></div><div class="gmail_quote">
<div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            ((bytes=? m #&quot;\\\\&quot;) #&quot;\\&quot;)</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            ((bytes=? m #&quot;&amp;&quot;) (car matched))</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            ((= 2 (length rest))</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">             (list-ref matched (string-&gt;number (bytes-&gt;string/utf-8 (cadr rest)))))</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            (else #&quot;&quot;))))</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  (lambda (matched . parts)</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    (regexp-replace* (byte-pregexp #&quot;(\\&amp;|\\\\([0-9]+))&quot;) </font></div></div></div><div class="gmail_quote">
<div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     spec</font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                     (make-substitution (cons matched parts)))))</font></div>
</div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div></div></div><div class="gmail_quote"><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><div>
(define (regexp-replace*/out pat in insert (out #f)) ;; what does #f mean?</div><div>  (define (helper insert) </div><div>    (let loop ((matched (regexp-match pat in 0 #f out)))</div><div>      (unless (not matched) </div>
<div>        (display (apply insert matched) out)</div><div>        (loop (regexp-match pat in 0 #f out)))))</div><div>    (if (input-port? in)</div><div>        (if (output-port? out)</div><div>            (helper (if (procedure? insert)</div>
<div>                        insert</div><div>                        (insert-spec-&gt;callback insert)))</div><div>            (regexp-replace* pat (port-&gt;bytes in) insert))</div><div>        (regexp-replace* pat in insert)))</div>
<div><br></div><div>(define (regexp-replace/out pat in insert (out #f))</div><div>  (define (helper insert)</div><div>    (let ((matched (regexp-match pat in 0 #f out)))</div><div>      (unless (not matched)</div><div>        (display (apply insert matched) out)</div>
<div>        (copy-port in out))))</div><div>  (if (input-port? in)</div><div>      (if (output-port? out)</div><div>          (helper (if (procedure? insert)</div><div>                      insert</div><div>                      (insert-spec-&gt;callback insert)))</div>
<div>          (regexp-replace pat (port-&gt;bytes in) insert))</div><div>      (regexp-replace pat in insert)))</div><div><br></div></font></div></div></div><div class="gmail_quote"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">&gt; (regexp-replace*/out #px&quot;[0-9]+&quot; (open-input-string &quot;1929,1939,1949,1959&quot;) &quot;+\\0&quot; (current-output-port))</font></div>
</div><div class="gmail_quote"><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">+1929,+1939,+1949,+1959</font></div></div></blockquote><div class="gmail_quote"><div><br></div><div>Cheers,</div><div>
yc</div><div><br></div><div><br></div><div> </div></div>