Я пытаюсь суммировать список, используя изменяемые объекты для задания. let
используется здесь, чтобы позволить мне изменять x
общую сумму и counter
. Я не очень хорошо разбираюсь в схеме, поэтому использую операторы if
для каждого числа в списке lst
:
(define lst (list 1 2 3 4 5))
(let mut ((counter 0))
(let ((x (car lst)))
(if (= counter 4)
x)
(if (= 0 counter)
(+ x (cadr lst)))
(if (= 1 counter)
(display (caddr lst)) ;test
(+ x (caddr lst)))
(if (= 2 counter)
(+ x (caddr lst)))
(set-car! lst (cdr lst))
(mut (+ counter 1))
)
)
однако когда я запускаю код, я получаю сообщение об ошибке
+: contract violation
expected: number?
given: (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))
argument position: 1st
other arguments...:
Однако, когда я проверяю (caddr lst)
, он возвращает 3
, как и ожидалось. Моя проблема заключается в том, почему при запуске caddr
выдает (mcons 2 (mcons 3 (mcons 4 (mcons 5 '()))))
при применении к +
, а когда не применяется, возвращает 3
Я использую R5RS изменить: я опустил некоторые операторы if для краткости
(define ls '(1 2 3 4))
. Осмотрите(car ls)
и(cdr ls)
. Напишите(set-car! ls (cdr ls))
. Осмотрите(car ls)
и(cdr ls)
еще раз. - person molbdnilo   schedule 11.03.2018(if (= counter 4) x)
не совпадает сif x == 4: return x
.) - person molbdnilo   schedule 11.03.2018car
возвращает число, а не ссылку, не так ли? - person Artemis   schedule 11.03.2018