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