Если я хочу перевернуть список в схеме MIT, я могу сделать это с помощью (fold cons '() list)
, так что если список равен (define lis '(1 2 3 4))
, то (fold cons '() lis)
дает (4 3 2 1)
. Есть два вида сгибов, левый и правый, но если я использую (fold-right cons '() lis)
, я получаю (1 2 3 4)
, так что простой сгиб не может быть таким. Кроме того, если я использую (fold-left cons '() lis)
, я получаю ((((() . 1) . 2) . 3) . 4)
, так что это также не может быть сгибом в исходном примере. какая складка нужна, чтобы перевернуть список?
Я спрашиваю, потому что хочу иметь возможность сделать общую складку, чтобы:
(define ls '((1 2 3) (4 5 6)))
(gen-fold cons '() ls)
=> ((6 5 4) (3 2 1))
(define l2 '(((1 2) (2 3)) ((3 4) (4 5))))
(gen-fold cons '() ls)
=> (((5 4) (4 3)) ((3 2) (2 1)))
Редактировать: чтобы лучше представить вопросы, на этих диаграммах показано вращение списка, которое, как я считаю, происходит, когда вызывается '(fold cons '() '(1 2 3))
, предполагая, что fold
является модифицированным fold-left
в соответствии с Алексисом Кингом:
(define lis (list '(1 2 3)) cons / \ 1 cons / \ 2 cons / \ 3 '() (cons lis '()) cons / \ cons '() / \ 1 cons / \ 2 cons / \ 3 '() (fold-left (cons lis '())) cons / \ cons cons / \ / \ 2 cons 1 '() / \ 3 '() cons / \ cons cons / \ / \ 3 '() 2 cons / \ 1 '() cons / \ 3 cons / \ 2 cons / \ 1 '()
fold
, толькоfold-left
иfold-right
. Единственный полу-встроенныйfold
, о котором я могу думать, это SRFI-1. Включаете ли вы что-нибудь, что могло бы ввести определение дляfold
? - person Alexis King   schedule 04.11.2015(fold cons '() '(1 2 3))
и получить=> (3 2 1)
без определения fold - person Anandamide   schedule 04.11.2015cons
с перевернутым порядком аргументов }. - person Will Ness   schedule 10.09.2020