+/*
+ LISTS
+ */
+
+/* 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 && scm_is_pair (scm_cdr (l)))
+ l = scm_cdr (l);
+ return scm_car (l);
+}
+
+
+SCM
+ly_deep_copy (SCM src)
+{
+ if (scm_is_pair (src))
+ return scm_cons (ly_deep_copy (scm_car (src)), ly_deep_copy (scm_cdr (src)));
+ else if (scm_is_vector (src))
+ {
+ int len = scm_c_vector_length (src);
+ SCM nv = scm_c_make_vector (len, SCM_UNDEFINED);
+ for (int i = 0;i < len; i++)
+ {
+ SCM si = scm_from_int (i);
+ scm_vector_set_x (nv, si, ly_deep_copy (scm_vector_ref (src, si)));
+ }
+ }
+ return src;
+}
+
+