>>759
なるほど、named letってのがあるんですか
しかし素直にfもこのform内で束縛してしまおうとすれば余分な引数(fはfoo内で変化しない)が増えて
foo2の呼び出しが3引数になってしまうのが嫌ですね
かといって以下のコードのようにletを入れ子にするのもダサいですし

(define (foo from to)
        (let ((f (if (< from to)
                          - +)))
          (let foo2 ((n to)
                     (r ()))
            (if (= n from)
                (cons from r)
                (foo2 (f n 1) (cons n r))))))

>>760
処理系はgaucheで、見易さ優先でおながいします
この例だと末尾再帰の最適化さえあれば速度に大差はでない気がするので