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

The*_*rza 3 dictionary clojure racket

我有这个Clojure代码:

(def target-data
  (map #(vector % (+ (* % %) % 1))
       (range -1.0 1.0 0.1)))
Run Code Online (Sandbox Code Playgroud)

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

(define (target-data)
  (map #(vector % (+ (* % %) % 1))
       (range -1.0 1.0 0.1)))
Run Code Online (Sandbox Code Playgroud)

#这似乎是在Clojure的读者宏没有其在球拍等同.我该如何创建它?

Ale*_*ing 8

如上所述,#(...)Clojure 中的表单只是一种简写语法(fn ...),(lambda ...)在Racket中称为.如果你想让它更短,你也可以使用(? ...),而DrRacket实际上有一个插入?角色的快捷方式.

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

(define (target-data)
  (map (? (x) (vector x (+ (* x x) x 1)))
       (range -1.0 1.0 0.1)))
Run Code Online (Sandbox Code Playgroud)

如果你想要类似Clojure的速记,#lang racket不支持开箱即用的东西,但是Racket足够灵活,可以将它添加为阅读器宏.有几个不同的包实现了类似Clojure的函数速记,包括我编写的一个curly-fn,这与Clojure简写非常相似.

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

raco pkg install curly-fn
Run Code Online (Sandbox Code Playgroud)

然后curly-fn在文件顶部添加"元语言":

#lang curly-fn racket
Run Code Online (Sandbox Code Playgroud)

这将racket使用函数速记扩展语言,如下所示:

#{vector % (+ (* % %) % 1)}
Run Code Online (Sandbox Code Playgroud)

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

(define (target-data)
  (map #{vector % (+ (* % %) % 1)}
       (range -1.0 1.0 0.1)))
Run Code Online (Sandbox Code Playgroud)

由于curly-fn是一种元语言,它也可以与任何其他使用s表达式语法的语言一起使用,例如#lang curly-fn racket/base甚至#lang curly-fn typed/racket.

curly-fn速记也比Clojure的更灵活一点等效值得注意的是,它也可以作为一个简单的简写,curry如果使用和没有参数,你可以找到所有细节的包文档.