optimization - 具有局部变量的 Clojure 前提条件

标签 optimization clojure let preconditions

有什么方法可以存储在前提条件下执行的计算结果,以便可以在实际的函数体中使用它。

这太糟糕了(昂贵的计算运行两次):

(defn bar [x]                                                                           
  {:pre [(> (costly-computation x) 1337)]}                                                
  (costly-computation x))

我想做一些类似的事情。但这不起作用。

(defn smartbar [x]
  (let [res (costly-computation x)]                                                       
    {:pre [(> res 1337)]}
    res))

最佳答案

您有多种方法可以解决这个问题。例如,您可以在 (bar) 函数外部计算 (coSTLy-computation x) 并将其作为参数传递给 (bar) 函数。

或者您可以在 (bar) 函数内计算 (coSTLy-computation x) 并在那里进行验证,没有 {:pre} 条件。

或者编写一个宏来完成您想要的操作!

您的智能栏将无法工作,因为这不是创建 defn 宏的目的。
在 REPL 中尝试一下:

(source defn)

关于optimization - 具有局部变量的 Clojure 前提条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468484/

相关文章:

numpy - 设置(M x N x N)矩阵对角线的快速方法? Einsum/n维fill_diagonal?

php - 获取数字的类似excel的列名的算法

optimization - Prolog 递归的顺序重要吗?

sql - SQL 模式到 Korma 实体的代码生成工具

javascript - 让变量作用域

javascript - 加载 JavaScript 或 CSS 而不执行它们的方法有哪些?

sockets - BufferedReader-在流的末尾阻塞

java - 将 clojure 作为 JAVA 文件运行

javascript - 使用 "let"关键字的 block 作用域

syntax-error - Coq let 子句中的多个赋值