2015-03-17 2 views
-4

Я не могу на всю жизнь узнать, почему этот код вызывает ошибку. Вот ошибка:Ошибка и ошибки

let*: bad syntax (missing body) in: (let* ((tempp2 (p2) (letrec ((mloop (p1 p2) (if (= (length p1) 0)) (else if ((= (length p2) 0) ((set! p2 (pn)) (multiloop (cdr p1) (p2)))) (else (let* ((prod (append (prod) (cons (* (coeff (car p1)) (coeff (car p2))) (+ (expon (car p1)) (expon (car p2)))))))) (set! p2 (cdr p2)) (mloop (p1 p2)) (simplify (sort newone))))))))))

Вот код:

(define multiplyPoly (lambda (p1 p2) 
       (
        (let* ((hardp2 (p2) 
       (letrec 
        ((mloop (p1 p2) 
         (if (= (length p1) 0)) 
         (else if ((=(length p2) 0) ((set! p2 (hardp2)) (multiloop (cdr p1) (p2)))) 
        (else 
        (let* ([prod (append (prod) (cons(*(coeff(car p1)) (coeff(car p2))) (+(expon(car p1)) (expon(car p2)))))])) 
         (set! p2 (cdr p2)) 
          (mloop (p1 p2)) 
         (simplify (sort newone))))))))))))) 

ответ

3

У вас есть много синтаксических ошибок в коде. Я настоятельно рекомендую вам установить IDE, которая соответствует совпадению круглых скобок и правильно идентифицировать ваш код, например DrRacket. DrRacket поддерживает как R5RS, так и R6RS, поэтому вы можете программировать на схеме с помощью DrRacket.

Обычно let, let* и letrec имеет следующий вид:

(let ((var expression) ...) 
    body) 

В letrec или letrec* выражение выглядит (lambda (arg ...) expression).

Если взять любое выражение Scheme как (if (positive? x) - +) и окружают их с дополнительной парой круглых скобок вы вызываете результат как procecdure: ((if (positive? -1) - +)) ; ==> 0

An if работает так:

(if predicate-expression 
    consequent-expression 
    alternative-expression) 

Если вы вам нужно вложить вложенное, если в качестве альтернативного выражения.

(if predicate-expression 
    consequent-expression 
    (if predicate-expression2 
     consequent-expression2 
     alternative-expression)) 

Если вы гнездились, возможно, было бы лучше совпадение. Выше выражение может быть записано:

(cond (predicate-expression consequent-expression) 
     (predicate-expression2 consequent-expression) 
     (else alternative-expression)) 

else имеет особое значение в cond, так что это не то, что работает сама по себе.

+0

Я плохо разбираюсь в общих примерах. У вас есть какие-то особенности? Почему считается, что нет тела? –

+0

@ZackSchwartz Поскольку выражение 'let' содержит только привязку имени. Он также требует тела, которое является значением выражения. '(let ((x 5) (y 3)) (+ x y))' оценивается до 8, но '(let ((x 5) (y 3)))' недействительно. Кажется, вы пытаетесь написать C и рассматривать «let'-варианты как блоки объявления переменных. Это не так, как работает Scheme, и ваш лучший способ действий, вероятно, забыть то, что вы уже знаете о программировании, и начать переучивание, написав более мелкие программы Scheme, чем это. И не используйте 'set!'. – molbdnilo

+0

Так как я могу объявить переменные? –

 Смежные вопросы

  • Нет связанных вопросов^_^