首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Clojure 学习入门(6)—— 函数定义

user=> (#(* %1 %2) 3 4) ;使用#符号完成两个参数乘积的功能 12 defn: defn 宏用来定义一个函数。...->:宏-> 我们也称为 “thread” 宏,它本质上是调用一系列的函数,前一个函数的返回值作为后一个函数的参数,返回最后一次函数调用的值,比如下面两行代码的作用是一样的:  user=> (.toUpperCase...->>: 后面的函数迭代使用之前的函数结果作为最后一个参数,返回最后一次函数调用的值,试看下面两个语句:  user=> (-> 10 (/ 3)) ; 10/3 10作为/函数第一个参数 10...把给定的集合里面的所有元素一次性地给指定的函数作为参数调用,然后返回这个函数的返回值。...用于检查给定的参数是否为函数,是返回true,否则返回false,如:  user=> (fn? #("test")) true user=> (fn?

77750

不学函数式设计的3大损失

讲动人的故事,写懂人的代码 可能很多程序员和我一样,一直在一次次地重新入门函数式编程(和设计)。因为我们总是学了就忘。鲍叔去年出版了他的大作《函数式设计》,里面有大量Clojure代码示例。...其次函数不会修改输入参数,而是返回新的结果。最后在给定作用域内,符号一旦绑定数据,就不能再重新绑定数据。这与传统的命令式编程形成对比,后者允许随意修改数据。不可变性因为下面的原因,可以减少并发bug。...比如图7中上面那几行代码中第9行map-indexed 就是一个高阶函数,它接受一个函数作为参数。这个函数应用到集合的每个元素上,同时提供元素的索引。...图7中左侧的这张图,就是我们从影院订票系统的Clojure版的main函数作为起点,绘制出的数据是如何在Clojure代码各个函数间流淌的图。...Clojure使用括号()来定义表达式和函数调用,且使用前缀表示法,例如,(+ 1 2)表示将1和2相加。函数总是放在第一位,后面跟着参数。例如,(println "Hello, world!")。

43754
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Clojure 学习入门(18)—— 数据类型

    如何表示和处理数据 Clojure是一种动态类型语言,这意味着你在程序中永远不需要明确定义符号、函数、或者参数的数据类型。但是,所有的值仍然有一个类型。...注释 为保持简单,Clojure API中的计算函数与其他语言的常见运算是一致的。但不用担心:当表达式被解析和编译时,它们会被替换为优化的Java字节码,尽可能使用原始运算。...列表可以通过使用括号来直接输入,这也是为什么Clojure代码本身就使用了如此多的列表。例如,正常地调用一个函数:(println "Hello World!")...这不仅仅是一个数学上的描述——它们都是实现了的函数,并且可以通过函数调用来取得元素的值。通过索引来取得值的最简单的方法是:像函数一样调用这个向量,然后将你想要的索引传递给它。...关键字、字符串和数字都经常被用作映射的键。 与向量类似,映射是它们的键的函数(不过如果给定的键不存在,它们不会抛出异常)。要得到一个特定键对应的值,只要使用该映射最为函数,并将键作为参数传递给它。

    2.4K10

    dotnet 如何在 Mock 模拟 Func 判断调用次数

    在 dotnet 程序有很好用的 Mock 框架,可以用来模拟各种接口和抽象类,可以用来测试某个注入接口的被调用次数和被调用时传入参数。...本文告诉大家如何在 Mock 里面模拟一个 Func 同时模拟返回对象,获取调用次数 在 Mock 里面可以通过 Mock> 创建一个返回字符串的委托,通过 Setup 设置调试参数过滤和对应的模拟的返回值...方法,在 Verify 方法是调用模拟的方法,在模拟的方法传入参数指定在传入对应参数的时候,此方法调用了多少次 mock.Verify(func => 对象.Xx方法(模拟用户传入的是什么参数),...Times.Xx在传入什么参数的时候被调用了多少次); 例如当用户传入参数 0 的时候被调用一次可以这样写 mock.Verify(func => func(0), Times.Once); 现在尝试写一个单元测试跑一下...另外 It 还提供很多其他的帮助方法,可以简化代码,这些自己写一下就知道 这里的 It 不仅可以在 Setup 使用,也可以在 Verify 方法使用,如判断用户传入小于0的参数的时候,这个方法被调用一次

    1.3K40

    几分钟内学习 Clojure

    ,元素之间用空格隔开 ; clojure 解释器会把第一个元素当做是函数或者宏调用,其他的都作为参数 ; 下面这个函数用于设置当前的命名空间 (ns test) ; 更多基本的例子: ; str 函数会用它所有的参数创造一个字符串...; 从一个map中检索一个值,可以直接把这个map当做函数调用(这个NB) (stringmap "a") ; => 1 (keymap :a) ; => 1 ; 关键字也可以当做函数来调用,从一个...命名空间包含更多的函数 ; 一些有用的形式 ;;;;;;;;;;;;;;;;; ; clojure中的逻辑结构都是宏, 看起来也没什么不同 (if false "a" "b") ; => "b"...[intersection]]) ; 使用reqire来导入一个模块 (require 'clojure.string) ; 使用/从一个模块中调用函数 (clojure.string/blank...;; ; java 拥有一个庞大的各种用途的标准库,你一定迫不及待想学习如何在clojure中使用这些库 ; 使用import类引入java模块(这个还好没变化) (import java.util.Date

    1.7K40

    dotnet 如何在 Mock 模拟 Func 判断调用次数

    在 dotnet 程序有很好用的 Mock 框架,可以用来模拟各种接口和抽象类,可以用来测试某个注入接口的被调用次数和被调用时传入参数。...本文告诉大家如何在 Mock 里面模拟一个 Func 同时模拟返回对象,获取调用次数 在 Mock 里面可以通过 Mock> 创建一个返回字符串的委托,通过 Setup 设置调试参数过滤和对应的模拟的返回值...方法,在 Verify 方法是调用模拟的方法,在模拟的方法传入参数指定在传入对应参数的时候,此方法调用了多少次 mock.Verify(func => 对象.Xx方法(模拟用户传入的是什么参数),...Times.Xx在传入什么参数的时候被调用了多少次); 例如当用户传入参数 0 的时候被调用一次可以这样写 mock.Verify(func => func(0), Times.Once); 现在尝试写一个单元测试跑一下...另外 It 还提供很多其他的帮助方法,可以简化代码,这些自己写一下就知道 这里的 It 不仅可以在 Setup 使用,也可以在 Verify 方法使用,如判断用户传入小于0的参数的时候,这个方法被调用一次

    84130

    Clojure 运行原理之字节码生成篇

    我们知道 Clojure 里面很多“函数”其实是用宏实现的,宏在编译时会进行展开,生成新代码,上面代码中的ns、defn都是宏,展开后(在 Cider + Emacs 开发环境下,C-c M-m)可得...,会去调用getRawRoot函数得到该函数的实现,这种重定向是 Clojure 实现动态运行时非常重要一措施。...= new ConcurrentHashMap >(); // loadClass 会在一个类第一次主动使用时被 JVM 调用 Class...正如上一篇文章的介绍,这三个方法正是 Compiler 的入口函数,这也就解释了上面 REPL 中的实验: 每次重定义一个函数,都会生成一个新 DynamicClassLoader 实例去加载其实现。...另外,JVM 7 中增加了 invokedynamic 指令,可以让运行在 JVM 上的动态语言通过实现一个 CallSite (可以认为是函数调用)的 MethodHandle 函数来帮助编译器找到正确的实现

    74320

    Clojure 运行原理之编译器剖析

    Compiler.java Compiler 类主要有三个入口函数: compile,当调用clojure.core/compile时使用 load,当调用clojure.core/require、clojure.core.../use时使用 eval,当调用clojure.core/eval时使用 这三个入口函数都会依次调用 macroexpand、analyze 方法,生成Expr对象,compile 函数还会额外调用...是否为一个宏,而这又是通过检查var是否为一个函数,并且元信息中macro是否为true。...Clojure 里面通过defmacro函数创建宏,它会调用var的setMacro函数来设置元信息macro为true。...,form参数即是宏展开后的各种数据结构(String/ISeq/IPersistentList 等),返回值类型为Expr,可以猜测出,Expr的子类是程序的主体,遵循模块化的编程风格,每个子类都知道如何对其自身求值

    1K30

    改善单元测试的新方法|洞见

    这也就引出“生成式测试”的概念——我们先声明传入数据可能的情况,然后使用生成器生成符合入参情况的数据,调用待测方法,最后进行验证。...2 Given阶段 Clojure 1.9(Alpha)新内置的Clojure.spec可以很轻松地做到这点: 首先,我们尝试声明两个参数可能出现的情况或者称为规格(specification),即参数...如果使用生成式测试,我们规定: 任取一个自然数a,在其上调用identity-nat的结果总是返回a。 这个测试尝试对100组生成的自然数(nat-int?)...失败的数据是0,而且还给出了最小失败集[0]。拿着这个最小失败集,我们就可以快速地重现失败用例,从而修正。 当然也存在这样的可能:在一次运行中,我们的测试无法发现失败的用例。...Clojure.spec提供方法很有前景,它可以让开发者在需要的时候,就能从类型和取值范围中获益。 另外,除了Clojure,其它语言也有相应的生成式测试的框架,你不妨在自己的项目中试一试。

    92050

    如何在 Python 中生成一个范围内的 N 个唯一随机数?

    在许多编程任务中,我们需要生成随机数来模拟实验、生成测试数据或进行随机抽样等操作。在 Python 中,有多种方法可以生成随机数,但有时我们还需要确保生成的随机数是唯一的,且在给定的范围内。...本文将详细介绍如何在 Python 中生成一个范围内的 N 个唯一随机数,以满足我们的需求。使用 random 模块Python 中的 random 模块提供了生成随机数的函数和方法。...random.sample 函数接受两个参数:一个序列(可以是列表、元组或范围对象)和要生成的随机数个数。我们使用 range 函数生成了一个范围对象,表示给定的起始值和结束值范围。...然后,我们调用 random.sample 函数,并传递范围对象和要生成的随机数个数。函数将返回一个包含唯一随机数的列表。...生成唯一随机数在许多编程任务中非常有用,如模拟实验、生成测试数据、随机抽样等。通过掌握这些方法,你可以更好地处理随机数生成的需求,并确保生成的随机数在给定范围内是唯一的。

    84130

    记好这 24 个 ES6 方法,用来解决实际开发的 JS 问题

    本文主要介绍 24 中 es6 方法,这些方法都挺实用的,本本请记好,时不时翻出来看看。 1.如何隐藏所有指定的元素 ? 2.如何检查元素是否具有指定的类?...该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行。 requestAnimationFrame:优势:由系统决定回调函数的执行时机。...60Hz的刷新频率,那么每次刷新的间隔中会执行一次回调函数,不会引起丢帧,不会卡顿。 6.如何检查父元素是否包含子元素? ? 7.如何检查指定的元素在视口中是否可见? ?...11.如何创建一个包含当前URL参数的对象? ? 12.如何将一组表单元素转化为对象? ? 13.如何从对象检索给定选择器指示的一组属性? ? 14.如何在等待指定时间后调用提供的函数? ?...15.如何在给定元素上触发特定事件且能选择地传递自定义数据? ? 自定义事件的函数有 Event、CustomEvent 和 dispatchEvent ?

    1.6K10

    听GPT 讲K8s源代码--cmd(七)

    它负责按顺序调用其他预检函数,并对预检过程中的错误进行处理和报告。 checks.go:该文件定义了一系列的检查函数,用于验证主节点的系统环境和配置是否满足 Kubernetes 集群的要求。...HandleGetAction:这个函数用于处理 GET 操作,即从 Kubernetes API 获取一个指定的对象。它通过调用客户端的 GET 方法并将结果打印到标准输出来模拟这个操作。...它提供了一组函数,用于在给定的根目录下执行指定的命令。 详细介绍如下: Chroot函数: root:要更改为的根目录。 command:要在新进程中执行的命令。 args:传递给命令的参数。...这些函数的主要作用是在Kubernetes的安装和启动过程中,将当前进程的根目录更改为给定的目录,并在新的根目录下执行指定的命令。...下面是该文件中的几个函数及其作用的详细介绍: changeRoot: 这个函数在给定的目录下运行指定的函数。它首先在给定目录中创建一个临时目录,并将其作为新的根目录。

    19010

    Java与Scala如何编译Lambda表达式?

    基于JVM的语言(如Scala,Groovy和Clojure)已将它们集成为语言的关键部分,本文将会对比Java与Scala在编译Lambda表达式上存在的差异 Lambda表达式在过去几年中风靡编程世界...大多数现代语言都将它们作为函数式编程的基础部分。基于JVM的语言(如Scala,Groovy和Clojure)已将它们集成为语言的关键部分,Java自然也不甘落后。...通过这个,map()函数可以多态调用覆盖的apply(),其代码如下 // 这段代码加载了这个以及要操作的目标对象, // 检查它是否为String,然后调用另一个apply()方法来执行实际工作 /...它并没有创建包装Lambda函数的新对象,而是使用Java 7新引进的invokeDynamic指令将此调用点动态链接到实际的Lambda函数。...这是非常棒的切割器——只需加载String参数,调用length()并将结果打包。请注意,它被编译为静态函数,以避免像我们在Scala中看到的那样将其他对象传递给它。

    1.4K10

    【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

    单元测试的理论基础 1.1 单元测试是什么 单元测试是软件开发中的一种测试方法(由开发者编写),对程序中的最小可测试单元(通常是函数、方法或类)进行检查和验证。...@RunWith: 指定测试运行器,如 @RunWith(Parameterized.class) 用于参数化测试。...综上,使用 Mock 是为了更好地隔离测试目标、消除测试环境的不确定性、提高测试速度、模拟异常情况以及降低测试成本,从而使单元测试更加简单、可靠和高效。 ️2....单元测试用例设计技术(6种) 单元测试用例设计技术可分成大致6种,由弱至强,工作量由低到高: 语句覆盖:程序中每条语句至少被执行一次。...路径覆盖:覆盖程序的所有可能的路径。 2.1 语句覆盖 语句覆盖:程序中每条语句至少被执行一次。

    78111

    听GPT 讲K8s源代码--pkg(七)

    httpProber结构体:该结构体继承了Prober,并添加了一些HTTP探测特定的参数,如检查重定向、TLS验证等。...同时,还提供了一些配置选项,如TLS验证、重定向检查等,以满足不同使用场景的需求。...DeleteAllUnusedContainers:删除所有未使用的容器。在垃圾回收过程中,如果发现某个容器未被使用,则会调用该函数将其删除。...healthCheck 结构体保存了一个健康检查函数的信息,包括检查函数(checkFn)、检查失败的阈值(failThreshold)以及最后一次检查失败的时间(lastFailureTime)。...MockDirEntryMockRecorder结构体:用于记录MockDirEntry相关函数的调用情况。可以用于检查测试中哪些函数被调用以及它们的参数是什么。

    24930

    Flutter性能优化

    Flutter运行模式 Debug模式 调试页面开发时使用 Profile模式 调试性能 开发时使用 Release模式 部署发包时使用 Debug Debug模式可以在真机和模拟器上同时运行,此模式会打开所有的断言...如果是UI报红: 那么可能是执行了某个较耗时的函数?或者函数调用过多?算法复杂度高? 如果只是 GPU 报红: 那么可能是要绘制的图形过于复杂?或者执行了过多GPU操作?...开启saveLayer和图形缓存的检查 MaterialApp( showPerformanceOverlay: true, // 使用了saveLayer的图形会显示为棋盘格式并随着页面刷新而闪烁...如底部导航栏式的页面,没有必要第一次进入就把每个子Page都创建出来 尽量做到局部刷新 把耗时的计算放到独立的isolate去执行 检查不必要的 saveLayer 检查静态图片是否添加缓存 relayout...如加载长列表;在调用频率很高的方法中创建对象 合理设置缓存大小/长度 在内存不足时或离开页面时清空缓存数据 使用ListView.build()来复用子控件 自定义绘图中避免在onDraw中做创建对象操作

    2.5K31

    精读《深度学习 - 函数式之美》

    2 概述与精读 深度学习是机器学习中基于人工神经网络模型的一个分支,通过模拟多层神经元的自编码神经网络,将特征逐步抽象化,这需要多维度、大数据量的输入。...然而在生产环境中,基于 性能和安全性 的考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境中,可能要并发出里几百万个参数,因此面临的挑战是:如何高效、安全的执行这些运算。...这意味着使用函数式编程语言可以更好的表达深度学习的计算过程,因此更容易理解与维护,同时函数式语言内置的 Immutable 数据结构也保障了并发的安全性。...原文介绍 Clojure 另一个特性是函数链式调用: ;; pipe arg to function (-> "x" f1) ; "x1" ;; pipe. function chaining (->...3 总结 本文介绍了为什么深度学习更适合使用函数式语言,以及介绍了 Clojure 与 Haskell 语言的共性:安全性、高性能,以及各自独有的特性,证明了为何这两种语言更适合用在深度学习中。

    42110

    白盒测试用例设计方法有哪些_软件测试语句覆盖测试用例

    此时,测试工程师需深入考察程序代码的内部结构、逻辑设计等。 对于白盒测试工程师来说,软件产品内部构成是透明的。 下列代码是”图书添加“功能页面对象检查功能函数。...覆盖率:是用来度量测试完整性的一个手段 1、语句覆盖 1、语句覆盖设计用例 语句覆盖:设计测试用例,是对程序中每条语句至少被执行一次。...”真“和”假“都至少被执行一次。...:设计测试用例,使得被测试程序中的每个判断本身的判定结果(真假)至少满足一次,同时,每个逻辑条件的可能值(真假)也至少被满足一次。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    46820

    独家 | 如何在GPU资源受限情况下微调超大模型

    下面是这些节点的计算顺序,紫色阴影圆圈表示在给定时间里需要将哪个节点保存到内存之中。 梯度检查点 如上所述的简单反向传播在计算方面是最优的:它只计算每个节点一次。...在这里使用这样一种策略:将神经网络激活的一个子集标记为检查点节点。 在本示例中,选择将第sqrt(n)个节点标记为检查点。...例程: 在学习了梯度检查点的细节之后,来看看如何在PyTorch中应用这个概念,看起来并不太难: 梯度累积/微批次 概述 深度学习模型正在越变越大,很难在GPU内存中安装这样大型的神经网络。...梯度积累模拟了一个更大的批大小,如果想在一个小批中使用64张图像,如果批大小超过了8,则会报“CUDA内存出错…”。在这种情况下,可以使用8批图像,并在模型处理64/8=8批后更新一次权重。...将模型转换为不同的格式(即BF16,TF16)后的缩放损失,将在后续的文章中讨论。 有些操作在FP16中是无法完成的,如Softmax。

    2.4K30
    领券