2015-03-19 5 views
-1
(define a1 (list 1 2 3 4)) 
(define a2 (list + - * /)) 
(define a3 (list 5 6 7 8)) 
(map (lambda (x y z) (y x z)) 
a1 a2 a3) 

Как я могу назвать эту функцию лямбда напрямую, не используя карту? Все это делает переключение у и х, так что (1 + 5) становится (+ 1 5)Вызов функции лямбда напрямую

+0

На каком языке это? –

+0

Схема (R5RS), извините за то, что она не стала более понятной. –

ответ

0

Как вы, наверное, знаете, вызвать функцию в схеме вы пишете (f args), где f является функцией и args является список аргументов. Это не отличается от того, является ли f названной функцией или лямбдой. Таким образом, чтобы позвонить своему лямбда-функции непосредственно, вы бы написать:

;(-----------f------------ args-) 
((lambda (x y z) (y x z)) 1 + 2) 

Конечно, это просто довольно запутанный способ написания (+ 1 2), но там вы идете.

+0

Как это сделать, используя определения, которые я настроил? Поскольку они в списке, мне придется использовать карту, но я стараюсь избегать этого. –

+0

@JohnNG Вы спрашиваете, как делать то, что делает «карта», не используя «карту»? Если это так, вам нужно будет определить свою собственную рекурсивную функцию (или, альтернативно, именованное 'let') или вместо нее использовать сгиб (если у вас нет такого же возражения против этого, что и для' map'). – sepp2k

+0

Вы начнете с somethign как '((lambda (x y z) (y x z)) (автомобиль a1) (автомобиль a2) (автомобиль a3))'. –

1

Вы можете написать вам карту выражение, не переключаясь аргументы:

(map (lambda (x y z) (x y z)) a2 a1 a3) ; ==> (6 -4 21 1/2) 

Примечание Я только переключил порядок аргументов для отображения. Вы можете вызвать лямбду, завернув ее в круглые скобки и добавив аргументы. Например.

((lambda (op1 proc op2) (proc op1 op2)) + 2 3) ; ==> 5 

map функция просто способ сделать это с каждым элементом из различных списков. Вы можете получить тот же результат без использования лямбды, если вы знаете длину списков:

(list ((car a2) (car a1) (car a3)) 
     ((cadr a2) (cadr a1) (cadr a3)) 
     ((caddr a2) (caddr a1) (caddr a3)) 
     ((cadddr a2) (cadddr a1) (cadddr a3))) ; ==> (6 -4 21 1/2) 

Поскольку каждый элемент a2 представляет собой процедуру, окружив его и аргументы в скобках применяет процедуру.

Форма лямбда (lambda (arg ...) body ...) оценивается и превращается в объект процедуры. Когда вы определяете именованную процедуру, происходит одно и то же, но имя привязывается к этому объекту процедуры. По факту. нет никакой разницы между этими тремя версиями:

;; version 1 using syntactic sugar define for procedures 
(define (test x) (* x x)) 
(test 10) ;==> 100 

;; version 2 defineing a variable to a procedure 
(define test (lambda (x) (* x x))) 
(test 10) ;==> 100 

;; version 3 using the procdure directly 
((lambda (x) (* x x)) 10) ; ==> 100