2

这个问题越想越觉得不对劲……

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

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

我的第一个想法是在值中引用一个表达式,然后eval在所述函数中对其进行操作。第二个想法是用 a 替换值fn,但这似乎返回类似于引用表达式的内容。

让我试着描述一下这个问题:

  • 模型结果图应该类似于 {:a 1 :b 2 :c 3}
  • 构造函数类似于

    (defn cons-field [b]
      {:a (fn [name] (str name "!"))
       :b b
       :c "default"})
    
  • 项目已创建(def a-field (cons-field 5))

  • 使用地图的调用函数类似于

     (defn the-function [name field]
       (str (get-in field [:a])))
    

现在我需要的是这个:a的值是'the-function'中参数名称的函数。当然最后一个功能不起作用,我不确定它是否是正确的方法。':a' 键并不总是 a fn; 有时它只是一个字符串文字。有任何想法吗?

干杯!

4

2 回答 2

0

所以这就是我在 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 "!"))

希望这对其他人有帮助:)

于 2013-07-02T15:56:12.167 回答
0

根据您发布的内容,实际上不可能理解您的问题。我能为您做的就是告诉您您提供的代码做了什么,并猜测您希望它做什么。

(def r (cons-field 5))r使用(r :b)= 5, (r :c)= "default" 和(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])相同。将使用 str 对该 fn 进行字符串化,并且很可能返回类似“user.fn$23092....”的内容(field :a)(fn [name] ...)the-function

如果要the-function返回(fn [name] ...)传递给函数的名称调用的结果,则需要更改the-function如下:

(defn the-function 
  [name field]
  (str ((field :a) name)))

如果你想the function根据:a的实际值返回其他东西,你可以检查它是否是一个函数并用名称调用它,否则返回值。

(defn the-function
  [name field]
  (when-let [v (field :a)]
    (or (when (fn? v)
          (v name))
        v)))

现在阅读您自己的答案,我更加困惑您要解决的实际问题,但我希望这个答案可以提供帮助。

于 2013-07-02T16:04:46.620 回答