+ return ok;
+}
+
+
+/* some SCM abbrevs
+
+ zijn deze nou handig?
+ zijn ze er al in scheme, maar heten ze anders? */
+
+
+/* Remove doubles from (sorted) list */
+SCM
+ly_unique (SCM list)
+{
+ SCM unique = SCM_EOL;
+ for (SCM i = list; ly_c_pair_p (i); i = ly_cdr (i))
+ {
+ if (!ly_c_pair_p (ly_cdr (i))
+ || !ly_c_equal_p (ly_car (i), ly_cadr (i)))
+ unique = scm_cons (ly_car (i), unique);
+ }
+ return scm_reverse_x (unique, SCM_EOL);
+}
+
+
+static int
+scm_default_compare (void const *a, void const *b)
+{
+ SCM pa = *(SCM*) a;
+ SCM pb = *(SCM*) b;
+ if (pa == pb)
+ return 0;
+ return pa < pb ? -1 : 1;
+}
+
+/* Modify LST in place: qsort it. */
+SCM
+ly_list_qsort_uniq_x (SCM lst)
+{
+ int len = scm_ilength (lst);
+ SCM *arr = new SCM[len];
+ int k = 0;
+ for (SCM s = lst; SCM_NNULLP (s); s = SCM_CDR (s))
+ arr[k++] = SCM_CAR (s);
+
+ assert (k == len);
+ qsort (arr, len, sizeof (SCM), &scm_default_compare);
+
+ SCM *tail = &lst;
+ for (int i = 0; i < len; i++)
+ if (!i || arr[i] != arr[i - 1])
+ {
+ SCM_SETCAR (*tail, arr[i]);
+ tail = SCM_CDRLOC (*tail);
+ }
+
+ *tail = SCM_EOL;
+ delete[] arr;
+
+ return lst;
+}
+
+
+/* tail add */
+SCM
+ly_snoc (SCM s, SCM list)
+{
+ return ly_append2 (list, scm_list_n (s, SCM_UNDEFINED));
+}
+
+/* Split list at member s, removing s.
+ Return (BEFORE . AFTER) */
+SCM
+ly_split_list (SCM s, SCM list)
+{
+ SCM before = SCM_EOL;
+ SCM after = list;
+ for (; ly_c_pair_p (after);)
+ {
+ SCM i = ly_car (after);
+ after = ly_cdr (after);
+ if (ly_c_equal_p (i, s))
+ break;
+ before = scm_cons (i, before);
+ }
+ return scm_cons ( scm_reverse_x (before, SCM_EOL), after);
+
+}
+
+
+void
+taint (SCM *)
+{
+ /*
+ nop.
+ */
+}
+
+/*
+ display stuff without using stack
+ */
+SCM
+display_list (SCM s)
+{
+ SCM p = scm_current_output_port ();
+
+ scm_puts ("(", p);
+ for (; ly_c_pair_p (s); s =ly_cdr (s))
+ {
+ scm_display (ly_car (s), p);
+ scm_puts (" ", p);
+ }
+ scm_puts (")", p);
+ return SCM_UNSPECIFIED;
+}
+
+Slice
+int_list_to_slice (SCM l)
+{
+ Slice s;
+ s.set_empty ();
+ for (; ly_c_pair_p (l); l = ly_cdr (l))
+ if (ly_c_number_p (ly_car (l)))
+ s.add_point (ly_scm2int (ly_car (l)));
+ return s;
+}
+
+/* Return I-th element, or last elt L. If I < 0, then we take the first
+ element.
+
+ PRE: length (L) > 0 */
+SCM
+robust_list_ref (int i, SCM l)
+{
+ while (i-- > 0 && ly_c_pair_p (ly_cdr (l)))
+ l = ly_cdr (l);
+ return ly_car (l);