Clojure如何将一些args发送到一个被称为符号的函数

时间:2016-12-31 02:46:03

标签: clojure

我要做的是从地图中调用带有一些本地定义变量的函数,而不在函数调用中表示整个变量。

例如,以下代码有效:

(let [a [0 1 2]]
  (eval (list ({:fun 'count} :fun) a))) => 3

并且此代码适用于引用的'a全局定义时:

(def a [0 1 2])
(eval (list ({:fun 'count} :fun) 'a))

但此代码不起作用:

(let [a [0 1 2]]
  (eval (list ({:fun 'count} :fun) 'a))) 
=> Unable to resolve symbol: a in this context

第一个块对于像这样的小向量很好,但是当我需要传入几千个项目的向量时,非引号“a”会导致它为“Method too large”抛出一个错误,因为实际的发送到机器的方法是:

(let [a [0 1 2]]
  (eval (count [0 1 2]))

使用变量本身作为参数执行函数调用的简单方法是什么?

1 个答案:

答案 0 :(得分:1)

目前尚不清楚为什么eval 符号 'count。你不能只在地图中保留功能 count并按如下方式调用它:

(let [a [0 1 2]] (({:fun count} :fun) a)) => 3

然后矢量a可以是您喜欢的任何尺寸。

  • 请勿使用宏将执行的eval
  • 不要使用函数可以执行的宏。

回想起来,你所做的就是推迟编译,从容易到困难的时候。