【问题标题】:What is the lisp equivalent of javascript's spread operator? [duplicate]javascript 的扩展运算符的 lisp 等价物是什么? [复制]
【发布时间】:2023-03-16 04:39:02
【问题描述】:

假设我想找到一堆数字的最大平方:

(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 的扩展操作符一样,但是它既不是引号,也不是非引号,也不是准引号……

在 lisp(或 Scheme)(或 Racket)中叫什么,我该如何执行?这似乎是一项基本操作,我很难在 Google 上找到合适的搜索字词。

到目前为止,我得到的最好的结果是真的很伤心

(argmax (lambda (x) x) (map (lambda (x) (* x x)) (range -4 1))) ; 16 but really sadly so

【问题讨论】:

标签: scheme lisp racket


【解决方案1】:

使用apply 将列表展开为参数。

(apply max (map (lambda (x) (* x x)) (range -4 1)))

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 2011-12-26
      • 2019-07-17
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多