public Expr qq(InterpContext ctx) throws RuntimeError {
		int sl = ctx.qq_level;	// 进入list时保存嵌套层数
		Expr t1 = car.qq(ctx);
		if (t1 == Symbol.QUASI_QUOTE) {
			ctx.enter_qq();
		} else if (t1 == Symbol.UNQUOTE) {
			if (ctx.qq_level > 0)
				ctx.exit_qq();
			else if (ctx.qq_level == 0) {
				// 求值
				if (length(this) != 2)
					throw new RuntimeError("unquote: bad syntax");
				return cadr(this).eval(ctx);
			}
		}
		Expr t2 = cdr.qq(ctx);
		ctx.qq_level = sl;	// 离开list钱恢复嵌套层数
		return cons(t1, t2);
	}