newlisp quick sort增强

增加一个函数extract作为参数,可以通过extract提取list某个元素的某个属性然后进行比较,而不是假定list中的每个元素都是简单的symbol,并且可以比较。这样就可以允许用在实际工作中。

;; @arg extract is a function to extract value from object to compare with key
(define (quick-sort-ex start end extract)
  (if (>= start end)
      (begin
;;	(println "return")
	)
      (begin
	(letn (first-idx start
			 last-idx end
			 key (extract (values first-idx))
			 )
	  ;; (println "key: " key)
	  ;; (println "fist-idx: " first-idx)
	  ;; (println "last-idx: " last-idx)
	  (while (< first-idx last-idx)
	    (while (and (< first-idx last-idx)
			(>= (extract (values last-idx)) key)
			)
	      (-- last-idx)
	      )
	    (swap (values first-idx) (values last-idx))
	    (while (and (< first-idx last-idx)
			(<= (extract (values first-idx)) key)
			)
	      (++ first-idx)
	      )
	    (swap (values first-idx) (values last-idx))
	    )
	  (quick-sort-ex start (- first-idx 1) extract)
	  (quick-sort-ex (+ first-idx 1) end extract)
	  )
	)
      )
  )


调用代码如下:

(define (extract value)
  ((file-info value) 6)
  )

(define (find-delete-files files delete-size)
  (quick-sort-ex 0 (- (length values) 1) extract)
  )

假定list中每个元素都是string,表示文件路径。通过extract取出文件对应的最后修改时间,用这个时间参与排序比较。

结果是list中的文件将按照最后修改时间排序,越早修改的,就越在前面。

你可能感兴趣的:(NewLisp)