问题标签 [clojure.spec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
642 浏览

clojure - 具有命名参数的函数的真实 Clojure 规范

假设我们有一个函数clothe,它需要一个位置参数person以及一些可选的命名参数:hat,:shirt:pants

我目前为此函数编写规范的方式是:

那么问题是它允许像这样的参数列表

即使语言本身允许,这也可能是一个错误。但也许比这更糟糕的是,它使生成的数据与通常调用函数的方式不现实:

更糟糕的是,如果您碰巧有一个递归定义,spec/*则无法限制在代码上运行测试时生成的潜在递归发生的数量。

那么我的问题就变成了:有没有办法为函数指定命名参数,将每个键的出现次数限制为一个?

0 投票
4 回答
405 浏览

clojure - 是否可以在将符号传递给 Clojure 中的宏之前将其解析为其值?

假设我有以下关键字数组

我想在两个规格中重用;一种用于定义映射,另一种用于定义函数的可选参数。

那么问题是keysandkeys*得到了引用的符号'keys,而不是它所引用的变量中保存的解析值。

所以我的问题是:是否可以像普通的 lisp#.阅读器宏一样在读取时解析键的值,或者如果宏获得符号而不是列表文字,是否必须重新定义才能解析符号?

0 投票
1 回答
230 浏览

clojure - 通过 Clojure Spec 使用命名参数执行宏

假设我们有一个宏,它接受一个必需的参数,后跟可选的位置参数,例如

我们为它写了一个规范,就像

我们会发现spec/exercise-fn无法执行宏

即使函数生成器生成的数据被宏接受得很好:

另一方面,定义一个函数并以相同的方式执行它可以正常工作:

如果我们看一下具有类似定义模式的内置宏,我们会看到同样的问题:

一件有趣的事情是,exercise-fn当总是存在一个必需的命名参数时,它可以正常工作:

换句话说:似乎有一些隐藏的参数在正常调用期间总是传递给宏,而这些参数不是由规范传递的。遗憾的是,我对 Clojure 的经验不够了解这些细节,但一只小鸟告诉我,有些东西名为 &env 和 &form。

但我的问题归结为:是否有可能以一种spec/exercise-fn可以很好地锻炼它的方式来指定一个带有命名参数的宏?

附录:

keys*用 an包裹and似乎exercise-fn再次中断,即使它有一个必需的命名 arg。

0 投票
2 回答
1656 浏览

clojure - Clojure 中的生成测试是什么?

我遇到了Generative Testing in Clojure with spec一个概念,并想了解它。

还提供一些示例将非常有用。

0 投票
3 回答
395 浏览

clojure - Clojure 指定一个自然数

自然数是一个非负整数。你会如何用 Clojure Spec 表达这一点?

0 投票
1 回答
280 浏览

clojure - 使用 Clojure Spec 合并命名参数的两组键的生成器

让我们看一下 Clojure 规范指南中给出的示例clojure.spec/merge

根据这个规范,我们既可以生成数据,又可以验证它:

但是,如果我们要稍微修改规范,使其用于一系列命名参数而不是映射,例如

,我们仍然可以根据规范验证数据:

但是我们确实失去了生成数据的能力:

这是我这边的错误,规范中的实现错误,或者只是clojure.spec/merge打算工作的方式?我们可以通过附加发电机来解决这个问题吗?

0 投票
1 回答
402 浏览

clojure - Clojure 正则表达式文字规范

我的地图中的一个键应该包含一个 Clojure(Script) 正则表达式,一个正则表达式文字。如何编写既匹配又可以生成的规范?

请注意,这个问题不是关于匹配由正则表达式表示的字符串,而是匹配正则表达式本身。

0 投票
1 回答
1763 浏览

clojure - 具有非关键字键的映射的 Clojure 规范

让我们看一下 Leiningen 项目地图的真实示例:global-vars

它允许 leiningen 的用户在其项目范围内重新定义 Clojures 全局变量的默认值。

现在,如果此映射的键由关键字组成,我们将使用clojure.spec/keys首先指定哪些键可以是映射的一部分,然后分别定义这些键下预期的值。但是由于clojure.spec/keys默默地忽略了 and 中的非关键字:req并为and:req-un抛出异常(从 alpha15 开始),我们必须以某种方式解决这个问题。:opt:opt-un

我们可以通过

其余的我们可以通过阅读文档来填写。但是我的问题是:我们如何编写一个规范来确保如果映射包含键'*assert*,它只会保存布尔值?

0 投票
2 回答
755 浏览

clojure - 谓词函数的 Clojure 规范

我想为函数作为谓词的含义编写一个规范。在 Clojure 世界中,似乎有三种方法可以了解谓词是什么,尽管大多数人似乎都同意它们应该以问号结尾。

  1. 接受一个参数并返回真或假的函数。
  2. 接受一个参数并返回 true、false 或 nil 的函数。
  3. 一个函数,它接受一个参数并返回一个真值或假值。

关于 Predicate 是什么的 Jira Ticket

编辑:谓词也可以采用多个参数,例如contains?.

0 投票
1 回答
128 浏览

clojure - 如何取消嵌套序列规范?

使用 Clojure core.spec 我可以拥有以下内容:

我想要的是通过外部化子规范来消除冗余:

这个有效:

所以我正在寻找的是一个可以工作的函数或宏(比如 unnest):

我怎么能得到那个?