Clojure(脚本)高阶函数仅接受来自特定命名空间的函数

问题描述 投票:0回答:1

我正在尝试定义一个函数(或宏),它应该只接受来自某个命名空间的函数作为参数

(ns ns1)
  (defn high-function[f & params]
    (if (condition on f meta regarding namespace)
        (apply f params)
        (throw (Exception. "not allowed"))))

调用 high-function 的函数应该位于另一个命名空间(ns2)中,并且参数函数应该位于另一个命名空间(ns3)中。 ns2 需要 ns1 和 ns3。

我尝试传递函数的 var 而不是函数,因为函数没有元,但 var 有,但是 cljs.core 没有 var-get 方法供我随后执行该函数。我可以同时传递 var 和函数,但这很丑陋。

clojurescript
1个回答
0
投票

传递 var 并使用

deref
来获取函数:

(defn high-function [f & params]
  (if (= 'app.ns3 (ns-name (:ns (meta f))))
    (apply @f params)
    (throw (Exception. "Not allowed."))))

(high-function #'app.ns3/foo ...)
© www.soinside.com 2019 - 2024. All rights reserved.