gpt4 book ai didi

clojure - 枚举命名空间并在 ClojureScript 中动态加载它们

转载 作者:行者123 更新时间:2023-12-01 02:10:10 27 4
gpt4 key购买 nike

这实际上可能有点像 XY-problem ,所以我将尝试首先解释目标是什么。

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

我编码它的方式如下。
每个组件都在它自己的命名空间中,这个命名空间包含一个返回新组件的构建器函数。在命名空间的根部,它还调用 ( derive::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映射为面向用户的菜单提供数据(可以添加哪些组件,按类型过滤)。

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

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

所以我的问题是:如何在 ClojureScript 中(动态地)维护一个映射或命名空间列表 + 变量?

最佳答案

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

关于clojure - 枚举命名空间并在 ClojureScript 中动态加载它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30081260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com