如何使函数可用于 ClojureScript eval?

2024-04-02

In 德米特里·索特尼科夫 (Dmitri Sotnikov) 的这篇博文 http://yogthos.net/posts/2015-11-12-ClojureScript-Eval.html一个函数eval-str提供用于运行包含 ClojureScript 的字符串:

(defn eval-str [s]
  (eval (empty-state)
        (read-string s)
        {:eval       js-eval
         :source-map true
         :context    :expr}
        (fn [result] result)))

如果我有一些功能x我希望能够从 eval 字符串内部调用,我该怎么做?


答案有两部分,假设x是与 ClojureScript 函数关联的 var:

  1. 编译器分析元数据x需要出现在作为第一个参数传递的状态中cljs.js/eval。这样,在编译期间,诸如 arity 之类的事情x例如,已知。
  2. 关联函数的 JavaScript 实现x需要存在于 JavaScript 运行时中。 (如果该函数实际上是called在此期间cljs.js/eval调用,而不仅仅是引用。)

If x是一个核心函数(比如 var#'cljs.core/map例如),那么这两个条件都会自动满足。特别是,元数据将在以下情况下生成:cljs.js/empty-state被称为(假设:dump-core https://clojurescript.org/guides/self-hosting is true),并且核心函数的实现已经被加载到 JavaScript 运行时中。

但是,我们说x是您希望在自托管环境中编译的全新函数。 “技巧”是设置和重用编译器状态:例如将结果(cljs.js.empty-state)放入 var 中,并将其传递给每个cljs.js/eval称呼。如果你这样做,并且其中之一cljs.js/eval调用涉及编译一个defn for x,那么编译器状态将为modified(它实际上是一个原子),结果是编译器元数据x将会被放入状态,当然还有 JavaScript 实现x在 JavaScript 环境中设置(通过评估为defn).

另一方面,如果x是“环境”ClojureScript 环境的一部分的函数(例如,通过 JVM ClojureScript 编译器预编译,但仍然可以在 JavaScript 运行时使用),那么您将需要以某种方式安排获得编译器分析元数据x进入状态传递给cljs.js/eval。如果您查看基于 JVM 的编译器的输出,您将看到<ns-name>.cache.json包含此类元数据的文件。查看这些文件中的数据,您可以确定其结构;这样您就可以看到如何将所需的信息交换到编译器状态中[:cljs.analyzer/namespaces <ns-name>]. The cljs.js/load-analysis-cache!函数作为此用例的助手而存在,一个独立的示例位于https://stackoverflow.com/a/51575204/4284484 https://stackoverflow.com/a/51575204/4284484

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使函数可用于 ClojureScript eval? 的相关文章

  • 使用 fs.readFileSync 和 eval 内容读取文件...哪个作用域具有这些功能?如何访问?

    我最近尝试将文件导入到现有的 Node js 项目中 我知道这应该用模块编写 但我包含了我的外部 javascript 文件 如下所示 eval fs readFileSync public templates simple js simp
  • ClojureScript clojure.set?

    如何在 ClojureScript 中使用 clojure set 我总是收到错误 def middle land set for x water hor y vec clojure set difference set range 0 b
  • str(列表) 是如何工作的?

    为什么str list 返回我们如何在控制台上看到列表 如何str list 工作 任何对 CPython 代码的引用str list gt gt gt x abc def ghi gt gt gt str x abc def ghi 要从
  • 使用 PHP eval 的风险[重复]

    这个问题在这里已经有答案了 可能的重复 什么时候 如果有的话 eval 不是邪恶的 https stackoverflow com questions 3499672 when if ever is eval not evil php 中的
  • 同一页面上有多个 ClojureScript 文件

    我有一个使用 Jasmine 来测试 JavaScript 的项目 我正在尝试切换到使用 ClojureScript 作为前端 我的project clj is like defproject myproject 0 1 0 SNAPSHO
  • 如何正确解释作为字符串接收的 JSON 对象?

    我的网络服务已损坏 无法访问和更改 它发送一些主要不错的 JSON 但其中一个属性是作为字符串发送的嵌套 JSON 对象 http www ireland com api getitemweb 185213 http www ireland
  • 如何记住使用 core.async 和非阻塞通道读取的函数?

    我想用memoize对于使用的函数core async and
  • eval() 和 new Function() 是同一件事吗?

    这两个函数在幕后做同样的事情吗 在单语句函数中 var evaluate function string return eval string var func function string return new Function ret
  • 通过引用翻译变量替换文本中的占位符

    我正在尝试从以下函数中删除 eval 我尝试过sprintf and 但仍然找不到解决办法 这里的函数 function parseDbString string value Looking for a good pippo pippo P
  • lein Figwheel 与 lein cljsbuild auto

    lein Figwheel 和 lein cljsbuild auto 有什么区别 因为我相信它们都是用来编译 clojurescript 的 另外 使用其中一种比另一种有什么好处吗 Figwheel 它们都是 lein 插件 但 Figw
  • PHP 评估 $a="$a"?

    我正在查看一些工作代码 并发现了这一行 eval element element 我真的很困惑为什么 PHP 开发人员会写这行代码 除了为自身设置一个变量之外 这还有什么目的 幸运的是 该行所在的函数从未被调用 上面的例子将输出 This
  • 为什么我的 lein re-frame 模板中有 clj 和 cljs 文件夹?

    为什么我的 lein re frame 模板中有 clj 和 cljs 文件夹 如下所示 为什么它们都包含名为 core似乎使用相同的命名空间 有人告诉我这是学习重新构建时的起点 但我找不到任何解释为什么模板会这样设置或创建 包括它们包含的
  • Bash - 如何避免命令“eval set --”评估变量

    我只是编写了一个小 bash 脚本来管理多个并行 ssh 命令 为了解析参数 我使用这段代码 bin bash replace long arguments for arg in do case arg in help args args
  • Clojure:在 let 绑定中展开 var

    我想在let不同功能的形式 比方说 def common assign x 10 y 20 一种方法是用eval eval defn foo let common assign hello world balala 问题是现在你必须引用所有
  • PHP 中变量的数组路径

    因此 我编写了一个类 它可以解析 XML 文档并从中创建 SQL 查询 以根据设置更新或插入新行 由于脚本必须处理任意数量的嵌套块 因此我放入所有值的数组的路径是动态创建的 与以下示例非常相似 path array field1 field
  • 上下文保留评估

    我们正在构建一个小型 REPL 来评估 使用eval 用户输入的 JavaScript 表达式 由于整个事情是事件驱动的 因此评估必须在单独的函数中进行 但必须在调用之间保留上下文 即所有声明的变量和函数 我想出了以下解决方案 functi
  • R: Knit 给出 SQL-chunk 错误

    我想编织 R markdown 的输出 其中包括几个 SQL 块 但是 如果我开始编织 就会收到错误消息 Line 65 Error in eval expr envir enclos object pp dataset not found
  • 数据绑定方法(例如 Eval()、XPath() 和 Bind())只能在数据绑定控件的上下文中使用

    我收到以下错误 数据绑定方法 例如 Eval XPath 和 Bind 只能在数据绑定控件的上下文中使用 但我想做的只是在 ASP NET REPEATER 控件内
  • 将表达式捕获为 R 中的函数体

    我正在尝试编写一个程序 该程序将表达式作为输入并返回一个以该表达式绑定作为其主体的函数 caller lt function expr params Function lt function params body env parent f
  • 如何对“2-1”这样的字符串进行数学计算以产生“1”?

    我只是想知道 PHP 是否有一个函数可以接受像这样的字符串2 1并产生它的算术结果 或者我必须手动执行此操作explode 获取算术运算符左侧和右侧的值 我知道这个问题很老了 但我昨晚在寻找不太相关的东西时遇到了它 而且这里的每个答案都很糟

随机推荐