[英]Clojure: Function to determine map's value
我对这个问题的思考越深,似乎就越错了……
我在程序中定义了类似“地图构造函数”的内容。 这背后的想法是,我有一个通用的地图结构来处理一些“项目”,但我想对特定种类的项目强制执行一些默认设置。
我的问题是此“地图构造函数”具有一个kv对,并且该对的值应由使用此地图的函数确定(在下面的示例中可能会更清楚)。
我的第一个想法是在值中引用一个表达式,然后在所述函数中对其eval
值。 第二个想法是用fn
替换值,但这似乎返回与引用的表达式类似的东西。
让我尝试描述问题:
构造函数类似于
(defn cons-field [b] {:a (fn [name] (str name "!")) :bb :c "default"})
物料已创建(def a-field (cons-field 5))
消耗地图的调用函数类似于
(defn the-function [name field] (str (get-in field [:a])))
现在我需要的是:a的值是'the-function'中参数名称的函数。 当然,最后一个功能不起作用,而且我不确定这是否是正确的方法。 ':a'键并不总是fn
; 有时,它只是一个字符串文字。 有任何想法吗?
干杯!
所以这就是我在A. Webb和Jeremy Heiler的评论后解决此问题的方法。
最初的构造函数更改为:
(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-field 5))
创建一个哈希映射r
其中(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))
关于the-function
:将呼叫(get-in field [:a])
是一样的(field :a)
并返回功能(fn [name] ...)
the-function
将使用str对该fn进行字符串化,并且很可能返回类似“ user.fn $ 23092 ....”的内容。
如果要让the-function
返回将名称传递给函数的调用结果(fn [name] ...)
,则需要如下更改the-function
:
(defn the-function
[name field]
(str ((field :a) name)))
如果您希望the function
根据:a的实际值返回其他内容,则可以检查它是否是一个函数并使用name调用它,否则返回该值。
(defn the-function
[name field]
(when-let [v (field :a)]
(or (when (fn? v)
(v name))
v)))
现在,从您自己的答案中读取内容,我会更加困惑您要解决的实际问题,但是我希望这个答案可以提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.