Clojure:用于确定映射的函数';s值
我越想这个问题,它就越错 我在我的程序中定义了类似“映射构造函数”的东西。这背后的想法是,我有一个通用的映射结构来处理一些“项”,但我想为特定类型的项强制一些默认值 我遇到的问题是,这个“映射构造函数”有一个k-v对,该对的值应该由使用该映射的函数确定(在下面的示例中可能会更清楚) 我的第一个想法是在值中引用一个表达式,然后在所述函数中对其执行Clojure:用于确定映射的函数';s值,clojure,Clojure,我越想这个问题,它就越错 我在我的程序中定义了类似“映射构造函数”的东西。这背后的想法是,我有一个通用的映射结构来处理一些“项”,但我想为特定类型的项强制一些默认值 我遇到的问题是,这个“映射构造函数”有一个k-v对,该对的值应该由使用该映射的函数确定(在下面的示例中可能会更清楚) 我的第一个想法是在值中引用一个表达式,然后在所述函数中对其执行eval。第二个想法是用fn替换该值,但这似乎返回了类似于引用表达式的内容 让我试着描述一下这个问题: 模型生成的映射应该类似于{:a1:b2:c3}
eval
。第二个想法是用fn
替换该值,但这似乎返回了类似于引用表达式的内容
让我试着描述一下这个问题:
- 模型生成的映射应该类似于{:a1:b2:c3}
- 构造函数类似于
(defn cons-field [b] {:a (fn [name] (str name "!")) :b b :c "default"})
(defn the-function [name field] (str (get-in field [:a])))
- 项目已创建
(def a字段(cons字段5))
- 使用映射的调用函数类似于
(defn cons-field [b] {:a (fn [name] (str name "!")) :b b :c "default"})
(defn the-function [name field] (str (get-in field [:a])))
fn
;有时它只是一个字符串文字。有什么想法吗
干杯 在A.韦伯和杰里米·海勒的评论之后,我就是这样解决这个问题的 初始构造函数已更改为:
(defn cons-field [b]
{:a nil ; either delete completely or comment that
; the case will be handled by the caller
:flag xx ; true or :case-qualifier
:b b
:c "default"})
(defn the-function [name field]
(let [case-q (:flag field)]
(cond
(= case-q :case-qualifier) (get-name name) ; you can have many different cases
; conciser using constants for these qualifiers
(...) ()))) ; else as normal
调用函数已更改为:
(defn cons-field [b]
{:a nil ; either delete completely or comment that
; the case will be handled by the caller
:flag xx ; true or :case-qualifier
:b b
:c "default"})
(defn the-function [name field]
(let [case-q (:flag field)]
(cond
(= case-q :case-qualifier) (get-name name) ; you can have many different cases
; conciser using constants for these qualifiers
(...) ()))) ; else as normal
然后,最初放在映射中的逻辑进入另一个函数:
(defn get-name [name] (str name "!"))
希望这对其他人有所帮助:)根据您发布的内容来理解您的问题是不可能的。我能为您做的就是告诉您提供的代码做什么,并猜测您希望它做什么
(def r(cons字段5))
使用(r:b)
=5、(r:c)
=“默认”和(r:a)
=(fn[name](str name)!)创建哈希映射。如您所见,(r:a)
的结果和(r:c)
的结果都与r或5无关
如果上面描述的结果是您想要的,那么进行一些重构是合乎逻辑的:
(def default-field {:a (fn [name] (str name "!"))
:c "default"})
(def cons-field (partial assoc default-field :b))
关于函数
:调用(进入字段[:A])
与(字段:A)
相同,并将返回函数(fn[名称]…)
函数
将使用str字符串化此fn,并很可能返回类似“user.fn$23092…”的内容
如果希望函数
返回调用(fn[name]…)
的结果,并将名称传递给函数,则需要按如下方式更改函数
:
(defn the-function
[name field]
(str ((field :a) name)))
如果希望函数
根据:a的实际值返回其他值,可以检查它是否是函数并使用name调用它,否则返回值
(defn the-function
[name field]
(when-let [v (field :a)]
(or (when (fn? v)
(v name))
v)))
阅读您自己的答案,现在我更加困惑您试图解决的实际问题,但我希望此答案能够提供帮助。代替构造函数,为什么不将
关联到默认映射?对于一般问题,尝试将逻辑与数据分离,并根据数据上的连续转换进行思考。你能提供更多的细节或例子来说明你到底想要完成什么吗?合并两个映射是我最初的想法,但是通过提供构造函数,你在某种程度上限制了有效的输入。我知道我应该分离逻辑和数据,但对于这个特殊的问题,我无法找到一种通用的方法来处理它。实际的问题与工作有关,我不喜欢共享代码,但想法是一样的。我需要生成一些报告,对于每个报告,此字段具有不同的功能。@Dimitrisk.,您仍然可以使用提供默认值的构造函数(如对于:c
),只是不提供:a
。然后,如果:a
的值需要通过函数调用来确定,则在映射上进行转换。@JeremyHeiler,是的,我在映射之外创建了一个新函数,在调用方上创建了一个cond
,以确定它是否是特殊情况,然后调用该函数。:)我在解决方案中所做的基本工作是从映射中取出函数(因为函数对所有内容都是相同的),并将其作为一个单独的函数,并添加一个标志,以确定调用方是应该调用此函数还是只使用字段中的字符串。我承认我的英语不是最好的,而且我在clojure和FP的经历已经有4周了。。。感谢您提供的解决方案,我将尝试一下。我以为您希望在映射中使用该函数,以便以后可以用其他采用[name]的函数替换它。如果您还有任何问题,请随时提问:)