schemeクイッククッキング

ひっそりとschemeやらhaskellやら微妙に勉強中なのですが、そのあたりの師匠のid:sshi先生が最近http://d.hatena.ne.jp/sshi/20070222/p1でqsortの末尾再帰化ってのを書いてた。

が、なんだか理解できなかったので参考にしながら自分でも書いてみることに。

(define (qsort lst)
  (let qs ((acc '())
	   (current lst)
	   (stack '()))
    (if (null? current)
	(if (null? stack)
	    acc
	    (let ((next (car stack)))
	      (qs (cons (cdr next) acc) (car next) (cdr stack))))
	(let ((x (car current))
	      (xs (cdr current)))
	  (receive (gt le) (partition (lambda (y) (> y x)) xs)
	    (qs acc gt (cons (cons le x) stack)))))))

こういうなじみのあるネタで且つ配列物だとlisp素人でも書きやすくていいですね。
これでnamed-let,多値代入,null?,list?,pair?,partition,trace(slib)を覚えたぞ。

しかし、書いている最中に元コードの意味は理解できたけど、pair?とlist?の使い方はなんかアレゲじゃないでしょうか先生。後 traceだと関数の中で定義した関数やnamed-letを使った時に途中経過を追えないのですが、デバックはどういう風にすればいいのでしょうか先生。

おしえてせんせいさん。