Карта + лямбда-выражение в схеме

Я думаю, что (почти) понимаю, как карта работает в схеме, но мне трудно понять, как работает этот код:

(map (lambda (x y z) (y x z))
   (list 1 2 3 4) (list + - * /) (list 5 6 7 8))

Что на самом деле происходит внутри этой процедуры?


person user16655    schedule 17.03.2015    source источник


Ответы (1)


У нас есть 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))
person Óscar López    schedule 17.03.2015
comment
Большое спасибо за объяснение! Можно ли вызвать лямбда-выражение напрямую без карты? - person user16655; 19.03.2015
comment
@ user16655, конечно, но он получит только три параметра и явно не вернет список элементов. Вы должны прочитать документацию map и lambda, чтобы понять разницу. - person Óscar López; 19.03.2015