2012-07-09 3 views
1

Новое в схеме здесь. Я пытаюсь скомпилировать функцию схемы, range. Это очень просто - он принимает start, step и stop list L и делает новый список, где каждый элемент = stepAmt + curStep.Невозможно скомпилировать функцию схемы

Например: (диапазон '(0 2 7)) => (0 2 4 6), (диапазон' (2 2 0)) =>()

При попытке компиляции

(define (helper2(start stepAmt stop curStep newList) 
(if (> start stop) 
    '() 
    (if (> (+ stepAmt curStep) stop) 
     newList 
     (helper2 (start stepAmt stop (+ stepAmt curStep) (concat newList (+stepAmt curStep)))))))) 

Я получаю ошибку

некорректные специальную форму: (определить helper2 (начало stepamt остановка curstep NewList) (если ... ... ...))

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

Это функция, которая будет вызывать эту функцию:

(define (example L) 
(let (
    (start (car L)) 
    (curStep (car (cdr L))) 
    (step (car (cdr L))) 
    (stop (car (cdr (cdr L)))) 
    ) 
    (helper2 (start step stop curStep '())) 
) 

)

Все указатели было бы здорово. Я не уверен, что это опечатка или логическая ошибка. Спасибо!

+0

Hi @iaacp. Используйте (helper2 start step stop curStep '() в вашей примерной функции и устраните аналогичную проблему в helper2. В схеме не разрешается вставлять дополнительные скобки. Скобка в (начальный шаг ...) означает: Вызвать функцию, заданную начните с аргументов step ... Обратите внимание, что решение Rajesh не имеет таких круглых скобок. – soegaard

+0

Если у вас есть второй вопрос, отправьте его как отдельный вопрос. – Marcin

ответ

4

Вам не нужно

(define helper2 (some arguments go here) 
    definition goes here) 

но

(define (helper2 some arguments go here) 
    definition goes here) 

Способом вспомнить, что то, что происходит после define, выглядит просто как вызов функции, которую вы определяете. «Вот как бороться с звонком, как (helper2 some arguments go here): ...»

+0

Спасибо.Я исправил ошибки и теперь компилируется, но не работает вполне корректно :) – iaacp

+2

Теперь у вас есть подобная ошибка в теле 'helper2', где вы говорите' (helper2 (start stepAmt ...)) '. Я думаю, что ваш мозг еще не полностью смирился с тем, где скобки идут в Схеме! Вы просто хотите '(helper2 start stepAmt ...)'. Аналогичная проблема (которая может фактически оказаться неудачной) в вашем определении 'example'. –

+0

Вы правы. Я продолжаю делать глупые ошибки. К счастью, у меня есть момент, когда я могу правильно его отладить, поскольку, как мне кажется, все проблемы в круглых скобках исчезли. Спасибо! – iaacp

3

Посмотрите внимательно на то, где вы разместили круглые скобки:

(define helper2(start stepAmt stop curStep newList) ... 

в сравнении

(define (example L) ... 
+0

Agh! Спасибо за это. К сожалению, я все еще получаю та же ошибка компиляции. Вы видите что-нибудь еще? – iaacp

+0

Вы получаете * точно ту же ошибку? Тот, который говорит «Неформованная специальная форма: (определите helper2 (start stepamt stop curstep newlist) (если .... .. ...)) «? Не помните, чтобы сохранить исходный код после его изменения? –

+0

О, я вижу, вы изменили код, но он по-прежнему не правильный. У вас теперь слишком много круглых скобок. –

2

Вы используете DrRacket? Эта работа:

#lang racket 

(define (helper2 start stepAmt stop curStep newList) 
(if (> start stop) 
    '() 
    (if (> (+ stepAmt curStep) stop) 
     newList 
     (helper2 start stepAmt stop (+ stepAmt curStep) (concat newList (+ stepAmt curStep)))))) 

(define (concat l elm) 
    (append l (list elm))) 

(define (example L) 
(let (
    (start (car L)) 
    (curStep (car (cdr L))) 
    (step (car (cdr L))) 
    (stop (car (cdr (cdr L)))) 
    ) 
    (helper2 start step stop curStep '()) 
)) 
Смежные вопросы