2016-06-14 45 views
3

我有这样的Clojure代码:的Clojure相当于球拍(图#(程序)(表))

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

我如何拍它翻译? 我想:

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

这似乎是在Clojure的读者宏没有其在球拍相当于#。我如何创建它?

+0

我会建议描述Clojure代码和语法对于只知道球拍而不知道Clojure的人来说。也可以标记球拍问题方案。 –

+0

表示,Clojure中的'#(...)'是lambda的快捷方式,而scheme * does *有lambda表达式。 –

回答

8

如上所述,#(...)形式Clojure是只为(fn ...)的速记语法,这就是所谓在球拍(lambda ...)。如果你希望它更短,你也可以使用(λ ...),DrRacket实际上有一个插入λ字符的快捷方式。

使用λ,你的代码应该是这样的:

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

如果你想的Clojure般的简写,#lang racket不支持这样的事情开箱即用,但球拍非常灵活,将其添加为阅读器宏。有几个不同的包实现了类似Clojure的函数速记,其中包括我写的一个名为curly-fn的包,它与Clojure速记非常相似。

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

raco pkg install curly-fn 

然后加入curly-fn作为一个“元语言”,在你的文件的顶部:

#lang curly-fn racket 

这将延长racket语言与功能简写,看起来像这样:

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

值得注意的是,它与Clojure语法几乎相同,但由于#(...)已经在球拍中用于矢量文字,因此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所有的细节。