gpt4 book ai didi

clojure - 如何将变量作为变量名传递给函数?

转载 作者:行者123 更新时间:2023-12-02 17:46:22 25 4
gpt4 key购买 nike

我希望能够执行以下伪代码:

  1. 传入符号a。
  2. 传入符号b。
  3. 使用 a 和 b 传入表达式
  4. 当我更改 a 和 b 的值时,在每个时刻打印 c 的输出。

理想情况下,我希望签名看起来像:

(runner a b (+ a b))

但我不确定我是否正确地处理了这个问题...我尝试将函数更改为

(runner 'a 'b (+ 'a 'b))

这个更复杂的例子:

(runner 'a 'b (+ (* 'a 'b) 'a))

但这会在进入运行者之前对“a”和“b”执行+操作。

这是我对 clojure 的第一次尝试:

(defn runner [a b c] (
(for [i (range 10)
j (range 10)] (println i j (c i j))

我缺少什么 clojure 概念?

最佳答案

函数参数始终在调用函数之前求值。如果您想推迟计算或将某些计算或代码表示为对象,您有几个选择:

  1. 使用函数(请参阅下面的代码)
  2. 使用宏并将某些代码拼接到宏生成的其他代码中
  3. 将代码作为引用列表传递,并对其进行eval

99% 的情况下,您都希望使用函数。 1% 的情况下,您会需要宏。除非您在运行时生成代码或做非常奇怪的事情,否则您永远不需要eval

user> (defn runner [f]
(doseq [a (range 3)
b (range 3)]
(println a b (f a b))))
#'user/runner
user> (runner (fn [x y] (+ x y)))
0 0 0
0 1 1
0 2 2
1 0 1
1 1 2
1 2 3
2 0 2
2 1 3
2 2 4

这也可以写成(runner #(+ %1 %2),甚至简单地写成(runner +)

无需将“a”和“b”作为参数传递到函数中。 doseqfor 为事物引入了它们自己的本地、词法范围的名称。他们没有理由使用 ab;任何名字都可以。 fn 也是如此。我在这里使用了 xy 因为这并不重要。

我也可以在 fn 主体中使用 ab,但它们会不同 abdoseq 看到的要多。您可能想阅读scope如果这没有意义。

关于clojure - 如何将变量作为变量名传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3346556/

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