首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure:检查某个函数是否具有特定的post (或预)条件

Clojure:检查某个函数是否具有特定的post (或预)条件
EN

Stack Overflow用户
提问于 2018-02-11 21:49:57
回答 1查看 428关注 0票数 0

问题

在Clojure中,可以使用干扰素?检查变量是否表示函数。

我要问自己的是,是否有一种方法来检查var是否是一个具有特定post (或pre)条件的函数。

奖金:是否有可能建立后条件,以进行参数检查?

示例

假设foo代表一个函数(即(ifn? foo)返回true)。如何检查foo是否有特定的post条件,例如它是否返回010之间的数字。换句话说,如何检查foo是否具有以下后置条件?

{:post (and (number? %) (<= 0 %) (<= % 10))

奖励:是否可以检查N,而不是10,其中N是我可以选择的参数?

{:post (and (number? %) (<= 0 %) (<= % 10))

背景

我是实现 Bloom-filter 数据结构,如果我能验证散列函数,那就太好了。(也就是说,它们是只返回0和Bloom-filter中的bits数之间的数字的函数。)

备注

我已经知道了一些解决办法,例如将散列函数封装在包含后置条件的其他函数中,或者使用它们的比特数模块。虽然我欣赏上述用例的任何进一步解决方法,但请为主要问题提供一个明确的答案(即“是否可以检查一个函数是否具有某种后置条件?”)也是。“不,这是不可能的”也是一个答案,我当然可以接受。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-12 01:09:00

是否有一种方法来检查var是否是具有特定post (或预)条件的函数

是的,在这个问答的基础上,我们可以这样做:

代码语言:javascript
复制
(defn fn->pre-post [fvar]
  (-> fvar meta :arglists first meta (select-keys [:pre :post])))

并编写函数var和列表形式的函数,以便与其:post条件进行比较:

代码语言:javascript
复制
(defn some-post? [fvar post]
  {:pre [(var? fvar)]}
  (some #(= post %) (-> fvar fn->pre-post :post)))

然后,我们可以测试一个函数是否具有我们期望的:post条件:

代码语言:javascript
复制
(defn foo [n]
  {:post [(and (number? %) (<= 0 %) (<= % 10))]}
  (* n n))

(some-post?
  #'foo
  '(and (number? %) (<= 0 %) (<= % 10)))
=> true

这是一个非常脆弱的平等测试。如果您重新排序了and条件,那么即使这两个and在逻辑上是相同的,都会失败。如果你愿意的话,你可以让测试更加健壮。

是否有可能建立后条件,以进行参数检查?

是的,但同样,这将是脆弱的/受到相同的平等限制以上。在实践中,唯一的区别是我们需要将表单指定为一种模板,并在将其传递给some-post?之前填入空白。我们可以定义一个函数,它将用我们想要的任何形式替换符号N

代码语言:javascript
复制
(defn parameterize-n [n form]
  (walk/postwalk #(if (= 'N %) n %) form))

(parameterize-n
  10
  '(and (number? %) (<= 0 %) (<= % N)))
=> (and (number? %) (<= 0 %) (<= % 10))

我们可以像这样在some-post?中使用这个:

代码语言:javascript
复制
(some-post?
  #'foo
  (parameterize-n
    10
    '(and (number? %) (<= 0 %) (<= % N))))
=> true

顺便说一句,(<= 0 % 10)等同于(and (<= 0 %) (<= % 10)),但我逐字使用了您的示例测试。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48736837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档