在这样的方案中编写应用于列表的函数是否有更短的方法?

时间:2013-06-21 09:47:43

标签: lisp scheme

我正在使用R5RS(球拍)。这是我的例子

(map (lambda (x) (list (apply + x) (apply * x))) '((1 2 3) (4 5 6)))
 -> ((6 6) (15 120))

我只是想知道如果有像这样的内置函数

(map-apply '(+ *) '((1 2 3) (4 5 6)))

可以产生相同的结果。

3 个答案:

答案 0 :(得分:6)

没有任何内置内容,但您可以编写自己的内容:

(define (map-apply funcs items)
  (map (lambda (item)
         (map (lambda (func)
                (apply func item))
              funcs))
       items))

但是,您必须传递(list + *),而不是'(+ *)

答案 1 :(得分:0)

如果你经常做这些事情,你可以抽象地图功能的制作。因此其余部分将保持不变:

;; Makes a function that applies all functions to an argument
(define (make-map-fun . funs)
  (lambda (lis)
     (map (lambda (fun) (apply fun lis)) funs)))

(map (make-map-fun + *) '((1 2 3) (4 5 6)))
; ==> ((6 6) (15 120))

;; And you can zip with it too
(apply map 
       (lambda l ((make-map-fun + *) l)) 
       '((1 2 3) (4 5 6) (7 8 9))) 
; ==> ((12 28) (15 80) (18 162))

答案 2 :(得分:0)

你还在那里+火枪吗?如果你真的,真的需要将函数参数传递为'(+ *)那么你的解决方案将是:

(define (map-apply function-names items)
  (let ((funcs (map (lambda (name) (eval name (interaction-environment))) function-names)))
    (map (lambda (item)
           (map (lambda (func)
                  (apply func item))
                funcs))
         items)))