直接调用lambda函数

时间:2015-03-19 13:30:17

标签: function lambda scheme

(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)

2 个答案:

答案 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)的一种相当复杂的方式,但是你去了。