2016-06-14 29 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所有的細節。