我有一个可变长度函数列表
(list proc1 proc2 ...)
我有一个变量列表
(list 1 2 3 4 5 ...)
我想将这些函数应用于变量列表。
如何将这些功能应用到我的列表中?
编辑:
如果我有sin和tan以及0.1,0.2和0.3,那么我想得到9个结果。
答案 0 :(得分:4)
使用理解来迭代过程和数字,您最终会得到一个包含n^2
元素的列表。例如:
(for*/list ((f (list sin cos tan))
(x (list 0.1 0.2 0.3)))
(f x))
=> '(0.09983341664682815
0.19866933079506122
0.29552020666133955
0.9950041652780257
0.9800665778412416
0.955336489125606
0.10033467208545055
0.20271003550867248
0.3093362496096232)
答案 1 :(得分:0)
以下是除* / list之外的一些方法:
可以通过2个单独的/ list来获取列表列表:
(for/list ((f (list sin cos tan)))
(for/list ((x (list 0.1 0.2 0.3)))
(f x)))
输出:
'((0.09983341664682815 0.19866933079506122 0.29552020666133955)
(0.9950041652780258 0.9800665778412416 0.955336489125606)
(0.10033467208545055 0.2027100355086725 0.30933624960962325))
如果想要使用简单的',可以将答案添加到现有列表中:
(define outlist '())
(for ((f (list sin cos tan)))
(for ((x (list 0.1 0.2 0.3)))
(set! outlist (cons (f x) outlist))))
outlist
输出:
'(0.30933624960962325
0.2027100355086725
0.10033467208545055
0.955336489125606
0.9800665778412416
0.9950041652780258
0.29552020666133955
0.19866933079506122
0.09983341664682815)
以下是使用' for':
的另一个版本(define fl (list sin cos tan))
(define vl (list 0.1 0.2 0.3))
(for* ((x 3)(y 3)) ; all combinations of x and y from (0,1,2)
(println ((list-ref fl x) (list-ref vl y))))
'命名为'也可以用来代替':
(let loop ((fl (list sin cos tan)))
(cond
[(empty? fl) (println "End.")]
[else
(for ((v (list 0.1 0.2 0.3)))
(println ((first fl) v)))
(loop (rest fl))]))
两个for循环也可以被命名为let':
替换(let outer ((fl (list sin cos tan)))
(cond
[(empty? fl)
(println "End.")]
[else
(let inner ((vl (list 0.1 0.2 0.3)))
(cond
[(empty? vl)]
[else
(println ((first fl) (first vl)))
(inner (rest vl))]))
(outer (rest fl))]))
也可以组合两个地图来获取所有值:
(map (λ (x)
(map x (list 0.1 0.2 0.3)))
(list sin cos tan))
输出:
'((0.09983341664682815 0.19866933079506122 0.29552020666133955)
(0.9950041652780258 0.9800665778412416 0.955336489125606)
(0.10033467208545055 0.2027100355086725 0.30933624960962325))
HTH。