Написание функции рекурсивного перечисления на схеме

Я пишу рекурсивную функцию перечисления, и у меня где-то простая ошибка.

Вот что должно произойти:

(enum 1 0.5 2.5)  
> (1.0 1.5 2.0 2.5)

Вот код:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          ('(stop))
          )))

Изменить:
Я получаю сообщение об ошибке (от Impromptu (http://impromptu.moso.com.au/)):

> (print (enum 0 0.5 2.5))  
:ERROR: position:(0) in function "enum"  
illegal function  
Trace: enum  

person amindfv    schedule 27.08.2011    source источник
comment
Какую ошибку вы получаете?   -  person    schedule 27.08.2011


Ответы (1)


Я считаю, что ваша проблема в линии

('(stop))

Я думаю, у вас есть правильное представление о том, что вы хотите прекратить выполнение рекурсии, как только вы дойдете до конца, но это не тот способ сделать это. Поскольку вы поместили это в двойные круглые скобки, это интерпретируется как «вычислить «стоп», а затем попытаться вызвать его как функцию». Однако stop не является функцией, отсюда и ошибка.

Чтобы исправить это, если вы хотите сделать возвращаемое значение списком, содержащим только stop, используйте функцию list:

(define enum
   (lambda (start step stop)
      (if (not (<= stop start))
          (cons start (enum (+ start step) step  stop))
          (list stop)
          )))

Обратите внимание, что здесь только один набор скобок вокруг list stop.

Надеюсь это поможет!

person templatetypedef    schedule 27.08.2011
comment
Когда я сказал ('(стоп)), я имел в виду список с одним элементом: аргумент остановки (== 2.5). Вот почему я сказал ‹= вместо ‹. При этом по какой-то причине меняется на () для else и ‹ для предиката Just Works. Кто-нибудь может сказать, почему? Спасибо! - person amindfv; 27.08.2011
comment
@amindfv- Я понял проблему и обновил этот ответ — вы пытались оценить stop как функцию, добавив дополнительные скобки. Я обновил свой ответ, чтобы отразить это; Вы можете просмотреть его еще раз и посмотреть, объясняет ли он более точно вашу ошибку? - person templatetypedef; 27.08.2011
comment
Спасибо; это как раз то, что я искал. - person amindfv; 27.08.2011
comment
@amindfv: вы также можете использовать квазицитаты синтаксис: `(,stop), хотя (list stop) понятнее. - person outis; 27.08.2011