(define (sort-by-difficulty args pos-list)
  (iterate loop ((args args) (do-now '()) (trivial '()) (do-later '())
                 (pos-list pos-list))
    (cond ((null? args)
           (return do-now trivial do-later))
          ((lambda-node? (car args)) 
           (let ((l (car args)))
             (cond ((eq? (environment-closure (lambda-env l)) *unit*)
                    (loop (cdr args)
                          do-now
                          trivial
                          (cons (cons l (car pos-list)) do-later)
                          (cdr pos-list)))
                   (else
                    (loop (cdr args)
                          do-now
                          (cons (cons l (car pos-list)) trivial)
                          do-later
                          (cdr pos-list))))))
          ((addressable? (leaf-value (car args)))
           (loop (cdr args)
                 do-now
                 (cons (cons (car args) (car pos-list)) trivial)
                 do-later
                 (cdr pos-list)))
          (else
           (let* ((val (leaf-value (car args)))
                  (value (cond ((and (variable? val) (variable-known val))
                               => lambda-self-var)
                              (else val))))
             (cond ((let ((reg (register-loc value))
		          (temp (temp-loc value)))
	   	      (if (and reg temp (eq? temp (car pos-list)))
   			  temp
			  (or reg temp)))   
                    => (lambda (reg)
                         (loop (cdr args)
                               (cons (mover reg (car pos-list))
                                     do-now)
                               trivial
                               do-later
                               (cdr pos-list))))
                   (else
                    (loop (cdr args)
                          do-now
                          trivial
                          (if (fx= (car pos-list) P)
                              (append! do-later (list (cons value (car pos-list))))
                              (cons (cons value (car pos-list)) do-later))
                          (cdr pos-list)))))))))