问题标签 [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.
clojure - 具有命名参数的函数的真实 Clojure 规范
假设我们有一个函数clothe
,它需要一个位置参数person
以及一些可选的命名参数:hat
,:shirt
和:pants
。
我目前为此函数编写规范的方式是:
那么问题是它允许像这样的参数列表
即使语言本身允许,这也可能是一个错误。但也许比这更糟糕的是,它使生成的数据与通常调用函数的方式不现实:
更糟糕的是,如果您碰巧有一个递归定义,spec/*
则无法限制在代码上运行测试时生成的潜在递归发生的数量。
那么我的问题就变成了:有没有办法为函数指定命名参数,将每个键的出现次数限制为一个?
clojure - 是否可以在将符号传递给 Clojure 中的宏之前将其解析为其值?
假设我有以下关键字数组
我想在两个规格中重用;一种用于定义映射,另一种用于定义函数的可选参数。
那么问题是keys
andkeys*
得到了引用的符号'keys
,而不是它所引用的变量中保存的解析值。
所以我的问题是:是否可以像普通的 lisp#.
阅读器宏一样在读取时解析键的值,或者如果宏获得符号而不是列表文字,是否必须重新定义才能解析符号?
clojure - 通过 Clojure Spec 使用命名参数执行宏
假设我们有一个宏,它接受一个必需的参数,后跟可选的位置参数,例如
我们为它写了一个规范,就像
我们会发现spec/exercise-fn
无法执行宏
即使函数生成器生成的数据被宏接受得很好:
另一方面,定义一个函数并以相同的方式执行它可以正常工作:
如果我们看一下具有类似定义模式的内置宏,我们会看到同样的问题:
一件有趣的事情是,exercise-fn
当总是存在一个必需的命名参数时,它可以正常工作:
换句话说:似乎有一些隐藏的参数在正常调用期间总是传递给宏,而这些参数不是由规范传递的。遗憾的是,我对 Clojure 的经验不够了解这些细节,但一只小鸟告诉我,有些东西名为 &env 和 &form。
但我的问题归结为:是否有可能以一种spec/exercise-fn
可以很好地锻炼它的方式来指定一个带有命名参数的宏?
附录:
keys*
用 an包裹and
似乎exercise-fn
再次中断,即使它有一个必需的命名 arg。
clojure - Clojure 中的生成测试是什么?
我遇到了Generative Testing in Clojure with spec
一个概念,并想了解它。
还提供一些示例将非常有用。
clojure - Clojure 指定一个自然数
自然数是一个非负整数。你会如何用 Clojure Spec 表达这一点?
clojure - 使用 Clojure Spec 合并命名参数的两组键的生成器
让我们看一下 Clojure 规范指南中给出的示例clojure.spec/merge
根据这个规范,我们既可以生成数据,又可以验证它:
但是,如果我们要稍微修改规范,使其用于一系列命名参数而不是映射,例如
,我们仍然可以根据规范验证数据:
但是我们确实失去了生成数据的能力:
这是我这边的错误,规范中的实现错误,或者只是clojure.spec/merge
打算工作的方式?我们可以通过附加发电机来解决这个问题吗?
clojure - Clojure 正则表达式文字规范
我的地图中的一个键应该包含一个 Clojure(Script) 正则表达式,一个正则表达式文字。如何编写既匹配又可以生成的规范?
请注意,这个问题不是关于匹配由正则表达式表示的字符串,而是匹配正则表达式本身。
clojure - 具有非关键字键的映射的 Clojure 规范
让我们看一下 Leiningen 项目地图的真实示例:global-vars
:
它允许 leiningen 的用户在其项目范围内重新定义 Clojures 全局变量的默认值。
现在,如果此映射的键由关键字组成,我们将使用clojure.spec/keys
首先指定哪些键可以是映射的一部分,然后分别定义这些键下预期的值。但是由于clojure.spec/keys
默默地忽略了 and 中的非关键字:req
并为and:req-un
抛出异常(从 alpha15 开始),我们必须以某种方式解决这个问题。:opt
:opt-un
我们可以通过
其余的我们可以通过阅读文档来填写。但是我的问题是:我们如何编写一个规范来确保如果映射包含键'*assert*
,它只会保存布尔值?
clojure - 谓词函数的 Clojure 规范
我想为函数作为谓词的含义编写一个规范。在 Clojure 世界中,似乎有三种方法可以了解谓词是什么,尽管大多数人似乎都同意它们应该以问号结尾。
- 接受一个参数并返回真或假的函数。
- 接受一个参数并返回 true、false 或 nil 的函数。
- 一个函数,它接受一个参数并返回一个真值或假值。
关于 Predicate 是什么的 Jira Ticket。
编辑:谓词也可以采用多个参数,例如contains?
.
clojure - 如何取消嵌套序列规范?
使用 Clojure core.spec 我可以拥有以下内容:
我想要的是通过外部化子规范来消除冗余:
但
这个有效:
所以我正在寻找的是一个可以工作的函数或宏(比如 unnest):
我怎么能得到那个?