static Scheme_Object *make_immutable_hash_table(int argc, Scheme_Object *argv[]) { Scheme_Object *l = argv[0], *a; Scheme_Hash_Table *ht; if (scheme_proper_list_length(l) >= 0) { for (; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { a = SCHEME_CAR(l); if (!SCHEME_PAIRP(a)) break; } } if (!SCHEME_NULLP(l)) scheme_wrong_type("make-immutable-hash-table", "list of pairs", 0, argc, argv); if (argc > 1) { if (!SAME_OBJ(equal_symbol, argv[1])) scheme_wrong_type("make-immutable-hash-table", "'equal", 1, argc, argv); ht = scheme_make_hash_table_equal(); } else ht = scheme_make_hash_table(SCHEME_hash_ptr); for (l = argv[0]; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { a = SCHEME_CAR(l); scheme_hash_set(ht, SCHEME_CAR(a), SCHEME_CDR(a)); } SCHEME_SET_IMMUTABLE((Scheme_Object *)ht); return (Scheme_Object *)ht; }
static Scheme_Object * length_prim (int argc, Scheme_Object *argv[]) { int l; if (!SCHEME_LISTP(argv[0])) scheme_wrong_type("length", "proper list", 0, argc, argv); l = scheme_proper_list_length(argv[0]); if (l < 0) scheme_wrong_type("length", "proper list", 0, argc, argv); return scheme_make_integer(l); }
Scheme_Object * scheme_list_to_vector (Scheme_Object *list) { intptr_t len, i; Scheme_Object *vec, *orig = list; len = scheme_proper_list_length(list); if (len < 0) scheme_wrong_contract("list->vector", "list?", -1, 0, &orig); vec = scheme_make_vector(len, NULL); for (i = 0; i < len; i++) { SCHEME_VEC_ELS(vec)[i] = SCHEME_CAR(list); list = SCHEME_CDR(list); } return vec; }