Несколько разных ошибок в схеме - PullRequest
0 голосов
/ 25 февраля 2020

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

Метод № 1:

; Returns the roots of the quadratic formula, given
; ax^2+bx+c=0. Return only real roots. The list will
; have 0, 1, or 2 roots. The list of roots should be
; sorted in ascending order.
; a is guaranteed to be non-zero.
; Use the quadratic formula to solve this.
; (quadratic 1.0 0.0 0.0) --> (0.0)
; (quadratic 1.0 3.0 -4.0) --> (-4.0 1.0)
(define (quadratic a b c)
  (if
  (REAL? (sqrt(- (* b b) (* (* 4 a) c))))
  ((let ((X (/ (+ (* b -1) (sqrt(- (* b b) (* (* 4 a) c)))) (* 2 a)))
        (Y (/ (- (* b -1) (sqrt(- (* b b) (* (* 4 a) c)))) (* 2 a))))
     (cond
        ((< X Y) (CONS X (CONS Y '())))
        ((> X Y) (CONS Y (CONS X '())))
        ((= X Y) (CONS X '()))

   )))#f)

Error: 
assertion-violation: attempt to call a non-procedure [tail-call]
                     ('(0.0) '())
1>
assertion-violation: attempt to call a non-procedure [tail-call]
                     ('(-4.0 1.0) '())

Я не уверен, что он пытается вызвать. (0.0) и (-4.0 1.0) - мой ожидаемый результат, поэтому я не знаю, что он пытается сделать.

Метод № 2:

;Returns the list of atoms that appear anywhere in the list,
;including sublists
; (flatten '(1 2 3) --> (1 2 3)
; (flatten '(a (b c) ((d e) f))) --> (a b c d e f)
(define (flatten lst)
        (cond
          ((NULL? lst) '())
          ((LIST? lst) (APPEND (CAR lst) (flatten(CDR lst))))
          (ELSE (APPEND lst (flatten(CDR lst))))
        )
)
Error: assertion-violation: argument of wrong type [car]
                     (car 3)
3>
assertion-violation: argument of wrong type [car]
                     (car 'a)

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

Метод # 3

; Returns the value that results from:
; item1 OP item2 OP .... itemN, evaluated from left to right:
; ((item1 OP item2) OP item3) OP ...
; You may assume the list is a flat list that has at least one element
; OP - the operation to be performed
; (accumulate '(1 2 3 4) (lambda (x y) (+ x y))) --> 10
; (accumulate '(1 2 3 4) (lambda (x y) (* x y))) --> 24
; (accumulate '(1) (lambda (x y) (+ x y))) --> 1
(define (accumulate lst OP)
    (define f (eval OP (interaction-environment)))
    (cond
        ((NULL? lst) '())
        ((NULL? (CDR lst)) (CAR lst))
        (ELSE (accumulate(CONS (f (CAR lst) (CADR lst)) (CDDR lst)) OP))
    )
)

Error:
syntax-violation: invalid expression [expand]
                  #{procedure 8664}
5>
syntax-violation: invalid expression [expand]
                  #{procedure 8668}
6>
syntax-violation: invalid expression [expand]
                  #{procedure 8672}
7>
syntax-violation: invalid expression [expand]
                  #{procedure 1325 (expt in scheme-level-1)}

Я не знаю, что это значит, что такое расширение?

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 25 февраля 2020
  1. код имеет (let () ...), что явно оценивается как list?, поэтому дополнительные скобки кажутся странными. ((let () +) 1 2) ; ==> 3 работает, потому что let оценивает процедуру, но если вы попробуете ((cons 1 '()) 1 2), вы получите сообщение об ошибке, похожее на application: (1) is not a procedure, поскольку (1) не процедура. Также знайте, что нечувствительность к регистру не рекомендуется, так что CONS и REAL? не являются доказательством на будущее.

  2. append объединяет списки. Они должны быть списками. В else вы знаете, поскольку lst не является list?, что lst не может быть аргументом append. cons может быть то, что вы ищете. Поскольку списки - это волшебные абстракции c в схеме, я призываю вас освоиться с парами. Когда я читаю (1 2 3), я вижу (1 . (2 . (3 . ()))) или, возможно, (cons 1 (cons 2 (cons 3 '()))), и вы тоже должны.

  3. eval совершенно неуместно в этом коде. Если вы передаете (lambda (x y) (+ x y)), который оценивает процедуру, в OP, вы можете сделать (OP 1 2). Используйте OP напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...