схема основного цикла - PullRequest
       23

схема основного цикла

3 голосов
/ 01 января 2011

Я пытаюсь написать функцию func, которая ведет себя подобно циклу.

(цикл min max func)

Этот цикл должен выполнять функцию между диапазоном min и max (целые числа)

- один из таких примеров

(loop 3 6 (lambda (x) (display (* x x)) (newline)))

9
16
25
36

и я определяю функцию как

( define ( loop min max fn)
    (cond
        ((>= max min) ( ( fn min ) ( loop (+ min 1 ) max fn)  ) )
    )
)

, когда я запускаю код, я получаю результат, и возникает ошибка.Я не мог справиться с этой ошибкой.

(loop 3 6 (lambda (x) (display(* x x))(newline)))

9
16
25
36

Backtrace:
In standard input:
  41:  0* [loop 3 6 #<procedure #f (x)>]

In utku1.scheme:
   9:  1  (cond ((>= max min) ((fn min) (loop # max fn))))
  10:  2  [#<unspecified> ...
  10:  3*  [loop 4 6 #<procedure #f (x)>]
   9:  4   (cond ((>= max min) ((fn min) (loop # max fn))))
  10:  5   [#<unspecified> ...
  10:  6*   [loop 5 6 #<procedure #f (x)>]
   9:  7    (cond ((>= max min) ((fn min) (loop # max fn))))
  10:  8    [#<unspecified> ...
  10:  9*    [loop 6 6 #<procedure #f (x)>]
   9: 10     (cond ((>= max min) ((fn min) (loop # max fn))))
  10: 11     [#<unspecified> #<unspecified>]

**utku1.scheme:10:31: In expression `((fn min) (loop # max ...))`:
    utku1.scheme:10:31:Wrong type to apply: `#<unspecified>`
ABORT: (misc-error)**

Ответы [ 2 ]

5 голосов
/ 01 января 2011

Каждое предложение выражения cond имеет форму ( cond expr1 expr2 ... ), но вы заключили оба выражения expr1 и expr2 в парены, когда они должны быть разделены.Решением будет либо указать begin в начале: ((>= max min) (begin expr1 expr2)), либо сделать begin неявным: ((>= max min) expr1 expr2).

В качестве альтернативы может иметь смысл использовать оператор when вместо cond, поскольку у вас есть только один выбор:

(define (loop min max fn)
  (when (>= max min)
    (fn min)
    (loop (+ min 1) max fn)))

Поскольку оба cond и when - это макросы, использующие if, обе версии в любом случае становятся

(define (loop min max fn)
  (if (>= max min)
    (begin (fn min) (loop (+ min 1) max fn))
    (void)))

.

2 голосов
/ 01 января 2011
( ( fn min ) ( loop (+ min 1 ) max fn) )

Это проблема. То, что вы хотите сделать, это выполнить (fn min), а затем (loop (+ min 1 ) max fn) впоследствии. На самом деле он выполняет (fn min), затем (loop (+ min 1 ) max fn), а затем пытается применить результат (fn min) к результату (loop (+ min 1 ) max fn). Поскольку результат (fn min) не является функцией, это ошибка.

Чтобы получить то, что вы хотите, выполните ( begin (fn min) (loop (+ min 1) max fn) ). begin позволяет выполнять несколько выражений друг за другом.

...