+int
+scm_default_compare (const void * a, const void *b)
+{
+ SCM pa = *(SCM *)a;
+ SCM pb = *(SCM *)b;
+
+ if (pa < pb) return -1 ;
+ else if (pa > pb) return 1;
+ else return 0;
+}
+
+/*
+ modify L in place: sort it
+*/
+
+SCM
+uniquify_list (SCM l)
+{
+ int len = scm_ilength (l);
+ SCM * arr = new SCM[len];
+ int k = 0;
+ for (SCM s =l ; SCM_NNULLP (s); s = SCM_CDR(s))
+ arr[k++] = SCM_CAR(s);
+
+ assert (k == len);
+ qsort (arr, len, sizeof (SCM), &scm_default_compare);
+
+ k = 0;
+ SCM s =l;
+ for (int i = 0; i < len ; i++)
+ {
+ if (i && arr[i] == arr[i-1])
+ continue;
+
+ SCM_SETCAR(s, arr[i]);
+ s = SCM_CDR(s);
+ }
+
+ SCM_SETCDR(s, SCM_EOL);
+
+ return l;
+}