c ++ for循环如何变为scheme

时间:2014-04-04 16:17:29

标签: c++ scheme

C ++

int loop(int x, int y, int z) {
     int result = 0;
     for ( int i = x; i < y; i+=z ) { result += i; }
     return result; }

我只是按计划

尝试
(letrec ((my-loop (lambda (a b c)
  (begin
    (let ((i a) (s 0))
    (if (< i b)
          (set! s (+ s i)) s))))))(my-loop (+ a c) b c))

请写出正确的方案代码....

1 个答案:

答案 0 :(得分:3)

以下是对do循环的直接翻译:

(define (foo x y z)
  (do ((result 0 (+ result i))
       (i x (+ i z)))
      ((>= i y) result)))

然而,许多Schemer发现do循环令人反感。所以这是一个使用命名let的相同循环,这实际上是do可能扩展到的内容:

(define (foo x y z)
  (let loop ((result 0)
             (i x))
    (if (>= i y)
        result
        (loop (+ result i) (+ i z)))))

可能会扩展为:

(define (foo x y z)
  ((rec (loop result i)
     (if (>= i y)
         result
         (loop (+ result i) (+ i z))))
   0 x))

然后扩展为:

(define (foo x y z)
  ((letrec ((loop (lambda (result i)
                    (if (>= i y)
                        result
                        (loop (+ result i) (+ i z))))))
     loop)
   0 x))

耶的宏!选择你最喜欢的版本;我知道的大多数Schemer更喜欢第二个。