gpt4 book ai didi

clojure - clojure 代码示例中的这个函数定义有什么作用?

转载 作者:行者123 更新时间:2023-12-04 20:43:06 29 4
gpt4 key购买 nike

我正在关注“Clojure in Action”,对此我感到困惑:

(defn with-log [function-to-call log-statement ]
(fn [& args]
(println log-statement)
(apply function-to-call args)))

这是让我感到困惑的代码段。这是我目前可以破译的:

(defn with-log [function-to-call log-statement ] ..) 正在定义一个名为“with-log”的函数,它接受参数 'function-to-call' 和 'log-statement' 以及 function-to- call 是一个作为参数传递给这个函数的函数。
下一节让我感到困惑:(fn [& args] .... 此处定义了一个匿名函数吗?'with-log' 函数是否返回了一个新的函数定义?
(fn [& args]
(println log-statement)
(apply function-to-call args))

因此,通过调用 (with-log somefunc "my label") - 它只是返回一个新的匿名函数吗?还是调用匿名函数?

最佳答案

with-log将产生一个函数,当被调用时,它会做function-to-call除了 log-statement 的副作用将打印到 *out*就在之前 function-to-call使用提供给匿名函数的参数进行评估。

这是 Decorator Pattern 的一个例子- 通过将现有函数包装在另一个函数中来扩展现有函数的行为,即由 with-log 创建的匿名函数使用 (fn ...)形式。

为了装饰器功能with-log与任何可以想到的一起工作 function-to-call ,指定匿名函数的参数列表,以便可以使用 (fn [& args] ...) 使用参数数量调用它。 .当匿名函数调用 function-to-call它使用函数 apply“解开”参数列表)。

使用方法with-log可能:

((with-log some-fn "Calling some-fn") arg1 arg2)

或者
(defn my-fn [a b]
(+ a b))
(def my-fn-with-logging (with-log my-fn "Calling my-fn"))

(my-fn 1 2) ; evaluates to 3
(my-fn-with-logging 1 2) ; prints "Calling my-fn" and evaluates to 3

关于clojure - clojure 代码示例中的这个函数定义有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694737/

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