我试图在clojure.spec中使用版本编写更高阶的函数1.9.0-alpha11,但是无法对返回的函数执行验证.
使用clojure.spec指南的高阶函数部分中的示例,我将adder表单定义为:
(defn adder [x] #(+ x %))
Run Code Online (Sandbox Code Playgroud)
如指南中所述,我创建了一个规范:
(s/fdef adder
:args (s/cat :x number?)
:ret (s/fspec :args (s/cat :y number?)
:ret number?)
:fn #(= (-> % :args :x) ((:ret %) 0)))
Run Code Online (Sandbox Code Playgroud)
当我在repl中执行它时,抛出异常而不是所需的规范验证错误:
user> (def add2 (adder 2))
#'user/add2
user> (add2 2)
4
user> (add2 "s")
ClassCastException java.lang.String cannot be cast to java.lang.Number clojure.lang.Numbers.add (Numbers.java:128)
user>
Run Code Online (Sandbox Code Playgroud)
我试图改变规格(stest/instrument `adder).虽然这适用于函数,但它不适用于高阶函数.
我正在使用 clojure.spec 来验证地图条目的向量。向量看起来像:
[{:point {:x 30 :y 30}}
{:point {:x 34 :y 33}}
{:user "joe"}]
Run Code Online (Sandbox Code Playgroud)
我想将规范结构化为需要 1..N::point个条目并且只有一个::user条目。
这是我构建这个规范的(失败的)尝试:
(s/def ::coord (s/and number? #(>= % 0)))
(s/def ::x ::coord)
(s/def ::y ::coord)
(s/def ::point (s/keys :req-un [::x ::y]))
(s/def ::user (s/and string? seq))
(s/def ::vector-entry (s/or ::pt ::user))
(s/def ::my-vector (s/coll-of ::vector-entry :kind vector))
Run Code Online (Sandbox Code Playgroud)
当我只运行一个::point条目的验证时,它可以工作:
spec> (s/valid? ::point {:point {:x 0 :y 0}})
true
spec> (s/valid? ::my-vector [{:point {:x 0 :y 0}}])
false
Run Code Online (Sandbox Code Playgroud)
关于如何构造s/or …
我正在使用libpostal库在新闻文章中查找完整地址(街道,城市,州和邮政编码).给定输入文本时的libpostal:
位于CO 10566的Main Street Boulder发生了一起事故 - 位于Wilson的拐角处.
返回一个向量:
[{:label "house", :value "there was an accident at 5"}
{:label "road", :value "main street"}
{:label "city", :value "boulder"}
{:label "state", :value "co"}
{:label "postcode", :value "10566"}
{:label "road", :value "which is at the corner of wilson."}
Run Code Online (Sandbox Code Playgroud)
我想知道在Clojure中是否有一种聪明的方法来提取序列中出现:label值的序列:
[road unit? level? po_box? city state postcode? country?]
Run Code Online (Sandbox Code Playgroud)
where ?表示匹配中的可选值.
我正在尝试更新Mongo集合中的多个子文档,其中同一集合中可能存在多个匹配项.不幸的是,它只更新每个文档中具有匹配项的第一个子文档.
这是代码:
var mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1/touchbits');
var PartsSchema = new mongoose.Schema({
type: String
, partNbr: Number
});
var ProductSchema = new mongoose.Schema({
sku: { type: String, unique: true }
, parts: [PartsSchema]
});
Product = mongoose.model('Product', ProductSchema);
var cigars = new Product({
sku: 'cigar123',
parts: [{type: 'tobacco', partNbr: 4},
{type: 'rolling paper', partNbr: 8},
{type: 'tobacco', partNbr: 4}]
});
var cigarillo = new Product({
sku: 'cigarillo456',
parts: [{type: 'tobacco', partNbr: 4},
{type: 'crush paper', partNbr: 12}]
});
cigars.save(function(err, product1) …Run Code Online (Sandbox Code Playgroud) 我很喜欢和clojure.spec; 它有助于发现更接近原因的数据错误。目前,我正在使用它来验证对Web服务器请求的响应,但是我对clojure.spec操作的语法有困难,该语法允许两个不同的地图结构响应。
在我的数据中,Web服务器请求有两种可能的响应:
{:assignment "1232123"} 和
{:no-more-assignments true}
我可以使用multi-spec,但这似乎很冗长,因为对于每种情况只有一个规范并将该规范定义为:
(s/def ::response
(s/or ::case-1 ::case-2))
Run Code Online (Sandbox Code Playgroud)
是否有我需要忽略的语法或需要使用的语法multi-spec?
有一些与此主题相关的SO帖子,但是我找不到任何适用于我想要实现的内容.
我有一张地图矢量.我将使用来自另一个相关SO帖子的示例:
(def data
[{:id 1 :first-name "John1" :last-name "Dow1" :age "14"}
{:id 2 :first-name "John2" :last-name "Dow2" :age "54"}
{:id 3 :first-name "John3" :last-name "Dow3" :age "34"}
{:id 4 :first-name "John4" :last-name "Dow4" :age "12"}
{:id 5 :first-name "John5" :last-name "Dow5" :age "24"}]))
Run Code Online (Sandbox Code Playgroud)
我想将其转换为一个映射,每个条目的值是相关值的向量(保持顺序data).
这是我想要的输出:
{:id [1 2 3 4 5]
:first-name ["John1" "John2" "John3" "John4" "John5"]
:last-name ["Dow1" "Dow2" "Dow3" "Dow4" "Dow5"]
:age ["14" "54" "34" "12" "24"]}
Run Code Online (Sandbox Code Playgroud)
在Clojure中有一种优雅而有效的方法吗?