@define mkzas(len){ @local dispatch, str, map; str = mkstr(len); map = vector(mkrange(0,len)); @define dispatch(args ...) { @local arg, range, new, beg, end; arg = listref(args, 1); if(arg == "get"){ range = listref(args, 2); beg = rangebeg(range); end = beg+rangelen(range); printf("get %x %x\n", beg, end); return substr(str, beg, end); } if(arg == "put"){ range = listref(args, 2); beg = rangebeg(range); end = beg+rangelen(range); new = listref(args, 3); strput(str, beg, new); printf("put %x %x\n", beg, end); return; } if(arg == "map") return map; if(arg == "ismapped"){ range = listref(args, 2); beg = rangebeg(range); end = beg+rangelen(range); /* this logic is less than correct */ if(end <= len) return 1; else return 0; } printf("bad argument to dispatch!\n"); } return mkas([ "dispatch" : dispatch ]); } dom = mkdom(c32le, mkzas(1024)); p = (char*){dom}0; p[0] = 'h'; p[1] = 'e'; p[2] = 'l'; p[3] = 'l'; printf("%s\n", p);