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

Jon*_*tow 6 clojure

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

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

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

(runner a b (+ a b))
Run Code Online (Sandbox Code Playgroud)

但我不确定我是否正确接近这个...我已经尝试将功能更改为

(runner 'a 'b (+ 'a 'b))
Run Code Online (Sandbox Code Playgroud)

这个更复杂的例子:

(runner 'a 'b (+ (* 'a 'b) 'a))
Run Code Online (Sandbox Code Playgroud)

但是在进入跑步者之前,这在'a和'b上做了+.

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

(defn runner [a b c] (
  (for [i (range 10)
        j (range 10)] (println i j (c i j))
Run Code Online (Sandbox Code Playgroud)

我错过了什么概念的clojure?

Bri*_*per 4

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

  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
Run Code Online (Sandbox Code Playgroud)

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

无需将“ a”和“ b”作为参数传递到函数中。 doseqfor引入他们自己的本地、词汇范围的事物名称。他们没有理由使用aand b;任何名字都可以。对于 来说也是一样的fn。我在这里使用了xand y,因为这并不重要。

我也可以在体内使用aand ,但它们会与人们看到的不同。如果这没有意义,您可能需要阅读范围。bfn abdoseq

  • 这不是我想要的答案,但我问了错误的问题。感谢您提供了一条启蒙之路。 (2认同)