小编fra*_*ank的帖子

fdef的clojure.spec验证

我试图在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 clojure.spec

6
推荐指数
1
解决办法
708
查看次数

clojure.spec coll-of 替代类型

我正在使用 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 …

clojure clojure.spec

3
推荐指数
1
解决办法
2352
查看次数

在Clojure向量中查找类似正则表达式的值序列

我正在使用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 ?表示匹配中的可选值.

clojure

3
推荐指数
1
解决办法
187
查看次数

Mongo子文档数组中的多子文档更新

我正在尝试更新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)

mongoose mongodb node.js

2
推荐指数
1
解决办法
2686
查看次数

Clojure.spec“或”等价于“ s / and”

我很喜欢和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

clojure clojure.spec

1
推荐指数
1
解决办法
198
查看次数

Clojure将地图矢量转换为矢量值的地图

有一些与此主题相关的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中有一种优雅而有效的方法吗?

clojure

1
推荐指数
1
解决办法
206
查看次数

标签 统计

clojure ×5

clojure.spec ×3

mongodb ×1

mongoose ×1

node.js ×1