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

Clojure与LispClojure与Lisp

功能和元编程能力是建立在这样基础之上:异常驯服C语言"石头" 或 具有 延展性java语言"木头" ....Clojure 高速、干净、具有优先能力和优雅特征. 但是没有改变lisp中 "代码也是数据" 哲学. Clojure 语言在直觉和观感上比历史上lisp更易于阅读....Lisp无所不包,它既可能是某样表达式缩略形式,也可能是一种新语言编译器。如果你想真正地理解Lisp语言,或者想拓宽你编程视野,那么你必须学习。...Clojure 不仅可在 JVM 上运行,而且可以与Java无缝融合(JVM平台语言家族原则上都支持)互操作性。最后,Clojure 在设计上也考虑了并发性,并具有并发编程一些独特特性。...不可变减少了心智负担,降低了多线程编程难度,纯函数也更利于测试和调试。

1.8K30

clojure基础入门(一)

函数 clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数。...下面在函数内部使用a函数参数,如果想要拼接的话,可以在内部使用str函数,用它返回值当成Get函数参数:  ? 多个参数表示形式:[arg1,arg2] 流程控制 判断if ?...注意if是不是函数或,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示值作为函数返回值。...测试数字谓词有:even?,neg?,odd?,pos?,zero?。 总结 Clojure里面的每个操作被实现成以下三种形式:  函数(function)     文中以defn定义。  ...(macro)           Clojure中几乎所有的函数和都是用Clojure代码实现,关于后面再说。

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

clojure基础入门(一)

函数 clojure中以函数为第一类对象,其小括号后面第一个元素被Clojure解释器当成一个函数或,其后面的都会被当成参数。...下面在函数内部使用a函数参数,如果想要拼接的话,可以在内部使用str函数,用它返回值当成Get函数参数:  ? 多个参数表示形式:[arg1,arg2] 流程控制 判断if ?...注意if是不是函数或,而是叫做special form(特殊形式),而且没有else,用空白或换行即表示else,不用显式return,clojure会将最后一个表示值作为函数返回值。...测试数字谓词有:even?,neg?,odd?,pos?,zero?。 总结 Clojure里面的每个操作被实现成以下三种形式:  函数(function)     文中以defn定义。  ...(macro)           Clojure中几乎所有的函数和都是用Clojure代码实现,关于后面再说。

1.3K40

Clojure 运行原理之编译器剖析

为了更加具体描述 Clojure 运行原理,会分两篇文章来介绍。 本文为第一篇,涉及到主要内容有:编译器工作流程、Lisp 机制。...LispReader.java 一般来说,具有复杂语法编程语言会把词法分析与语法分析分开实现为 Lexer 与 Parser,但在 Lisp 家族中,源程序语法就已经是 AST 了,所以会把 Lexer...Clojure 里面通过defmacro函数创建,它会调用varsetMacro函数来设置元信息macro为true。...,form参数即是展开后各种数据结构(String/ISeq/IPersistentList 等),返回值类型为Expr,可以猜测出,Expr子类是程序主体,遵循模块化编程风格,每个子类都知道如何对其自身求值...编译器实现,加深了对 eval-apply 循环理解,还有一点就是揭开了真实面貌,之前一直认为是个很神奇东西,其实它只不过是编译时运行函数而已,输入与输出内容既是构成程序数据结构,同时也是程序内在

95230

JavaScript中线程运行,任务与微任务,EventLoop

对你不管是复杂还是简单,这其中涉及到只是点都是一样。JavaScript单线程任务与微任务,EventLoop。...JavaScript中线程 JavaScript是单线程脚本语言。...最开始有一个执行栈,当执行到带有异步操作任务时候,比如 setTimeout 时候就会将这个异步任务存在背景线程里面,待本次事件执行完成以后再去执行微任务。...代码作为第一个任务进入主线程,执行同步代码,遇到console.log(1),输出 1 遇到setTimeout,其回调函数被分发到任务 Event Queue 中,等待执行。...总结 之前了解过JavaScript单线程,也了解过JavaScript代码执行顺序,但是任务与微任务也是最近才听说,这对于一个从事两年前端开发者真的是,我自己过失。

3.3K42

面试题13(一个具有生命线程有哪些状态)

考点:考察求职者对线程理解 出现频率:★★★ 【面试题解析】线程状态表示线程在某时间段内进行活动和将要进行任务程有创建、就绪、运行、阻塞、死亡5种状态。...一个具有生命线程,总是处于以下5状态之一。 1.创建状态 实例化 Thread对象,但没有调用 start()方法时状态。...2.就绪状态 线程有资格运行,但调度程序还没有把它选为运行线程时所处状态。此时,线程具备了运行条件,一旦被选中,马上就能运行。...而且在线程运行之后,或者从被阻塞、等待或者睡眠状态回来之后,线程首先进入就绪状态 3.运行状态 从就绪状态池(注意不是队列,是池)中被选择为当前执行线程所处状态。...5.死亡状态 一个线程run()方法运行结束,那么该线程完成其使命,它栈结构将解散,也就是死亡了。

60750

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

另外函数式语言函数之间都是相互隔离,即便在多线程环境下也不会发生竞争和死锁情况,函数式编程语言会自动处理这些情况。...,按理说每个线程都修改这个引用会导致竞争状态出现,但从结果来看是正常,说明 Clojure 引擎在执行时会自动解决这个问题。...实际上当两个线程出现竞争而失败时,Clojure 会自动重试其中之一。...Clojure 凭借 partition 对计算进行分区,采取分而治之并对分区计算结果进行合并思路优化了并发性能。...Haskell 也有独特优势,它具有类型推断、惰性求值等特性,被认为更适合用于机器学习。 类型推断即 Haskell 类型都是静态,如果试图赋予错误类型会报错。

