Dictionary 球拍中的Clojure等价物:(地图#(程序)(列表))
我有这个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
(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。