Как с ++ для цикла меняется на схему

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))

пожалуйста, напишите правильный код схемы ….

0

Решение

Вот прямой перевод на do цикл:

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

Тем не менее, многие находки 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))

Yay макросы! Выберите версию, которая вам нравится больше всего; большинство шамеров, которых я знаю, предпочитают второе.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]