aboutsummaryrefslogtreecommitdiffstats
path: root/csc/sort.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-01-11 22:01:23 -0800
committerRose Hogenson <rhogenson@posteo.net>2022-01-11 22:01:23 -0800
commit68986fe0410584c6934c835bb0ee784655f5f8c5 (patch)
treed51bc2f3e09df35ef81b7a0c462ff555b4344701 /csc/sort.csc
parent4fc8b3c1c9dc4aa730e471708dcab7aed68f5a4b (diff)
downloadchromatopelma-68986fe0410584c6934c835bb0ee784655f5f8c5.tar.zst
Move scheme compiler into a separate directory.
Diffstat (limited to 'csc/sort.csc')
-rw-r--r--csc/sort.csc24
1 files changed, 24 insertions, 0 deletions
diff --git a/csc/sort.csc b/csc/sort.csc
new file mode 100644
index 0000000..62b1c9d
--- /dev/null
+++ b/csc/sort.csc
@@ -0,0 +1,24 @@
+(define-library (csc sort)
+ (export sort)
+ (import (scheme base)
+ (only (csc list)
+ revappend
+ split-at))
+ (begin
+
+
+ (define (sort cmp xs)
+ (let ((len (length xs)))
+ (if (<= len 1)
+ xs
+ (let-values (((half-a half-b) (split-at (truncate-quotient len 2) xs)))
+ (let ((sorted-half-a (sort cmp half-a))
+ (sorted-half-b (sort cmp half-b)))
+ (let loop ((a sorted-half-a)
+ (b sorted-half-b)
+ (acc '()))
+ (cond ((null? a) (revappend acc b))
+ ((null? b) (revappend acc a))
+ ((cmp (car b) (car a))
+ (loop a (cdr b) (cons (car b) acc)))
+ (else (loop (cdr a) b (cons (car a) acc))))))))))))