【发布时间】:2013-07-02 13:50:07
【问题描述】:
这个问题我越想越觉得不对……
我在我的程序中定义了类似“地图构造函数”的东西。这背后的想法是我有一个通用的地图结构来处理一些“项目”,但我想为特定类型的项目强制执行一些默认值。
我遇到的问题是这个“地图构造函数”有一个 k-v 对,并且该对的值应该由使用该地图的函数确定(在下面的示例中可能会更清楚)。
我的第一个想法是在值中引用一个表达式,然后在上述函数中对其执行eval。第二个想法是将值替换为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' 键并不总是fn;有时它只是一个字符串文字。有什么想法吗?
干杯!
【问题讨论】:
-
代替构造函数,为什么不用
assoc到默认映射呢?对于一般问题,尝试将逻辑与数据分离,并从对数据的连续转换的角度进行思考。您能否提供更多详细信息或示例,说明您到底想要完成什么? -
我最初的想法是合并两个地图,但是通过提供构造函数,您有点限制有效输入。我知道我应该将逻辑和数据分开,但是对于这个特殊的问题,我想不出一个通用的方法来处理它。实际问题与工作有关,我不喜欢共享代码,但想法是一样的。我需要生成一些报告,对于每个报告,此字段具有不同的功能。
-
@DimitriosK.,你仍然可以让你的构造函数提供默认值(比如
:c),只是不要提供:a。如果需要通过函数调用确定:a的值,则在地图上进行转换。 -
@JeremyHeiler,是的,我在地图外创建了一个新函数,并在调用者上创建了一个
cond以确定它是否是特殊情况,然后调用该函数。 :)
标签: clojure