variables - 定义相互依赖的变量

标签 variables clojure mutual-recursion

我需要定义相互依赖的变量。我的意思是一个 var 包含例如一个带有另一个 var 的向量,反之亦然。以下代码说明了这一点:

(declare a b)
(def a [1 b])
(def b [a 2])

但是在加载这段代码后我得到了这个:

test=> (first a)
1
test=> (second a)
#<Unbound Unbound: #'test/b>
test=> (first b)
[1 #<Unbound Unbound: #'test/b>]
test=> (second b)
2

显然,这不是它应该的工作方式。 我知道打印这样的结构会导致堆栈溢出,但我不需要打印它。我应该怎么做?

最佳答案

您可以执行以下操作:

(declare a b)
(def a [1 #'b])
(def b [#'a 2])

@(a 1)
=> [#'user/a 2]

请注意,#' 是一个引用变量的读取器宏。

虽然我仍然不太确定你为什么要这样做......试图让 vars 像这样相互依赖对我来说似乎是一种非常糟糕的代码味道。很可能无论您尝试做什么实际上都可以通过不同的方法得到最好的解决。

编辑

额外的评论指出问题与不同类型的实体相互引用有关,我认为更好的方法是使用关键字映射,例如

(def my-model
  {:a 
      {:name "Entity A" 
       :references [:b]}
   :b 
      {:name "Entity B"
       :references [:a]}}

关于variables - 定义相互依赖的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9323251/

相关文章:

Clojure:如何生成 'trie' ?

java - 在java中将两个相互递归方法转换为单个递归方法?

c# - 这是如何导致无限循环的?

Android:如何将变量值存储到注册表?

javascript - 如何使用 JavaScript 设置函数参数?

android - 让 Intent 转到我的主 xml 文件中的布局

Clojure.spec:如何规范对随机变化敏感的数据结构?

php - 使用PHP的“Notice: Undefined variable”,“Notice: Undefined index”和“Notice: Undefined offset”

动态 var 的 Clojure 绑定(bind)未按预期工作

c++ - 程序返回值 -1073741571 而不是永远