gpt4 book ai didi

dictionary - Racket : (map #(procedure) (list)) 中的 Clojure 等效项

转载 作者:行者123 更新时间:2023-12-03 17:52:39 24 4
gpt4 key购买 nike

我有这个 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 中没有它的等价物。如何创建它?

最佳答案

如前所述,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-expression 语法的语言一起使用,例如 #lang curly-fn racket/base 甚至 #lang curly-fn typed/racket.

curly-fn 简写也比 Clojure 等价物更灵活一些——值得注意的是,如果没有参数,它也可以用作 curry 的简单简写已使用——您可以在 the package documentation 中找到所有详细信息.

关于dictionary - Racket : (map #(procedure) (list)) 中的 Clojure 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37817399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com