说我想找到一堆数字的最高平方:
(max (map (lambda (x) (* x x)) (range -4 1))) ; I want 16
这不起作用:max
应该像(max 16 9 4 1 0)
那样被调用,而我叫(max '(16 9 4 1 0))
这样。
我要在此处应用的操作与Python的星号或Javascript的spread运算符相同,但都没有引用,取消引用或准引用...
在Lisp(或Scheme)(或Racket)中叫什么,我该如何执行?这似乎是一项基本操作,我正在努力在Google上找到合适的搜索字词。
到目前为止,我所能得到的最好的是真的很难过
(argmax (lambda (x) x) (map (lambda (x) (* x x)) (range -4 1))) ; 16 but really sadly so
答案 0 :(得分:2)
使用apply
将列表分散为参数。
(apply max (map (lambda (x) (* x x)) (range -4 1)))
答案 1 :(得分:1)
JavaScript rest语法包含在ECMA2015 / ES6中,在2015年之前,您具有以下语法:
Math.max.apply(
null,
[-4, -3, -2, 1].map(function (v) {return v*v; }),
);
// ==> 16
Scheme早在70年代就拥有它:
(apply max
(map (lambda (v)
(* v v))
'(-4 -3 -2 1)))
; ==> 16
请注意,JS apply
的功能不如Scheme / Common Lisp。例如。您可以添加JS不支持的其他参数:
(apply map list '((1 2 3) (a b c)))
; ==> ((1 a) (2 b) (3 c))