我要做的是从地图中调用带有一些本地定义变量的函数,而不在函数调用中表示整个变量。
例如,以下代码有效:
(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]))
使用变量本身作为参数执行函数调用的简单方法是什么?
答案 0 :(得分:1)
目前尚不清楚为什么eval
符号 'count
。你不能只在地图中保留功能 count
并按如下方式调用它:
(let [a [0 1 2]] (({:fun count} :fun) a)) => 3
然后矢量a
可以是您喜欢的任何尺寸。
eval
。回想起来,你所做的就是推迟编译,从容易到困难的时候。