Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
枚举名称空间并在ClojureScript中动态加载它们_Clojure_Namespaces_Clojurescript_Reagent - Fatal编程技术网

枚举名称空间并在ClojureScript中动态加载它们

枚举名称空间并在ClojureScript中动态加载它们,clojure,namespaces,clojurescript,reagent,Clojure,Namespaces,Clojurescript,Reagent,这实际上可能有点奇怪,所以我将尝试解释一下目标是什么 我正在构建一个ClojureScript应用程序,它由一组组件组成。它提供了一个用户界面,您可以在其中动态添加或删除UI元素。这些UI元素(组件)具有特定类型。例如,标记组件是一个文本组件。每当用户看到添加文本的选项时,我们都会列出与类型+(在本例中,可能还有其他组件)匹配的所有组件 我的编码方式如下。 每个组件都在其自己的命名空间中,此命名空间包含一个返回新组件的生成器函数。在名称空间的根处,它还调用(::type::parent) 现在,

这实际上可能有点奇怪,所以我将尝试解释一下目标是什么

我正在构建一个ClojureScript应用程序,它由一组组件组成。它提供了一个用户界面,您可以在其中动态添加或删除UI元素。这些UI元素(组件)具有特定类型。例如,标记组件
是一个文本组件。每当用户看到添加文本的选项时,我们都会列出与类型+(在本例中,可能还有其他组件)匹配的所有组件

我的编码方式如下。 每个组件都在其自己的命名空间中,此命名空间包含一个返回新组件的生成器函数。在名称空间的根处,它还调用(::type::parent)

现在,在不同的名称空间中,我们需要并枚举映射中的所有这些组件,如:

(ns app.components
  (:require
   [app.gui.markdown :as markdown]
   [app.gui.study-list :as study-list]))

(def all
  {markdown/t markdown/builder
   study-list/t study-list/builder})
其中,
/t
指用于定义层次结构的命名空间限定关键字。我们使用
all
map为面向用户的菜单提供数据(可以添加哪些组件,按类型过滤)

现在,正如你所想象的,这并不漂亮。因为它现在必须手动维护层次结构中所有类型的(可能)长列表

相反,我想做一些类似
(def all(components of(subjections::root)))
的事情,但我不确定如何解决这个问题,因为我认为这需要按名称查找变量(ClojureScript不支持)


因此,我的问题是:如何在ClojureScript中(动态地)维护名称空间+变量的映射或列表?

您不能动态地这样做,但就我所知,对于您的问题,没有太多需要。ClojureScript宏可以反映回编译器中-您可以轻松地使用
cljs.analyzer.api
名称空间来确定需要哪些变量(通过变量元数据或其他方式),并自动发出所需的运行时信息映射。这实际上与
cljs.test/runtests
的工作原理非常相似。它使用编译器过滤掉所有附加了
:test
元数据的名称空间中的所有变量,并生成测试每个变量的代码。值得详细检查
cljs.test
,看看如何做到这一点。

也许宏会有所帮助?或者用.cljc玩把戏?谢谢,这很有帮助!。看起来我可以从cljs.test中提取相关的位。我还没有完全意识到clj和cljs之间的宏互操作。