Вы можете написать вам карту выражение, не переключаясь аргументы:
(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
На каком языке это? –
Схема (R5RS), извините за то, что она не стала более понятной. –