在 Clojure 中执行动态绑定函数

2024-01-06

我想在数据结构中预先存储一堆函数调用,然后从另一个函数中评估/执行它们。

对于在命名空间级别定义的函数,这按计划工作defn(即使函数定义是在我创建数据结构之后出现的)但不适用于由let [name (fn or letfn函数内部。

这是我的一个独立的小例子:

(def todoA '(funcA))
(def todoB '(funcB))
(def todoC '(funcC))
(def todoD '(funcD)) ; unused

(defn funcA [] (println "hello funcA!"))

(declare funcB funcC)

(defn runit []
    (let [funcB (fn [] (println "hello funcB"))]
    (letfn [(funcC [] (println "hello funcC!"))]
        (funcA)       ; OK
        (eval todoA)  ; OK
        (funcB)       ; OK
        (eval todoB)  ; "Unable to resolve symbol: funcB in this context" at line 2
        (funcC)       ; OK
        (eval todoC)  ; "Unable to resolve symbol: funcC in this context" at line 3
)))

如果您想知道我的测试设置,为了查看这 6 个语句的结果,我注释/取消注释特定的 OK/失败行,然后调用(runit)来自 REPL。

我可以采取简单的修复方法吗eval'd quoted 调用函数来为另一个函数内定义的函数工作?


Update:

这个(根据丹雷的建议)does工作。让我们看看我能否让这种方法在“现实生活”中发挥作用!

(def todoB '(funcB))
(declare funcB)

(defn runit []
  (binding [funcB (fn [] (println "hello funcB"))]
    (funcB)
    (eval todoB)  ; "Unable to resolve symbol: funcB in this context" at line 1!
))

Update:

这段代码将进入我的解决方案约束满足问题 https://stackoverflow.com/questions/2500504/constraint-satisfaction-problem- 我想知道谁拥有斑马 https://stackoverflow.com/questions/318888/solving-who-owns-the-zebra-programmatically!我对 Clojure 尤其是函数式编程相当陌生,这使得这项练习非常具有挑战性。我掉进了很多坑,但我对此很满意,因为这是学习经历的一部分。

我曾经将约束指定为一堆简单的向量,如下所示:

[:con-eq :spain :dog]
[:abs-pos :norway 1]
[:con-eq :kools :yellow]
[:next-to :chesterfields :fox]

其中每个向量的第一个将指定约束的类型。但这导致我对这些规则的调度机制的实现很尴尬,所以我决定将它们编码为(引用的)函数调用:

'(coloc :japan :parliament) ; 10
'(coloc :coffee :green) ; 12
'(next-to :chesterfield :fox) ; 5

所以我可以用一个简单的方法来调度约束规则eval。这看起来更加优雅和“口齿不清”。但是,这些函数中的每一个都需要访问我的域数据(名为vars),并且该数据随着程序运行而不断变化。我不想引入额外的参数来破坏我的规则,所以我想要vars可供eval'd 通过动态作用域发挥作用。

我现在了解到可以使用动态范围界定binding,但它还需要一个declare.


你的意思是这样的吗?

(def foo '(bar))
(declare bar)

(binding [bar (fn [] (println "hello bar"))]
  (eval foo))

如果是,您的问题可以简化为:

(let [foo 1]
  (eval 'foo))

这是行不通的,因为 eval 不在词法环境中求值。你可以使用 vars 来解决这个问题:

(declare foo)

(binding [foo 1]
  (eval 'foo))

就这一点而言,Clojure 似乎与 CL 具有相似的语义,参见。这CLHS http://www.lispworks.com/documentation/HyperSpec/Body/f_eval.htm:

评估当前动态环境和空词汇环境中的形式。

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

在 Clojure 中执行动态绑定函数 的相关文章

  • clojure 要求语法原理

    我很难理解 因此记住 此处描述的 clojure require 语法 http clojuredocs org clojure core 1 3 0 clojure core require http clojuredocs org cl
  • Clojure 集合与序列的相等性

    我注意到 Clojure 1 4 似乎很乐意考虑向量等于seq相同的向量 但同样不适用于地图 1 2 seq 1 2 gt true 1 2 seq 1 2 gt false 为什么要这样的行为 这样会有所不同吗 Clojure 的 可以认
  • WPF Datagrid 循环/选择具有特定属性的单元格

    全新的 WPF 对 WinForms 非常熟悉 这可能会让过渡变得更加困难 我正在尝试将旧 WinForms 项目中的一些功能移植到 WPF 中作为学习体验 目标是在 DataGrid 中查找与 TextBox 中的字符串匹配的单元格值 我
  • 对客户端 JavaScript 计算器使用 eval 安全吗?

    我正在制作一个计算器 作为用户浏览器的静态 HTML 页面 该页面并非旨在将任何信息提交回服务器 除了这个计算器之外 网页上不会出现任何其他内容 在这种情况下使用 eval 安全吗 或者换句话说 在这种情况下使用 eval 是否会导致额外的
  • 为什么 SBCL eval 函数会丢失它运行的宏?

    print x 打印出我想要评估的内容 但是 eval x 失败了 但如果我运行 x 它就可以了 我缺少什么 请告诉我为什么这不起作用 或者我是否在做一些愚蠢的事情 我正在尝试打印动态大小的表并设置 lambda 变量以最终计算表中每个单元
  • 命令绑定问题。如何启用命令按钮

    我的代码在这里 gt gt public class Player INotifyPropertyChanging string addressBar public string Url get return addressBar set
  • 确保 Clojure 中只有一个服务实例正在运行/启动/停止的规范方法?

    我正在用 Neo4j 支持的 Clojure 编写一个有状态服务器 它可以服务套接字请求 例如 HTTP 当然 这意味着我需要能够从该服务器内启动和停止套接字服务器 在设计方面 我希望能够在此服务器中声明一个 服务 并启动和停止它 我在 C
  • 设置、让、宏、坚果

    我正在尝试从 html 内容构建一个快速目录 为了简短起见 代码非常简单 defn toc content doseq i take 5 iterate inc 1 let h str h i println content h where
  • 为什么在此 MultiBinding 上未调用 ConvertBack?

    我的组合框列表联系人使用 MultiBinding 绑定到 FullName 和 PhoneExtension IMul tiValueConverter 的 Convert 方法被调用 但 ConvertBack 未被调用 为什么 组合框
  • JSF UIComponent 绑定、可序列化和视图范围

    我有一个视图范围的 bean 实现Serializable and a UIComponent通过绑定传入 ManagedBean ViewScoped public class ViewScopedBean implements Seri
  • 如何在 Jetty 中以编程方式设置 gzip?

    我正在使用 Noir 和 clojure 编写一个网络应用程序 它使用 Jetty Jetty 有两种使用 gzip 的方法 一种用于静态 一种用于动态 它们在https stackoverflow com a 9113129 104021
  • 绑定 Ember TextField 中的计算属性

    我正在尝试将我的数据模型绑定到 Ember js 中的文本字段 该模型有一个表示货币值的字段 例如 1 000 50 然后用户可以更改该值 Ember 接收数字 1000 50 形式的数据 非货币格式 我将视图绑定到具有良好格式的计算属性
  • JavaScript 的 eval() 什么时候不是邪恶的?

    我正在编写一些 JavaScript 代码来解析用户输入的函数 用于类似电子表格的功能 解析了公式我could将其转换为 JavaScript 并运行eval 就可以得到结果了 然而 我一直回避使用eval 如果我可以避免它 因为它是邪恶的
  • Clojure 符号名称中的美元符号 ($)

    我一直在编写 clojure 解析器并遇到以下语法 defn key Returns the key of the map entry added 1 0 static true java util Map Entry e e getKey
  • WPF 简单绑定到对象属性

    我在 wpf xaml 中绑定时遇到一些问题 有这个简单的文件
  • 将 Combobox 控件绑定到 DataGrid 中的单独源

    我尝试在 DataGrid 中使用 ComboBox 这将允许用户选择来自不同表的值 我使用 ViewModel 类作为 DataContext 其中包含一个用于终端的 ObservableCollection 和另一个用于 Termina
  • 如何在 RHEL 6.1 / JDK7 上安装 Clojure 1.3 with contribs?

    我一直在努力让它发挥作用 获取 clojure 1 3 是一件轻而易举的事 但现在我一直在尝试安装 contrib 库 但遇到了错误 有关于如何正确执行此操作的指南吗 旧的 clojure contrib 整体库与 clojure 1 3
  • AngularJS $scope 没有观察视图的变化

    我有这个小样本 我希望在浏览器控制台中看到日志消息 表明 scope watcher 运行良好 但不幸的是事实并非如此
  • 在 PHP 中调用用户定义的函数 eval()

    我一直在使用 eval 函数进行 php 测试 但 eval 似乎无法正确调用用户定义的函数 请看我的例子 function equals a b if t r return true else throw new Exception ex
  • jQuery 日期选择器在 AJAX 之后不持久

    所以我使用 jQuery 日期选择器 它运行良好 我正在使用 AJAX 来获取一些内容 显然当应用这个新内容时 绑定会丢失 我上周了解到这一点 https stackoverflow com questions 2773573 jquery

随机推荐