【问题标题】:Evaluating clojure function to a quoted form将 clojure 函数评估为引用形式
【发布时间】:2014-07-22 19:13:44
【问题描述】:

我正在使用一个接受参数的函数,如下所示: (test-function '((gate 1) (gate 3) (gate 2)))

列表参数可以包含任意数量的元素,其中每个元素的形式为(gate x),其中x 可以是从0 到8 的整数。我有一个函数generate-gate-list,它可以生成随机长度的列表(最多 10 个)和内容,尽管它们始终是上述形式。

generate-gate-list 的示例输出:((gate 2))(())((gate 1) (gate 6))

我希望能够将generate-gate-list 嵌套在test-function 中,这样我就可以测试一堆随机生成的列表,而无需预先生成它们。换句话说,我想要这样的东西:(test-function '(generate-gate-list)) 除非已经评估了 generate-gate-list。我尝试了某种宏语法引用和取消引用,但这会导致解析变量,例如(user/gate 3),它搞砸了测试功能。这是我的生成门列表代码:

(defn generate-gate-list []
  (map symbol (repeatedly (rand-int 10) #(random-gate))))

random-gate 将门元素输出为字符串,即"(gate 3)""(gate 2)"

简而言之,我希望(test-function (something-here (generate-gate-list)))(test-function (modified-generate-gate-list)) 等同于(test-function '((gate 1) (gate 4) (gate 2))) 或generate-gate-list 的其他任意输出。谢谢!

【问题讨论】:

  • gate 是一个函数吗?如果是这样,它有什么作用?
  • gate 是一个函数,但是我不能修改它。

标签: list macros clojure clojurescript


【解决方案1】:

引用产生文字列表

我相信您的困惑是认为引用是生成列表的唯一方法。虽然引用可以生成像'((gate 1) (gate 2)) 中的文字列表,但您可能已经发现,列表中的任何内容都不会被评估。因此,您不能以这种方式生成随机列表,因为您的随机变量不会被评估。

符号只产生符号

像在generate-gate-list 函数中所做的那样,在列表“(gate 1)”的文本表示上调用symbol 不起作用。它生成的符号看起来像一个列表,而不是一个列表。

user=> (type (symbol "(gate 1)"))
clojure.lang.Symbol

列表是用list 创建的

如果您希望进行评估,即用变量填充您的列表,请使用 list 函数。

user=> (list 'gate 1)
(gate 1)

user=> (list 'gate (rand-int 10))
(gate 2)

示例

不知道你的test-function 是什么,让我们这样做

(defn test-function 
  [gate-list]
  "Turn a list of (gate n) pairs into a list of gate numbers" 
  (map second gate-list))

user=> (test-function '((gate 1) (gate 2)))
(1 2)

(defn generate-gate-list []
  (repeatedly (rand-int 10) #(list 'gate (rand-int 10))))

user=> (def a-random-list (generate-gate-list))
#'user/a-random-list

user=> a-random-list
((gate 2) (gate 5) (gate 2) (gate 8) (gate 4))

user=> (test-function a-random-list)
(2 5 2 8 4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 2015-03-31
    • 2012-11-19
    • 2016-04-20
    • 1970-01-01
    • 2012-01-29
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多