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

clojure中的def是保存函数的返回值,还是每次都对函数求值?

在Clojure中,def是用于定义变量或者函数的关键字。当使用def定义一个函数时,它会对函数进行求值并将其返回值保存在变量中。这意味着每次调用该函数时,它的返回值都会被保存在变量中,而不是对函数进行求值。

举个例子,假设我们有一个名为add的函数,它接受两个参数并返回它们的和。我们可以使用def来定义这个函数并将其保存在变量中:

(def add (fn [a b] (+ a b)))

在这个例子中,add函数被定义并保存在变量add中。每次调用add函数时,它的返回值都会被保存在add变量中。

关于Clojure中def的更多信息,你可以参考腾讯云的Clojure开发文档:Clojure开发文档

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

答网友问:golangslice作为函数参数时值传递还是引用传递?

大家好,我渔夫子。 今天有网友问通道和切片在赋值给另一个变量或作为函数参数传递时候是不是引用传递?因为老师在讲解时候说是指针传递? 先说结论:在Go语言中都是值传递,没有引用传递。...然后将b第一个元素更改成10。那么,a第一个元素也将会是10。那这是为什么呢?这个要从slice底层数据结构来找答案。...如下: slice底层结构其中一个实际上有一个指针,指向了一个数组。...那么,在把a赋值给b时候,只是把slice结构也就是Array、Len和Cap复制给了b,但Array指向数组还是同一个。所以,这就是为什么更改了b[0],a[0]值也更改了原因。...另外,在Go还有chan类型、map类型等都是同样原理。所以大家一定不要混淆。

63020

pythonmap和filter避坑指南

