我有这个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中没有它的等价物。我该如何创建它?
答案 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代码相同。