Я думаю, что (почти) понимаю, как карта работает в схеме, но мне трудно понять, как работает этот код:
(map (lambda (x y z) (y x z))
(list 1 2 3 4) (list + - * /) (list 5 6 7 8))
Что на самом деле происходит внутри этой процедуры?
Я думаю, что (почти) понимаю, как карта работает в схеме, но мне трудно понять, как работает этот код:
(map (lambda (x y z) (y x z))
(list 1 2 3 4) (list + - * /) (list 5 6 7 8))
Что на самом деле происходит внутри этой процедуры?
У нас есть map
, который получает несколько списков (в данном случае три), и процедура, которая их обрабатывает, беря по одному элементу из каждого за раз:
(map (lambda (x y z) (y x z))
(list 1 2 3 4)
(list + - * /)
(list 5 6 7 8))
Ключом к пониманию этого является то, что происходит в теле lambda
, которому передается один элемент из каждого списка по порядку, а затем выполняется следующее:
(y x z)
Другими словами: мы берем элемент из второго списка (который является процедурой) и применяем его к элементам из первого и третьего списков. Например, для первых трех элементов у нас будет:
(+ 1 5)
И для вторых элементов:
(- 2 6)
И так далее. Как вы знаете, map
построит новый список с результатом применения процедуры ко всем своим входным спискам, поэлементно. В этом примере результатом будет:
'(6 -4 21 1/2)
Что то же самое, что:
(list (+ 1 5) (- 2 6) (* 3 7) (/ 4 8))
map
и lambda
, чтобы понять разницу.
- person Óscar López; 19.03.2015