<html><body><div style="color:#000; background-color:#fff; font-family:verdana, helvetica, sans-serif;font-size:10px"><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">I think it would desirable to add a 'where clause' to the</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">match module (it could be implemented as a keyword argument:</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">#:where (test).</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">Below are versions and an insertion sort algorithm from</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><http://rosettacode.org/wiki/Sorting_algorithms/Insertion_sort></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">First a Qi version, then an Erlang version, followed by a proposed</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">Racket version with a 'where clause', a failed attempt at writing</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">a Racket version with a predicate clause, and finally a practical</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(at the present time) Racket version of the algorithm.</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">I'm not an experienced programmer but I am intrigued by pattern</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">matching and have glanced at pattern matching capabilities in</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">a variety of functional languages.</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">I'd appreciate comments on whether this feature is considered</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">desirable/feasible in Racket.</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font id="yui_3_16_0_1_1414173078068_3331" face="Courier New, courier, monaco, monospace, sans-serif">Qi version of insertion sort using 'where clause':</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define insert</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  X []       -> [X]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3338">  X [Y | Ys] -> [X Y | Ys] where (<= X Y)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3346">  X [Y | Ys] -> [Y | (insert X Ys)])</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"> </font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define insertion-sort</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  []       -> []</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3339">  [X | Xs] -> (insert X (insertion-sort Xs)))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"> </font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(insertion-sort [6 8 5 9 3 2 1 4 7])</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">Erlang version on same web page using 'when clause':</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">-module(sort).</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">-export([insertion/1]).</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"> </font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">insertion(L) -> lists:foldl(fun insert/2, [], L).</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">insert(X, [])                      -> [X];</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">insert(X, L = [H | _]) when X =< H -> [X | L];</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">insert(X, [H | T])                 -> [H | insert(X, T)].</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3340">> sort:insertion([5,3,9,4,1,6,8,2,7]).</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">Proposed Racket version (based on the Erlang example)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">uses #:where keyword:</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define/match (insert X lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X '() }                          (list X)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3341">  [{ X (cons H T) } #:where (<= X H)  (list* X H T)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X (cons H T) }                   (cons H (insert X T))])</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define (insertion-sort lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  (foldl insert '() lst))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3342">I don't think that a corresponding Racket predicate match</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3343">can be written (I may not have coded it correctly!)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">It's also messy:</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define/match (insert-b X lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X                                 '() }      (list X)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3344">  [{ X (and (cons H T) (? (λ (H X) (<= X H)))) }  (list* X H T)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X (cons H T) }                               (cons H (insert-b X T))])</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define (insertion-sort-b lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  (foldl insert-b '() lst))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(insertion-sort-b '(6 8 5 9 3 2 1 4 7))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">Current working Racket version</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif" id="yui_3_16_0_1_1414173078068_3345">(modified slightly from the posted Racket version)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">It's necessarily missing the third match pattern:</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define/match (insert-c X lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X '() }         (list X)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  [{ X (cons H T) }  (cond [(<= X H) (list* X H T)]</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">                           [else (cons H (insert-c X T))])])</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(define (insertion-sort-c lst)</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">  (foldl insert-c '() lst))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif">(insertion-sort-c '(6 8 5 9 3 2 1 4 7))</font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><font face="Courier New, courier, monaco, monospace, sans-serif"><br class="" style=""></font></div><div id="yui_3_16_0_1_1414173078068_2183" class="" style=""><br class="" style=""></div></div></body></html>