Dictionary 球拍中的Clojure等价物:(地图#(程序)(列表))

Dictionary 球拍中的Clojure等价物:(地图#(程序)(列表)),dictionary,clojure,racket,Dictionary,Clojure,Racket,我有这个Clojure代码: (def target-data (map #(vector % (+ (* % %) % 1)) (range -1.0 1.0 0.1))) 我如何翻译它在球拍? 我试过: 在Clojure中似乎是reader宏的#在Racket中没有它的等价物。如何创建它?您可能正在寻找lambdas (define target-data (map (lambda (x) (vector x (+ (* x x) x 1))) (ran

我有这个Clojure代码:

(def target-data
  (map #(vector % (+ (* % %) % 1))
       (range -1.0 1.0 0.1)))
我如何翻译它在球拍? 我试过:


在Clojure中似乎是reader宏的
#
在Racket中没有它的等价物。如何创建它?

您可能正在寻找lambdas

(define target-data
  (map (lambda (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))
这似乎给了我与Clojure代码相同的结果

如前所述,Clojure中的
#(…)
形式只是
(fn…
)的简写语法,在Racket中称为
(lambda…
。如果您希望它更短,您也可以使用
(λ…
,DrRacket实际上有一个插入
λ
字符的快捷方式

使用
λ
,您的代码如下所示:

(define (target-data)
  (map (λ (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))
#{vector % (+ (* % %) % 1)}
(define (target-data)
  (map #{vector % (+ (* % %) % 1)}
       (range -1.0 1.0 0.1)))

如果您想要Clojure式速记,
#lang racket
不支持任何类似的开箱即用,但racket足够灵活,可以将其添加为读卡器宏。有两个不同的包实现类似Clojure的函数速记,包括我编写的一个名为
curly fn
,它与Clojure速记非常相似

要使用它,首先安装
curly fn
软件包:

raco pkg install curly-fn
然后在文件顶部添加
curly fn
作为“元语言”:

#lang curly-fn racket
这将使用函数速记扩展
racket
语言,如下所示:

(define (target-data)
  (map (λ (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))
#{vector % (+ (* % %) % 1)}
(define (target-data)
  (map #{vector % (+ (* % %) % 1)}
       (range -1.0 1.0 0.1)))
值得注意的是,它几乎与Clojure语法相同,但由于
#(…)
已在Racket中用于向量文本,
curly fn
使用
{…}
。因此,您的程序如下所示:

(define (target-data)
  (map (λ (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))
#{vector % (+ (* % %) % 1)}
(define (target-data)
  (map #{vector % (+ (* % %) % 1)}
       (range -1.0 1.0 0.1)))
由于
curly-fn
是一种元语言,因此它也可以与使用s表达式语法的任何其他语言一起使用,例如
#lang curly-fn racket/base
甚至
#lang curly-fn typed/racket


curly fn
速记法也比Clojure等同级速记法灵活一点,如果没有使用任何参数,它也可以作为咖喱的简写,你可以在中找到所有细节。

我建议描述Clojure代码和语法对只懂Racket但不懂Clojure的人的作用。也可以标记球拍问题方案。也就是说,Clojure中的
#(…)
是lambda的快捷方式,并且方案中确实有lambda。