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

时间:2016-06-14 16:23:34

标签: dictionary clojure racket

我有这个Clojure代码:

(def target-data
  (map #(vector % (+ (* % %) % 1))
       (range -1.0 1.0 0.1)))

如何在Racket中翻译? 我试过了:

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

在Clojure中看起来像读者宏的#在Racket中没有它的等价物。我该如何创建它?

2 个答案:

答案 0 :(得分:8)

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

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

(define (target-data)
  (map (λ (x) (vector x (+ (* x x) x 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语言,如下所示:

#{vector % (+ (* % %) % 1)}

值得注意的是,它与Clojure语法几乎完全相同,但由于#(...)已在Racket中用于矢量文字,curly-fn使用#{...}代替。因此,您的程序将如下所示:

(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等同一点灵活一点 - 特别是,如果没有使用参数,它也可以用作curry的简单速记 - 你可以找到所有the package documentation中的详细信息。

答案 1 :(得分:2)

你可能正在寻找lambdas。

(define target-data
  (map (lambda (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))

这似乎给我的结果与Clojure代码相同。

https://docs.racket-lang.org/guide/lambda.html