我正在使用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)))
可能產生相同的結果。
我正在使用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)))
可能產生相同的結果。
沒有內置,但你可以寫自己:
(define (map-apply funcs items)
(map (lambda (item)
(map (lambda (func)
(apply func item))
funcs))
items))
你不得不在(list + *)
通過,不'(+ *)
,但是。
如果你經常做這些事情,你可以抽象出地圖函數的產生。因此,其餘的將保持不變:
;; 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))
你還在那裏+火槍?如果你確實需要將函數參數傳遞爲'(+ *),那麼你的解決方案將是:
(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)))
Ewwww。 'eval',真的?!但是,嚴重的是,傳入函數名稱符號而不是函數對象只是真的被破壞了。 –
我以'如果你真的,真的需要...'開頭,表明我的懷疑,但這是他在OP中展示的內容。可能會實施翻譯或閱讀輸入。 – GoZoner
有沒有必要爲宏; ('(define(make-map-fun。funcs))(lambda(args)(map(lambda(func)(apply func))可以編寫一個純函數的'make-map-fun'實現, args))funcs)))')。因此,「如果必要時只使用宏」等常見建議:-) –
@ ChrisJester-Young你是完全正確的。 – Sylwester