Проблема с вашим кодом заключается в том, что вы передаете параметры в неправильном порядке - при использовании cons
для создания списка первый параметр - это новый элемент, который мы хотим придерживаться в начале списка, и второй - список, который мы создали до сих пор.
Сказав, что, изменив список, используя foldl
немного проще, и вам не нужно использовать append
вообще - на самом деле, это плохая практика использования append
когда cons
хватает:
(define (rvsl sequence)
(foldl cons
'()
sequence))
Почему это работает? давайте перепишем функцию быть более четко на этот раз:
(define (rvsl sequence)
(foldl (lambda (current accumulated)
(cons current accumulated))
'()
sequence))
Теперь мы можем видеть, что lambda
процедуры получает два параметра: current
элемента в списке ввода, а значение accumulated
до сих пор - хорошие имена параметров делают все разница в мире! это намного, гораздо яснее, чем вызов параметров x
и y
, в которых ничего не говорится о них.
В этом случае мы просто хотим, чтобы cons
текущий элемент в начале накопленного значения (который начинается как пустой список), следовательно, создавая в качестве выходного списка обратный список. Учитывая, что процедура lambda
получает два параметра и передает их в том же порядке, что и cons
, мы можем упростить все это и просто передать процедуру cons
в качестве параметра.
Просто используйте '(cons x y)' вместо '(cons y x)'. –
Вы определили rvsl для принятия двух аргументов и только передали его, когда вы его использовали.Вы можете передать либо два аргумента с самого начала, либо создать другую процедуру, которая передаст правильное количество аргументов в rvsl. – malisper