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的读者宏没有其在球拍等同.我该如何创建它?
如上所述,#(...)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如果使用和没有参数,你可以找到所有细节的包文档.