public Expr apply(Expr[] args, InterpContext ctx) throws RuntimeError {
		LetForm let = Unpack(args);

		String previous_name = null;
		for (int i = 0; i < let.values.length; i++) {
			if (previous_name != null) {
				if (previous_name.equals(let.keys[i].value()))
					throw new RuntimeError("let: duplicate identifier");
			} else {
				previous_name = let.keys[i].value();
			}
			let.values[i] = let.values[i].eval(ctx);
		}
		Env init_env = ctx.env.extend(let.keys, let.values);
		return let.body.eval(new InterpContext(init_env));
	}