Clojure语法

字面量

数字类型

42              ; 长整型,64位,范围  -2^63 to 2^63-1

6.022e23   ; 64位双精度浮点数

42N           ; 任意精度整数

1.0M          ; 任意精度定点小数

22/7           ; 比值

字符类型

"hello"        ; 字符串

\e               ; 字符

其他类型

nil               ; 空值

true,false  ; 布尔值

#"[0-9]+"      ; 正则表达式

:alpha          ; 关键字

:release/alpha   ; 带命名空间的关键字

map             ; 符号

+                  ; 符号,大多标点符号都可以是符号

clojure.core/+   ; 命名空间符号


上面的所有文字都是有效的Clojure表达式

Clojure还包括四种集合类型的字面量语法:

'(1 2 3)    ; list列表

[1 2 3]     ; vector向量

#[1 2 3]   ; set 集合

{:a 1, :b 2}   ; map 键值对


Evalution求值

传统Java Evalution求值方式

在Java中,源代码(.java文件)由编译器(javac)读取为字符,它生成可由JVM加载的字节码(.class文件)。

Clojure Evalution方式

在Clojure中,源代码由Reader读取成字符。 Reader可以从.clj文件中读取源代码,也可以交互式地给出一系列表达式。 Reader生成Clojure数据结构。 然后,Clojure编译器生成JVM的字节码。

以下2点很重要:

1.源代码的单位是Clojure表达式,而不是Clojure源文件。 源文件作为一系列表达式被读取,就像在REPL中以交互方式键入这些表达式一样。

2.分离阅读器和编译器的分离很关键,它为宏提供了空间。 宏是一种特殊的函数,它接受代码(作为数据),并发射代码(作为数据)。

结构与语义

Clojure表达式:

此图说明了绿色语法(由Reader生成的Clojure数据结构)与蓝色语义(Clojure运行时如何理解该数据)之间的区别。

除符号和列表外,大多数文字Clojure表单都会自行evaluate。 在evaluate时,符号用于指代其他内容,返回它们所引用的内容。 列表(如图中所示)被evaluate为调用。

在图中,(+ 3 4)被读作包含符号(+)和两个数字(3和4)的列表。 第一个元素(找到+的地方)可以称为“函数位置”,也就是找到要调用的东西的地方。 虽然函数是一个显而易见的调用,但运行时,宏和一些其他可调用的东西也有一些特殊的运算符。

上述表达式被evaluate为:

1. 3 和 4被evaluate成它们自己,即长整数

2. + 号被evaluate为一个实现了+功能的方法

3. list被evaluate为函数调用,调用了已3和4为参数的+方法

许多语言都有语句和表达式,其中语句具有一些有状态效果但不返回值。 在Clojure中,一切都是对一个值进行evaluate的表达式。 一些表达(但不是大多数)也有副作用。

阻止求值

有时候阻止求值是很有用的,特别是为了使用符号本身和list的时候,用法

user=> 'x    ;x

user=>'(123)   ;(1 2 3)

REPL

大多数REPL环境都支持一些技巧来帮助交互式使用。 例如,一些特殊符号记住最后三个表达式求值的结果:

*1 (最后一个的结果)

*2 (最后2个表达式的结果)

*3 (最后3个表达式的结果)

此外,还有一个命名空间clojure.repl,它包含在标准Clojure库中,提供了许多有用的功能。 要加载该库并使其功能在我们当前的上下文中可用,请调用:

(require '[clojure.repl :refer :all])

我们现在可以访问一些在REPL中有用的附加功能:doc, find-doc, apropos, source, and dir

doc是一个显示任何函数文档的函数,如

如果你不确定要使用哪个函数? 您可以使用apropos命令查找与特定字符串或正则表达式匹配的函数。

你还可以扩大搜索范围,以使用find-doc包含文档字符串

如果您想查看特定命名空间中函数的完整列表,可以使用dir函数。 在这里我们可以在clojure.repl命名空间中使用它:

查看源代码 source函数

资源:https://clojure.org/api/cheatsheet

Clojure基础

def

当你在REPL中对表达式求值时,保存一段数据以供日后使用会很有用。 我们可以用def做到这一点

def是一种特殊形式,它将当前命名空间中的符号(x)与值(7)相关联。 这种联系称为一个var(变量)。 在大多数实际的Clojure代码中,vars应该被引用为常量值或函数,但是为了方便起见,在REPL中工作时通常会定义和重新定义它们。

注意上面的返回值是#'user / x - 这是var:#'的文字表示,后跟命名空符号。 user是默认名称空间。

回想一下,通过查找它们引用的内容来评估符号,这样我们就可以通过使用符号来获取值:

打印Printing

学习语言时最常见的事情就是打印出值。 Clojure提供了几种打印值的功能:

人类可读的函数会将特殊的打印字符(如换行符和制表符)转换为预期的形式,并打印不带引号的字符串。 我们经常使用println来调试函数或在REPL上打印一个值。 println接受任意数量的参数,并在每个参数的打印值之间插入一个空格:

println函数具有副作用(打印)并因此返回nil。

请注意,上面的“what is this:”不会打印周围的引号,也不是Reader可以以相同方式再次读取的字符串。 为此,请使用机器可读的版本prn:

请注意,这打印结果是Reader可以再次读取的有效形式。 human-和readable-打印功能在不同的环境中都很有用。

测试

1.使用REPL计算7654和1234

2.将以下代数表达式重写为Clojure表达式:7 + 3 * 4 + 5 ) / 10

3.使用REPL文档函数,找到rem和mod函数的文档,根据文档比较提供的表达式

4.使用find-doc,找到打印最新REPL异常的堆栈跟踪的函数


翻译自: https://www.clojure.org/guides/learn/syntax

翻译者:Eyck Luo

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容