`
淘气天空lc
  • 浏览: 48073 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

clojure笔记

 
阅读更多

storm-clojure

clojure方法定义 defn 宏用来定义一个函数。它的参数包括一个函数名字,一个可选的注释字符串,参数列表,然后一个方法体。而函数的返回值则是方法体里面最后一个表达式的值。所有的函数都会返回一个值, 只是有的返回的值是nil。 fn定义匿名函数,通过fn定义的函数可以包含任意个数的表达式,而通过#(..)只能使用一个表达式 ,如果想包含多个表达式,那么就可以用do包含起来,如果只有一个参数,通过%获得,如果有多个参数可以通过%1 %2获得

(def years [1940 1944 1961 1985 1987])
(filter (fn [year] (even? year)) years) ; long way w/ named arguments -> (1940 1944)
(filter #(even? %) years) ; short way where % refers to the argument

 defmulti 和defmethod 经常被用在一起来定义 multimethod. 宏defmulti 的参数包括一个方法名以及一个dispatch函数,这个dispatch函数的返回值会被用来选择到底调用哪个重载的函数。宏defmethod 的参数则包括方法名,dispatch的值, 参数列表以及方法体。一个特殊的dispatch值:default 是用来表示默认情况的 — 即如果其它的dispatch值都不匹配的话,那么就调用这个方法。defmethod 多定义的名字一样的方法,它们的参数个数必须一样。传给multimethod的参数会传给dipatch函数的。实现类似java的重载

 

(defmulti what_am_i class)
(defmethod what_am_i Number [args] (println args "is num"))
(defmethod what_am_i String [args] (println args "is String"))
(defmethod what_am_i :default [args] (println args "is default"))
(what_am_i 19)
(what_am_i "luochao")
(what_am_i true)

 clojure提供了很多函数来充当谓词功能,测试条件是否成立,他的返回值是ture或者false,在clojure语言中,false和nil被解释成false,其他的都为true包括0,谓词函数一般以?结尾,class?,coll?,decimal?,delay?,float?,fn?,instance?,integer?,isa?,keyword?,list?,macro?,map?,number?,seq?,set?,string?

clojure反射是一种获取对象的特性

structMap

定义一个

(def vehicle-struct (create-struct :make :year :day))

or (defstruct vehicle-struct :make :year :day)

(def vehicle (struct vehicle-struct "to" 121 12))

定义一个访问函数 (def make (accessor vehicle-struct :make))

(make vehicle)

(vechicle )

 partial 函数创建一个新的函数 — 通过给旧的函数制定一个初始值

; Note the use of def instead of defn because partial returns
; a function that is then bound to "times2".
(def times2 (partial * 2))
(times2 3 4) ; 2 * 3 * 4 -> 24

reduce 函数接收一个需要两个参数的函数, 一个可选的value以及一个集合。它会以value以及集合的第一个元素作为参数来调用给定的函数(如果指定了value的话), 要么以集合的第一个元素以及第二个元素为参数来调用给定的函数(如果没有指定value的话)。接着就以这个返回值以及集合里面的下一个元素为参数来调用 给定的函数,知道集合里面的元素都被计算了 — 最后返回一个值. 这个函数与ruby里面的inject 以及Haskell里面的foldl 作用是一样的。

memoize 函数接受一个参数,它的作用就是给原来的函数加一个缓存,所以如果同样的参数被调用了两次, 那么它就直接从缓存里面返回缓存了的结果,以提高效率, 但是当然它会需要更多的内存。(其实也只有函数式编程里面能用这个技术, 因为函数没有side-effect, 多次调用的结果保证是一样的)

map 对一个给定的集合里面的每一个元素调用一个指定的方法,然后这些方法的所有返回值构成一个新的集合(LazySeq)返回。这个指定了函数也可以有多个参 数,那么你就需要给map多个集合了。如果这些给的集合的个数不一样,那么执行这个函数的次数取决于个数最少的集合的长度。比如:

 
1
2
3
; The next line uses an anonymous function that adds 3 to its argument.
(map #(+ % 3) [2 4 7]) ; -> (5 7 10)
(map + [2 4 7] [5 6] [1 2 3 4]) ; adds corresponding items -> (8 12)

apply 把给定的集合里面的所有元素一次性地给指定的函数作为参数调用,然后返回这个函数的返回值。所以apply与map的区别就是map返回的还是一个集合,而apply返回的是一个元素, 可以把apply看作是SQL里面的聚合函数。比如:

1
(apply + [2 4 7]); -> 13

(defn teenager? [age] (and (>= age 13) (< age 20)))

(def no-teen? (complement teenager?))

(println (no-teen? 47))

complement取反

(defn time2 [n] (* n 2))

(defn minus3 [n] (- n 3))

(def my-composition (comp time2 minus3))

(println (my-composition 4))

后一个函数执行结果 ,作为前一个函数的参数

分享到:
评论

相关推荐

    Python-一个Leiningen插件将clojure与jupyter笔记本集成

    标题中的“Python-一个Leiningen插件将clojure与jupyter笔记本集成”指的是一个用于Clojure编程语言的工具,它允许开发者通过Leiningen这个Clojure项目管理工具来使用Jupyter Notebook。Jupyter Notebook是一种交互...

    gorilla-repl:笔记本样式的Jony Epsilon丰富REPL for Clojure的叉子

    Gorilla是Clojure笔记本电脑风格的丰富REPL。 如果您有兴趣,请访问其。 贡献 非常欢迎以评论,批评,错误报告或代码的形式进行贡献:-)如果您有重大更改的想法,请给我发送电子邮件,以便我们协调工作。 注意:这...

    Clojure Handbook(2012.11.1)

    Clojure Handbook是一份关于Clojure编程语言的学习笔记,旨在为读者提供一个方便的备查材料,以加深对Clojure语言特性的理解和记忆。 首先,Clojure作为Lisp语言家族的一员,具有一些独特的特性。Lisp语言以其极简...

    clojure-notes:Clojure学习笔记

    这篇“Clojure学习笔记”将带你深入了解Clojure的核心概念和实践技巧。 一、Clojure的基础 1. 数据结构:Clojure提供了丰富的内置数据结构,如列表(Lists)、向量(Vectors)、映射(Maps)和集合(Sets)。这些...

    microservices-with-clojure:使用Clojure的微服务的学习笔记

    本学习笔记主要关注的是如何使用Clojure语言来构建微服务。 Clojure是一种基于Lisp方言的函数式编程语言,它运行在Java虚拟机(JVM)上,充分利用了Java生态系统的优势。在微服务领域,Clojure因其简洁的语法、强大...

    读书笔记:Scala与Clojure函数式编程模式Java虚拟机高效编程 &gt;源码.zip

    读书笔记:Scala与Clojure函数式编程模式Java虚拟机高效编程 &gt;源码

    Clojure Handbook (by jamesqiu).pdf

    Clojure是一门现代的Lisp方言,运行于JVM(Java虚拟机)之上,它结合了Lisp语言的强大表达能力和JVM平台的广泛生态。Clojure保留了Lisp的核心特性,如代码即数据(Code is Data),以及基于表达式的语法。在Clojure ...

    读书笔记:《Scala与Clojure函数式编程模式Java虚拟机高效编程》学习代码记录.zip

    读书笔记:《Scala与Clojure函数式编程模式Java虚拟机高效编程》学习代码记录

    菠菜源码JAVA-clojure-learning-notes:Clojure学习笔记

    Clojure学习笔记 为什么要学习Clojure 我写Java也有10多年了,其间用过Python、PHP、Ruby、Groovy、JS等动态语言。Java相对C、C++来说有明显的优势,可以说是一种更高级的语言,高级语言带来的优势是能用更少的代码...

    clojupyter:用于Clojure的Jupyter内核

    用于Clojure的Jupyter内核-在Jupyter Lab,Notebook和Console中运行Clojure代码。 目录 入门 在存储库的examples文件夹中,有3个示例笔记本,它们显示了clojupyter的某些功能。 请参阅显示了有关如何显示HTML和使用...

    ClojureTextEditor用于编辑clojure代码和markdown

    Markdown是一种轻量级的标记语言,常用于编写文档、笔记或博客。ClojureTextEditor支持Markdown编辑,意味着用户可以直接在编辑器中编写和预览Markdown格式的内容,无需切换到其他工具。编辑器可能包含了实时预览...

    grapple:用于Clojure和ClojureScript的实验笔记本REPL

    首轮, lein do clean, cljsbuild once prod然后启动一个REPL并运行, (require 'grapple.server)(grapple.server/start-server {})内置组件除了Clojure原语之外,当前还有四个可呈现的内置组件: grapple.table/...

    pack.alpha:打包Clojure项目

    笔记 这不是万无一失的。 如果我违反了您的要求,请让我知道。 $ clojure -Sdeps '{ :deps {pack/pack.alpha { :git/url " ...

    sicp_but_clojure:Clojure中的SICP示例和练习

    这些源代码文件扩展了./resources中的笔记内容,提供了解决SICP练习的实际实现。学习者可以通过阅读和修改这些代码,加深对Clojure语法和SICP概念的理解。 在Clojure中实现SICP的益处在于: - **函数式编程的思维...

    ob-clojure-literate:在组织模式下进行Clojure Literate编程的安装支架

    Org Mode是Emacs中的一个高度可扩展的文本编辑模式,广泛用于笔记、项目管理、任务追踪甚至编写文档。`ob-clojure-literate`正是将Clojure代码嵌入到Org Mode文档中的桥梁,使得开发者能够在同一个文件中编写文档和...

    clojure-unix:有关Clojure代码与Unix管道之间惊人相似之处的一些说明

    Clojure-Unix 学习困难又令人兴奋。 它改变了我对代码的思考方式,帮助我看到数据流经由... 在这里,您会发现一些有关Clojure如何帮助我学会摆脱烦恼并热爱Unix管道的笔记。 ( ) 版权所有2015 这项工作是根据。

    learning-clojure

    在这个压缩包文件中,可能包含了源代码、教程、笔记或者其他有助于理解和掌握Clojure的材料。 Clojure的特点之一是其强大的列表处理能力,源于Lisp的传统。它鼓励使用纯函数和不可变数据结构,这有助于编写出简洁、...

    covid19-clj-viz:用于COVID19可视化文章的REPL笔记本–从Clojure在Vega中生成地图的示例代码

    `covid19-clj-viz` 是一个专注于COVID-19数据可视化的项目,它利用Clojure编程语言和Vega库来创建交互式的数据图表,特别是地图。这个项目为数据科学家、程序员和对COVID-19数据分析感兴趣的人提供了一个学习和实践...

    clojurestuff:我在玩clojure。 向前走

    这些文件可能是Clojure源代码文件(.clj或.cljs),也可能是笔记或测试脚本。通过研究这些文件,你可以更深入地了解Clojure的语法、函数、数据结构以及如何在实际项目中应用它们。 总结来说,Clojure是一种强大且...

    kickstart:Clojure 新手半天研讨会的课程

    这个"kickstart-master"压缩包可能包含了上述学习路径中的所有资源,包括项目文件、笔记、练习和可能的解决方案。通过逐步学习和实践,Clojure新手将能够快速上手并掌握这个强大而富有表现力的语言。

Global site tag (gtag.js) - Google Analytics