在 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中的map函数打印哈希映射列表的每个元素?

    我正在构建一个哈希映射列表 然后将其传递给另一个函数 当我尝试使用打印列表中的每个哈希映射时map它不工作 我可以打印完整列表或获取第一个元素等 defn m a println a map println a 以下仅适用于 repl m
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 将 Combobox 控件绑定到 DataGrid 中的单独源

    我尝试在 DataGrid 中使用 ComboBox 这将允许用户选择来自不同表的值 我使用 ViewModel 类作为 DataContext 其中包含一个用于终端的 ObservableCollection 和另一个用于 Termina
  • WPF:绑定到 ControlTemplate 中的命令

    我正在尝试向自定义 ListView MyListView 添加一个按钮 该按钮会触发 MyListView 中定义的命令 MyCustomCommand 我通过应用 ControlTemplate 添加了按钮 和标题文本 问题是我还没有找
  • Visibility = IsCollapsed 是否跳过数据绑定部分?

    如果我将 StackPanel 或任何绑定区域设置为 折叠 数据会加载吗 它会触发它的 Loaded 事件吗 Yes 您的数据绑定将被评估 您的初始化事件将会触发 并且 您的 Loaded 事件将会触发 但在视觉树的部分中Visibilit
  • 如何对“2-1”这样的字符串进行数学计算以产生“1”?

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

    我一直在努力解决欧拉计划 https projecteuler netClojure 中的问题得到了改善 我已经遇到过几次素数生成问题 我的问题是它花费的时间太长了 我希望有人能帮助我找到一种有效的方法 以 Clojure 的方式做到这一点
  • Clojure实现多线程的最佳方法?

    我正在开发一个用 Clojure 编写的 MUD 客户端 现在 我需要两个不同的线程 一种接收用户的输入并将其发送到 MUD 通过简单的套接字 另一种读取 MUD 的输出并将其显示给用户 我应该只使用 Java 线程 还是应该使用一些特定于
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 使用 swank-clojure 攻击 Clojure 库的工作流程

    Clojure 库的黑客攻击有典型的工作流程吗 假设我的应用程序 Foo 依赖于第三方库 Bar 该库是从存储库获取的 并通过以下方式包含在项目 Foo 中lein deps 然后 假设我想破解 Bar 库 所以我从 github 克隆它
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 如何在silverlight中将子元素的宽度绑定到父元素的宽度

    我有一个宽度为 1 的网格 所以我认为实际宽度是在运行时决定的 在该网格中 我有另一个网格 我想将其宽度设置为父网格的运行时宽度 我如何通过绑定在 xaml 中做到这一点 我想这实际上会对你有帮助 Width Binding ActualW
  • 使用引用的 ItemsSource 绑定到 SelectedItem

    Intro 我有一个不同的数据源池 我有口罩 面具有索引线 每个 Indexline 都有一个来自关联池的数据源 Classes public class DataSource public string Name get set publ
  • 如何检测我正在 eval() 调用中?

    是否存在字符串s这样 new Function s and eval s 表现不同 我正在尝试 检测 字符串的评估方式 检查是否有arguments目的 如果它存在 那么您就在该函数中 如果没有 那就已经是evaled 请注意 您必须将支票
  • 行为和视图模型在 MVVM 中如何关联?

    所以我在学习MVVM的时候偶然发现了一个问题 我有一个包含 TextBlock 的 TreeView 当我双击 TreeView 中的任何 TextBlock 时 我想对其执行操作 我开始学习行为 并且我有一个很好的示例来说明如何实现行为
  • 调用 Clojure 高阶函数

    如果我定义一个返回如下函数的函数 defn add n n fn x x n 然后我可以将结果分配给一个符号 def add 1 add n 1 并称其为 add 1 41 gt 42 我如何调用结果 add n 1 而不将其分配给新符号
  • ObjectController 上的绑定 - Ember.js

    当您尝试将绑定添加到ObjectController它不起作用 App FailController Em ObjectController extend content null myBinding App router myContro
  • 如何在 REPL 中显示 Clojure 中函数的定义?

    我正在寻找让 REPL 打印函数当前定义的能力 有什么办法可以做到这一点吗 例如 给定 defn foo if true true 我想说类似的话 print definition foo 并得到一些类似的东西 foo if true tr
  • 锚标记 href 中的 eval

    我想要实现的目标是在锚标记的 href 中使用 Eval 作为参数 锚点嵌套在转发器内 为什么我不能使用后面的代码来实现这一点 我尝试了一些事情但没有运气 a href http MyWebsite ActiveUsers ID Inser
  • Common Lisp 中的原子和 Clojure 中的原子有什么区别?

    下列page http clojure org atoms讨论原子在 Clojure 中的工作原理 它并没有详细说明 Clojure 和其他 lisp 方言中原子之间的差异 Common Lisp 中的原子和 Clojure 中的原子之间的

随机推荐