@Override
	public Expr apply(Expr[] args, InterpContext ctx) throws RuntimeError {
		if (args.length < 2)
			throw new RuntimeError("define: bad syntax");
		
		Expr name = null;
		Expr body = null;
		
		// 转换为lambda
		if (args[0] instanceof Pair) {
			name = car(args[0]);
			Expr[] t = Arrays.copyOfRange(args, 1, args.length);
			body = cons(Symbol.LAMBDA, cons(cdr(args[0]), list(t)));
		} else {
			if (args.length != 2)
				throw new RuntimeError("define: bad syntax");
			name = args[0];
			body = args[1];
		}
		
		if (name instanceof Symbol) {
			ctx.env.put((Symbol)name, body.eval(ctx));
			return VOID;
		}
		
		throw new RuntimeError("define: bad syntax");
	}