+static void appl_NTH ()
+{
+ assert (cf->args.len == 2);
+ int ix;
+ switch (cf->args.body[0].type)
+ {
+ case EVALTYPE_FIX32:
+ case EVALTYPE_FIX64:
+ ix = cf->args.body[0].fix64.val.n;
+ assert ((uint64_t)ix == cf->args.body[0].fix64.val.n);
+ break;
+ default:
+ assert (0 && "tried to NTH a strange index type?");
+ }
+ switch (cf->args.body[1].type)
+ {
+ case EVALTYPE_VECTOR:
+ assert (ix < cf->args.body[1].vector.val.len);
+ RETURN (HEAP_OBJECT (cf->args.body[1].vector.val.body)[ix]);
+ case EVALTYPE_UVECTOR:
+ assert (ix < cf->args.body[1].uvector.val.len);
+ RETURN (uv_get (&cf->args.body[1].uvector, ix));
+ case EVALTYPE_LIST:
+ {
+ pool_ptr p = cf->args.body[1].list.val.head;
+ for (int i=0; i<ix; i++) {
+ assert (p);
+ p = POOL_OBJECT (p)->rest;
+ }
+ assert (p);
+ RETURN (*(object*)POOL_OBJECT (p));
+ }
+ }
+ assert (0 && "tried to NTH a strange collection type?");
+}
+
+void subr_NTH ()
+{
+ eval_arg ()? : appl_NTH ();
+}
+