将clojure函数评估为引用形式

use*_*710 1 macros list clojure clojurescript

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

列表参数可以包含任意数量的元素,其中每个元素的形式为(gate x)其中x可以是从0到8我有一个功能,整数generate-gate-list,其生成随机列表的长度(高达10)和内容,尽管它们总是上面的形式.

:生成栅极列表的示例输出((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))))
Run Code Online (Sandbox Code Playgroud)

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)))或者生成门列表的其他任意输出.谢谢!

A. *_*ebb 7

引用生成文字列表

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

符号仅生成符号

symbolgenerate-gate-list函数中调用列表"(门1)"的文本表示不起作用.它生成一个看起来像列表而不是列表的符号.

user=> (type (symbol "(gate 1)"))
clojure.lang.Symbol
Run Code Online (Sandbox Code Playgroud)

列表是用.创建的 list

如果要进行评估,即使用变量填充列表,请使用该list函数.

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

user=> (list 'gate (rand-int 10))
(gate 2)
Run Code Online (Sandbox Code Playgroud)

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

(defn test-function 
  [gate-list]
  "Turn a list of (gate n) pairs into a list of gate numbers" 
  (map second gate-list))
Run Code Online (Sandbox Code Playgroud)
user=> (test-function '((gate 1) (gate 2)))
(1 2)
Run Code Online (Sandbox Code Playgroud)
(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)
Run Code Online (Sandbox Code Playgroud)