'(f (a) f (b) f (c) f (d))
есть и может быть (f (a) f (b) f (c) f (d))
только после оценки.
map
для одного аргумента списка можно определить так:
(define (map1 fn lst)
(if (null? lst)
'()
(cons (fn (car lst))
(map1 fn (cdr lst)))))
и (map add1 '(1 2 3))
можно заменить на
(cons (add1 '1)
(cons (add1 '2)
(cons (add1 '3)
'())))
; ==> (2 . (3 . (4 . ())))
; ==> (2 3 4)
Теперь map
занимаетпо крайней мере один аргумент списка, и он ожидает, что переданная функция будет принимать один или каждый.Таким образом, (map * '(1 2) '(1 2))
- это то же самое, что и
(cons (* '1 '1)
(cons (* '2 '2)
'()))
; ==> (1 . (4 . ()))
; ==> (1 4)
Я не совсем уверен, что у вас возникли проблемы с пониманием map
или как составляются списки.Если это последнее, вы должны сделать его главным приоритетом, чтобы видеть (1 2 (3 4))
и понимать, что 3
- это caaddr
, поскольку пары (1 . (2 . ((3 . (4 . ())) . ())))
.Прочтите это справа налево, глядя на пары, и вы увидите это.Если это map
, то вам нужно их реализовать.Это лучший способ узнать это.