38910

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

Clojure还支持直接使用/符号输入比率常量。例如,5 / 8或3 / 4。用比率输入常量将会自动简化。如果你输入4 / 2,将被简单存储为2。 你能够以基数+r+值形式输入任何整型常量。...数字没有最大值限制。Clojure会自动转换为最合适内部表示形式来表示越来越大数字,处理任何数字都没有问题。...如果这些数据类型中任何一种都不足以表示某种数据结构,那么我们可以通过任何方式来组合它们。 这些数据类型都具有如下性质: 都不可变。...一旦被创建,它们就不可改变,因此对于任何时间任何线程来讲,访问它们都是安全。那些被认为是“改变了“它们操作实际上是返回了一个全新依旧不可变对象。 都是持久。...这告诉Clojure将其作为数据结构来对待,而不是将其当作Clojure形式对其求值。

2.2K10

Clojure 开发那些事

Clojure —— 新世纪 Lisp 方言,相信大多数同学多多少少都听过,毕竟有个杀手级应用 Storm,但是真正去写 Clojure 同学估计不多,国内也罕见哪个公司招 Clojure 程序员。...作为万里长城第一步,这篇文章首先如何入门 Clojure 语法,紧接着介绍 Clojure 开发环境搭建,然后介绍使用第三方库时一些注意点,最后介绍一下常见测试方法。...Clojure 宿主语言现在主要有两个:一个是最多最多基于 JVM ;另一个是基于微软 .NET Clojure-CLR,现在还有一个发展迅猛 ClojureScript,可以将 Clojure...Emacs + Cider 组合相比 Intellj + Cursive 最大优势就是对支持,Cider 提供了对展开快捷键,但在 Cursive 中我没找到,不过也是比较高级功能,初学者应用用不到...Intellj Debug Mode 借助于 IDE 优势,我们可以打断点,一步一步调试,但是 Cursive 对支持比较有限,目前出来把展开外,没找到好调试好方法。

1.5K20

Clojure 学习入门(11)—— macro

clojure macro在运行之前机械展开,定义相当于给语言增加新特性,写*原则*:  能写成函数就不要用(因为写没有写函数简单直观,容易写错,需要先在 REPL 中测试一番) ...只有不得不用时才用(性能要求高时比函数调用快,或者需要“代码数据”相互转换)  精心设计调用比函数调用更 DSL(如实现控制结构、传递 Java方法)  与函数 ;; 正确写法 (defmacro...10 (+ 5 2)) (println (macroexpand-1 '(op 5 + 2 * 10))) ;; (* 10 (+ 5 2)) (println (clojure.walk.../macroexpand-all '(op3 5 + 2 * 10))) ;; (op3 5 + 2 * 10) 说明:  正确写法,需要添加 list,用defmacro定义,不用写法函数用...,因此打印出结果也为赋值后最新结果

96520

几分钟内学习 Clojure

Clojure 是JVM上一个LISP语言变种,它比Common Lisp更强调纯函数式编程,但提供了一些STM工具以处理它所引入状态问题。...Clojure源码托管在:github 在线练习编译环境: himera learnclojure.clj 示例: ; 分号作为注释开始 ; Clojure 用一种把元素用括号括起来像列表一样方式来书写...,元素之间用空格隔开 ; clojure 解释器会把第一个元素当做是函数或者调用,其他都作为参数 ; 下面这个函数用于设置当前命名空间 (ns test) ; 更多基本例子: ; str 函数会用它所有的参数创造一个字符串...; 关键字类似字符串,但是做了一些性能上优化 (class :a) ; => clojure.lang.Keyword ; Maps 键可以是任意类型,但是通常推荐使用keywords (def...命名空间包含更多函数 ; 一些有用形式 ;;;;;;;;;;;;;;;;; ; clojure逻辑结构都是, 看起来也没什么不同 (if false "a" "b") ; => "b"

1.6K40

Clojure Web 开发-- Ring 使用指南

Clojure 众多 Web 框架中,Ring 以其简单统一 HTTP 抽象模型脱颖而出。...,将 HTTP 请求转为 Clojure map,将 Clojure map 转为 HTTP 相应 request map,HTTP 请求 map 表示 response map,HTTP...使用这里 handlers 代替上面 Hello World 示例中 handler 即可得到一个具有2条路由规则 Web 应用,同时针对其他路由返回 Page not found!。...Compojure 里面使用了大量来简化路由定义,像上面例子中GET、not-found等。...Ring 与其说是一个框架,不如说是由各个短小精悍函数组成 lib,充分展示了 Clojure 语言威力,通过函数组合定义出一套完整 HTTP 抽象机制,通过来实现“路由”特定领域语言,极大简化了路由定义

75510

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

本文将主要讨论 Clojure 编译成 bytecode 如何实现动态运行时以及为什么 Clojure 程序启动慢,这会涉及到 JVM 类加载机制。...Clojure 作为一本函数式编程语言,最基本概念是函数,没有类概念,那么 Clojure 代码生成以类为主 bytecode 呢?...我们知道 Clojure 里面很多“函数”其实是用实现在编译时会进行展开,生成新代码,上面代码中ns、defn都是,展开后(在 Cider + Emacs 开发环境下,C-c M-m)可得...把生成 uberjar 解压打开,可以发现 clojure.core 里面的函数都在,这些函数在程序启动时都会被加载。 这就是 Clojure 启动慢原因:加载大量用不到类。...总结 Clojure 作为一门 host 在 JVM 上语言,其独特实现方式让其拥动态运行时同时,方便与 Java 进行交互。

68820
领券