Писане на функция за рекурсивно изброяване в схема

Пиша функция за рекурсивно изброяване и някъде имам проста грешка.

Ето какво трябва да се случи:

(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
Когато казах ('(стоп)), имах предвид списък с един елемент: аргументът stop (== 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: можете също да използвате quasiquote синтаксис: `(,stop), въпреки че (list stop) е по-ясен. - person outis; 27.08.2011