protected LetForm Unpack(Expr[] form) throws RuntimeError {
		// 暂时只支持(let bindings expression)这种形式
		if (form.length != 2)
			throw new RuntimeError("let: bad syntax");

		LetForm result = new LetForm();
		result.body = form[1];
		
		if (form[0] == EMPTY_LIST) {
			result.keys = new Symbol[0];
			result.values = new Expr[0];
			return result;
		}
		
		if (!(form[0] instanceof Pair))
			throw new RuntimeError("let: bad binding 1");

		Expr[] bindings = toExprArray(form[0]);
		int size = bindings.length;
		result.keys = new Symbol[size];
		result.values = new Expr[size];

		for (int i = 0; i < size; i++) {
			if (bindings[i] == EMPTY_LIST || !listq(bindings[i]))
				throw new RuntimeError("let: bad binding 2");

			Pair binding = (Pair)bindings[i]; // (name value)

			if (length(binding) != 2)
				throw new RuntimeError("let: bad binding 3");

			if (!(car(binding) instanceof Symbol))
				throw new RuntimeError("let: bad syntax (not an identifier)");
			
			result.keys[i] = (Symbol)car(binding);
			result.values[i] = car(cdr(binding));
		}

		return result;
	}