(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)
如何在不使用map的情况下直接调用此lambda函数? 它只是切换y和x,因此(1 + 5)变为(+ 1 5)
答案 0 :(得分:1)
您可以在不切换参数的情况下编写地图表达式:
(map (lambda (x y z) (x y z)) a2 a1 a3) ; ==> (6 -4 21 1/2)
注意我刚刚将参数的顺序切换为map。 你可以通过将它包装在括号中并添加参数来调用lambda。例如。
((lambda (op1 proc op2) (proc op1 op2)) + 2 3) ; ==> 5
map
函数只是对不同列表的每个元素执行此操作的一种方法。如果您知道列表的长度,则可以在不使用lambda的情况下获得相同的结果:
(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表单(lambda (arg ...) body ...)
并将其转换为过程对象。定义命名过程时,会发生相同但名称绑定到该过程对象。事实上。这3个版本之间没有区别:
;; 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
答案 1 :(得分:0)
您可能知道,要在Scheme中调用函数,请编写(f args)
,其中f
是函数,args
是参数列表。 f
是命名函数还是lambda,这没有任何区别。因此,要直接调用lambda函数,您需要编写:
;( -----------f------------ args- )
( (lambda (x y z) (y x z)) 1 + 2 )
当然,这只是一种写作(+ 1 2)
的一种相当复杂的方式,但是你去了。