Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:用于确定映射的函数';s值_Clojure - Fatal编程技术网

Clojure:用于确定映射的函数';s值

Clojure:用于确定映射的函数';s值,clojure,Clojure,我越想这个问题,它就越错 我在我的程序中定义了类似“映射构造函数”的东西。这背后的想法是,我有一个通用的映射结构来处理一些“项”,但我想为特定类型的项强制一些默认值 我遇到的问题是,这个“映射构造函数”有一个k-v对,该对的值应该由使用该映射的函数确定(在下面的示例中可能会更清楚) 我的第一个想法是在值中引用一个表达式,然后在所述函数中对其执行eval。第二个想法是用fn替换该值,但这似乎返回了类似于引用表达式的内容 让我试着描述一下这个问题: 模型生成的映射应该类似于{:a1:b2:c3}

我越想这个问题,它就越错

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

我遇到的问题是,这个“映射构造函数”有一个k-v对,该对的值应该由使用该映射的函数确定(在下面的示例中可能会更清楚)

我的第一个想法是在值中引用一个表达式,然后在所述函数中对其执行
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])))
    
现在我需要的是:a的值是“函数”中参数名的函数。当然,最后一个函数不起作用,我不确定它是否是正确的方法。“: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]的函数替换它。如果您还有任何问题,请随时提问:)