javascript的传播运算符的lisp等效项是什么?

时间:2019-12-10 19:19:00

标签: scheme lisp racket

说我想找到一堆数字的最高平方:

(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

2 个答案:

答案 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))