繁体   English   中英

Clojure:确定地图值的功能

[英]Clojure: Function to determine map's value

我对这个问题的思考越深,似乎就越错了……

我在程序中定义了类似“地图构造函数”的内容。 这背后的想法是,我有一个通用的地图结构来处理一些“项目”,但我想对特定种类的项目强制执行一些默认设置。

我的问题是此“地图构造函数”具有一个kv对,并且该对的值应由使用此地图的函数确定(在下面的示例中可能会更清楚)。

我的第一个想法是在值中引用一个表达式,然后在所述函数中对其eval值。 第二个想法是用fn替换值,但这似乎返回与引用的表达式类似的东西。

让我尝试描述问题:

  • 模型生成的映射应类似于{:a 1:b 2:c 3}
  • 构造函数类似于

     (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM