- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现自己写了很多这样的规范:
(s/def ::name string?)
(s/def ::logUri string?)
(s/def ::subnet (s/and string? #(> (count %) 5)))
(s/def ::instanceType string?)
...
(s/def ::key (s/and string? #(> (count %) 5)))
(s/def ::instanceCount string?)
(s/def ::bidPct string?)
即很多s/and
和s/def
。这似乎是一种浪费。所以我决定编写一个宏来为我完成这个任务。像这样的东西:
(defmacro and-spec [validations]
(doseq [[keyname & funcs] validations]
`(s/def ~keyname (s/and ~@funcs))))
所以我可以做这样的事情:
(and-spec [[::name1 [string?]]
[::name2 [string? #(> (count %) 5)]]])
这将为我完成所有 s/def
的工作。不幸的是,上面的宏不起作用,但我不知道为什么。
(s/valid? ::name1 "asdf")
Execution error at emr-cli.utils/eval6038 (form-init17784784591561795514.clj:1).
Unable to resolve spec: :emr-cli.utils/name1
这项工作的较小版本:
(defmacro small-and-spec-works [key-name validations]
`(s/def ~key-name (s/and ~@validations)))
=> #'emr-cli.utils/tsmall
(and-spec-small-works ::mykey [string?])
=> :emr-cli.utils/mykey
(s/valid? ::mykey "asdf")
=> true
但是当我引入 let 绑定(bind)时,事情就开始变得奇怪了:
(defmacro small-and-spec [validation]
(let [[key-name & valids] validation]
`(s/def ~key-name (s/and ~@valids))))
=> #'emr-cli.utils/small-and-spec
(small-and-spec [::mykey2 [string?]])
=> :emr-cli.utils/mykey2
(s/valid? ::mykey2 "asdf")
Execution error (IllegalArgumentException) at emr-cli.utils/eval6012 (form-init17784784591561795514.clj:1).
Key must be integer
doseq
宏发挥作用?small-and-spec
出了什么问题,导致出现 Key must be integer
错误?最佳答案
(defmacro and-spec [defs]
`(do
~@(map (fn [[name rest]]
`(s/def ~name (s/and ~@rest))) defs)))
doseq
用于副作用。它总是返回nil
。
关于clojure - 使用宏和doseq来生成spec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64498602/
我最近一直在使用 clojure,遇到了一个我不知道如何处理的问题。我有一个包含 7 个参数的 dideq,它扩展到一个巨大的 block ,几乎超过了最大类大小。为什么doseq 会扩展到如此巨大的
我需要根据 Clojure 集合的元素将一些内容写入文件,我可以这样做——但我遇到了一些让我感到困惑的事情。可能是因为我不完全理解时间宏,但是当我执行以下操作时: => (def nums (take
user=> (def r (range 1)) user=> (for [a r, b r, c r, d r, e r, f r, g r, h r :when (and (= 0 a) (not
我写了一个简单的程序,它接受一个数字 n 和一个列表作为输入。然后将列表中的每个元素打印 n 次。 我最初尝试过这个 (defn list-repl [num lst] (doseq [elem
我正在通过解决问题来学习 Clojure,我陷入困境 with one of them ,基本上我必须在日志文件中找到前五个字符串。 这是我到目前为止所得到的: (ns topfive (:imp
我是 Clojure 新手。我有一个 map 向量: (def vecmap [{:a "hello"} {:a "hi"} {:a "hey"}]) 基本上我想检查 map 向量中是否存在给定值。我
这在其他语言中通常是微不足道的,但我在 Clojure 中找不到这样的例子。 我可以使用以下方法打印整个文件: (with-open [rdr (io/reader "file")]
我是 Clojure 新手。我有一个 map 向量: (def vecmap [{:a "hello"} {:a "hi"} {:a "hey"}]) 基本上我想检查 map 向量中是否存在给定值。我
在尝试复制一些 websockets 示例时,我遇到了一些我不理解且似乎无法找到文档的行为。简单来说,这是我在 lein 中运行的一个示例,它应该每秒为共享 map 中的每个元素运行一次函数: (de
我正在通过 SICP 进行工作 - 一项练习是实现 foreach (doseq)。 这是一个学术练习。在 Clojure 中,这是我想出的: (defn for-each [proc, items]
我正在尝试从 let 语句返回一个列表。 (let [data []] (doseq [x ["0" "1" "2" "3" "4"]] (into data (do-stuff x))) da
如果您一整天都在关注我的问题, 我正在 clojure 中做一个类项目,但在读取文件、解析文件以及根据其内容创建图表时遇到困难。我已成功打开并读取文件并根据需要解析行。我现在面临的问题是根据读入的数据
我不太确定如何表达该主题的名称,因此如果您可以澄清,请这样做。 我的示例代码是这样的: (doseq [x [1 2 3] y [3 2 1]] (println (str x y))) 该代码的输出
我是一名优秀的程序员,十分优秀!