你只在绝对需要时候计算它,这是懒惰。这在函数式编程很常见。这就是为什么这在python一个问题。...大多数函数式语言都具有不可变性有原因。只有当可以保证表达式参数每次都具有相同含义时,才能延迟表达式求值。 在本例,filter(is_even, a)结果取决于迭代器实现时间。...user=> a ; proof that a is something else (1 2 3 4 10 12) Filter在clojure惰性,但是你得到了正确结果,即过滤[1,2,3,4...filter实现deepcopy意味着我实现不是完全懒惰。这种实现唯一优点当过滤函数很昂贵时。 ◆ 使用即时计算 我认为最实用解决方案即时地计算map和filter。...,就像在clojure或任何其他函数式编程语言中一样。

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

    如何表示和处理数据 Clojure一种动态类型语言,这意味着你在程序永远不需要明确定义符号、函数、或者参数数据类型。但是,所有的值仍然有一个类型。...首先,Clojure读取程序将它作为一个列表来解析,然后将其第一个元素(在这里println)作为函数来对它求值,然后将剩余部分 ("Hello World!")作为参数传递给它。...这告诉Clojure将其作为数据结构来对待,而不是将其当作Clojure形式对其求值。...向量在Clojure程序字面表示使用方括号。例如,一个由1到5组成向量可以通过如下代码定义并绑定到一个符号上:(def nums [1 2 3 4 5]) 向量它们索引函数。...它返回一个新映射,该映射由参数里所有映射键和值所组成。若一个键在多个映射里出现,那么最后参数里给定函数作用于所有这些冲突键返回值

    2.3K10

    【原】Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    其实RDD支持两种操作:      1.Tansformation(转化操作):返回值还是一个RDD      2.Action(行动操作):返回值不是一个RDD      第一种Transformation...还有一种情况,如果我们想多次使用同一个RDD,每次都对RDD进行Action操作的话,会极大消耗Spark内存,这种情况下,我们可以使用RDD.persist()把这个RDD缓存下来,在内存不足时,...filter( ):接收一个函数,将函数元素放入新RDD返回。...最后来讲讲如何向Spark传递函数:   两种方式:   1.简单函数:lambda表达式。      适合比较短函数,不支持多语句函数和无返回值语句。   ...2.def函数      会将整个对象传递过去,但是最好不要传递一个带字段引用函数。如果你传递对象是某个对象成员,或者在某个函数引用了一个整个字段,会报错。

    94080

    读书 | Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    其实RDD支持两种操作: 1.Tansformation(转化操作):返回值还是一个RDD2.Action(行动操作):返回值不是一个RDD 第一种Transformation返回一个新RDD,如map...还有一种情况,如果我们想多次使用同一个RDD,每次都对RDD进行Action操作的话,会极大消耗Spark内存,这种情况下,我们可以使用RDD.persist()把这个RDD缓存下来,在内存不足时,...在Python,储存对象永远通过Pickle库序列化过,所以社不设置序列化级别不会产生影响。...最后来讲讲如何向Spark传递函数: 两种方式: 1.简单函数:lambda表达式。 适合比较短函数,不支持多语句函数和无返回值语句。...2.def函数 会将整个对象传递过去,但是最好不要传递一个带字段引用函数。如果你传递对象是某个对象成员,或者在某个函数引用了一个整个字段,会报错。举个例子: ?

    62990

    clojure基础入门(一)

    阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure一种运行在JVM上Lisp方言,属于函数式编程范式,它和java可以方便互相调用,这样开发程序可以很好结合java和clojure...欢迎进入clojure世界。  ? 变量 Clojure变量可以def关键字来声明:  ? clojure数据类型弱类型,对应javaobject,然后通过变量名直接调用。...函数式编程函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数,如上"hello world"被当成参数传入str函数进行输出。...定义函数用defn,跟定义变量def类似: (defn Get [] "Hello World") ;=>"Hello World" 下面定义了get函数括号为函数参数,输出Hello World...注意if是不是函数或宏,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示值作为函数返回值

    1.5K30

    在下函数式编程,有何贵干?

    然而现实还是有不少人不太了解这种编程范式,觉得这仅仅是一个逼格较高名词。我们这里就来简单介绍一下这个举手投足都充满酷劲小东西。...在每次递归调用时程序都必须保存当前方法调用栈,即调用 addOne(2) 时程序必须记住之前如何调用 addOne(1) ,这样它才能在执行完 addOne(2) 后返回到 addOne(1) 下一条语句并打印...高阶函数 High-Order Function 高阶函数指一个函数参数另一个函数,或者一个函数返回值另一个函数。...action 即执行操作,action 没有返回值,调用后会立即执行之前 Stream 对象中保存所有操作。...最后我想说使用函数式编程的确很坂本,但是多了解一种编程范式对于从码农进化为码农++还是很有帮助

    74370

    函数式编程简介

    我们可以假设U为可证,那么可以推出PM矛盾(不相容);但是假设U不可证,却推导不出PM矛盾。U含义在PM不可证,而事实上,它被证明不可证,所以UPM不可证真命题。...1977年,John Buckus在其图灵奖演讲创造了 Functional Programming 这个词。1990年,惰性求值函数式编程语言 Haskell 1.0 发布。 ?...和ML都是不纯编程语言,但是Haskellside effect free 函数一等公民 函数一等公民,指的是你可以将函数作为参数、返回值、数据结构存在,而且不仅可以用函数名引用,甚至可以匿名调用...纯函数和不可变性 纯函数指执行过程没有副作用函数,所谓副作用是说超出函数控制操作,比如在执行过程操作文件系统、数据库等外部资源。...比如Clojuremap高阶函数,它接收(fn [v] ...),把一组数据映射成另外一组数据。

    1.7K41

    Scala基础概念

    Odersky 导读: 函数式变成概念和思想 Scala开发环境搭建 Scala语言基础 Scala类型和求值策略 Scala函数概念 Immutable Collections如何用函数式思想实现数据结构和其上一些操作...,即函数可以定义函数,有变量地方都可以使用函数,都是等同 高阶函数 函数作为一个函数输入或另一个函数输出 闭包 closure 表达式求值 函数式编程,一切都是表达式,表达式求值策略...: 严格求值:call by value 非严格求值:call by name 惰性求值 定义表达式时不会立即求值,只在第一次调用时才求值 递归函数 函数式编程没有循环语句,全部循环用递归实现...call by value 对函数实参求值,仅求一次,求得值直接替换函数形式参数 call by value 不会对函数实参进行表达式求值,直接把表达式传入函数体内,替换表达式形参,然后在函数每次使用到此形参时会被求值...输出:死循环 进行函数设计和调用时,两种差异要搞清楚 Scala函数 支持把函数作为实参传递给另外一个函数 支持把函数作为返回值 支持把函数赋值给变量 支持把函数存储在数据结构里 即,在scala

    73230

    clojure基础入门(一)

    阅读目录: 概述 变量 运算符 流程控制 总结 概述 clojure一种运行在JVM上Lisp方言,属于函数式编程范式,它和java可以方便互相调用,这样开发程序可以很好结合java和clojure...欢迎进入clojure世界。  ? 变量 Clojure变量可以def关键字来声明:  ? clojure数据类型弱类型,对应javaobject,然后通过变量名直接调用。...函数式编程函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或宏,其后面的都会被当成参数,如上"hello world"被当成参数传入str函数进行输出。...定义函数用defn,跟定义变量def类似: (defn Get [] "Hello World") ;=>"Hello World" 下面定义了get函数括号为函数参数,输出Hello World...注意if是不是函数或宏,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示值作为函数返回值

    1.3K40

    Clojure 运行原理之编译器剖析

    是否为一个宏,而这又是通过检查var是否为一个函数,并且元信息macro是否为true。...,form参数即是宏展开后各种数据结构(String/ISeq/IPersistentList 等),返回值类型为Expr,可以猜测出,Expr子类程序主体,遵循模块化编程风格,每个子类都知道如何对其自身求值...根据 JVM bytecode 规范,每个.class文件都必须由类组成,而 Clojure 作为一个函数式语言,主体函数,通过 namespace 来封装、隔离函数,你可能会想当然认为每个 namespace...对应一个类,namespace 里面的每个函数对应类里面的方法,而实际上并不是这样,根据 Clojure 官方文档,对应关系这样: 每个文件、函数、gen-class 都会生成一个.class文件...编译器实现,加深了对 eval-apply 循环理解,还有一点就是揭开了宏真实面貌,之前一直认为宏个很神奇东西,其实它只不过编译时运行函数而已,输入与输出内容既是构成程序数据结构,同时也是程序内在

    99130

    来来来,咱们元编程入个门

    实际上,我们可以认为 macro 一个特殊函数,这个函数接受参数语法树(一个或者多个),然后返回一个语法树。就这么简单。...这也是为什么 macro 返回值只能 syntax quote 后代码。这一点切记切记,很多初学者会在这里犯下很多错误。...(注:以上返回值为了清晰起见,我把 AST metadata 删除了) 从这里面,我们可以清晰地看到,macro 输入两个 AST:1 == 2 AST,和 3 + 4 AST。...在合适地方 unquote 写 macro 基本能力。 在使用 macro 进行 metaprogramming 时,最常见一个坑表达式反复求值。我们看一个函数: ?...这种在 macro 里不经意地对表达式反复求值写 macro 时常犯错误,因为我们没有正确地完成 function -> macro paradigm shift。

    942100

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

    2 概述与精读 深度学习机器学习基于人工神经网络模型一个分支,通过模拟多层神经元自编码神经网络,将特征逐步抽象化,这需要多维度、大数据量输入。...然而在生产环境,基于 性能和安全性 考虑,一般会使用函数式语言 Clojure 或 Haskell。 在生产环境,可能要并发出里几百万个参数,因此面临挑战:如何高效、安全执行这些运算。...所以为什么函数式编程语言可以胜任深度学习计算要求呢? 深度学习计算模型本质上数学模型,而数学模型本质上和函数式编程思路一致:数据不可变且函数间可以任意组合。...3 总结 本文介绍了为什么深度学习更适合使用函数式语言,以及介绍了 Clojure 与 Haskell 语言共性:安全性、高性能,以及各自独有的特性,证明了为何这两种语言更适合用在深度学习。...在前端领域说到函数式或函数之美,大部分时候想到 Class Component 与 Function Component 关系,这个理解较为片面的。

    41210

    几分钟内学习 Clojure

    Clojure JVM上一个LISP语言变种,它比Common Lisp更强调纯函数式编程,但提供了一些STM工具以处理它所引入状态问题。...,元素之间用空格隔开 ; clojure 解释器会把第一个元素当做函数或者宏调用,其他都作为参数 ; 下面这个函数用于设置当前命名空间 (ns test) ; 更多基本例子: ; str 函数会用它所有的参数创造一个字符串...(class 1) ; 整形字面值默认javaLong类型 (class 1.); 浮点字面值对应着javaDouble类型 (class ""); 字符串总是用双引号括起来,并且对应着java...所有的函数都有返回值,就是它最后一个表达式 (fn [] "Hello World") ; => fn ; (你需要额外括号去调用它) ((fn [] "Hello World")) ; => "...,所有的函数始终用最初那个对象值,最后还是返回最初那个对象 (import java.util.Calendar) (doto

    1.7K40

    PLT:说说Evaluation strategy

    test(1, foo())   Call-by-value或Scalar      按值传值也就是我们接触最多一种求值策略,实际运算过程对实参进行克隆,然后将副本赋值到参数变量。...注意:由于第2个特点与Call-by-sharing特点一样,因此虽然Java应该属于采用Call-by-sharing策略,但社区还是声称Java采用Call-by-value策略。...而需要注意地方,由于getName延迟计算,若函数体内存在自由变量(如freeVar),那么后续每次计算结果均有可能不同(也就是side effect)。...每次在执行实参表达式时均会执行运算;     2. 若实参运算过程为计算密集型或阻塞性操作时,则会阻塞函数体后续命令执行。...该策略仅适用于pure function实参,存在free variable则会导致无法确保每次求值结果都一样。

    1K60

    Kotlin、Swift、Scala 延迟求值

    我们还是以前面的 assertAllTrue 为例: [Scala] def assertBothTrue(left: => Boolean, right: => Boolean): Boolean...函数体内最后一行就是函数返回值,所以 left && right 值就是 assertBothTrue 返回值了;而 left 和 right 参数类型长得有点儿奇怪,如果说它是 Boolean...,不过每次访问都会重新计算它值,这一点又与函数行为相同。...BooleanByName valueByName 一个函数,Scala 当中对于不修改类内部状态无参函数通常声明成没有括号样子,这样函数调用时如同访问属性一样( 如代码 _.valueByName...其实吧,单从这个例子角度来讲,函数参数类型声明还是挺清楚,现在 IDE 这么牛逼,所以支持一下这样特性算不算违反 Kotlin 设计原则其实也不一定,不过目前看来这种不痛不痒小特性还是算了吧

    1.7K20

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

    Clojure 作为一本函数式编程语言,最基本概念函数,没有类概念,那么 Clojure 代码生成以类为主 bytecode 呢?...一种直观想法,每个命名空间(namespace)一个类,命名空间里函数相当于类成员函数。...但仔细想想会有如下问题: 在 REPL 里面,可以动态添加、修改函数,如果一个命名空间相当于一个类,那么这个类会被反复加载 由于函数和字符串一样一等成员,这意味这函数既可以作为参数、也可以作为返回值,...正如上一篇文章介绍,这三个方法正是 Compiler 入口函数,这也就解释了上面 REPL 实验: 每次重定义一个函数,都会生成一个新 DynamicClassLoader 实例去加载其实现。...另外,JVM 7 增加了 invokedynamic 指令,可以让运行在 JVM 上动态语言通过实现一个 CallSite (可以认为函数调用) MethodHandle 函数来帮助编译器找到正确实现

    72020
    领券