Clojure 是一个运行在 Java 虚拟机上的 Lisp 方言,以其简洁而富有表现力的语法而闻名。下面是一些 Clojure 的基础语法介绍,包括代码示例及解释:
1. 程序结构和命名空间(Namespace)
Clojure 程序通常以 ns
特殊形式开始,用于定义命名空间,类似于其他语言的 package 或 module。命名空间允许你组织代码和避免命名冲突。
1
2
|
(ns clojure.examples.hello
(:gen-class))
|
这表示定义了一个名为 clojure.examples.hello
的命名空间,并使用 :gen-class
选项来生成一个 Java 类。
2. 定义和使用函数(Function Definitions)
使用 defn
宏定义函数,参数列表和函数体都在其后。
1
2
|
(defn hello-world []
(println "Hello World"))
|
hello-world
是一个无参函数,调用 println
函数在控制台打印 “Hello World”。
3. 打印输出
使用 println
函数输出信息到控制台。
1
|
(hello-world) ; 执行函数并打印 "Hello World"
|
4. 算术表达式和函数调用
Clojure 中,运算符也是函数,因此需要使用括号来调用。
1
2
|
(+ 1 2) ; 输出 3
(str "Hello" "World") ; 输出 "HelloWorld"
|
5. 注释
单行注释使用 ;;
。
1
|
;; This program displays Hello World
|
6. 控制流
Clojure 提供了 if
、when
和 cond
等控制流语句。
1
2
|
(if true "hello" "world") ; 如果条件为 true,结果为 "hello"
(when true (println "This will print")) ; 当条件为 true 时执行打印操作
|
7. 符号(Symbols)
符号是 Clojure 中的标识符,通常用作变量名或函数名。
1
2
|
user=> (def x 10) ; 定义一个符号 x 并赋值为 10
user=> x ; 使用符号 x,输出 10
|
8. 集合操作
Clojure 内置丰富的集合操作,如 set
、map
、vector
等。
1
2
3
4
5
6
|
(def vowels #{"a" "e" "i" "o" "u"}) ; 定义一个集合
(defn pig-latin [word]
(let [first-letter (first word)]
(if (vowels (str/lower-case first-letter))
(str word "ay")
(str (subs word 1) first-letter "ay"))))
|
9. 项目结构
Clojure 项目通常包括 project.clj
文件,它定义了项目设置和依赖。
1
2
|
(defproject demo-1 "0.1.0-SNAPSHOT"
:dependencies [[org.clojure/clojure "1.6.0"]])
|
这些基础概念涵盖了 Clojure 编程的入门知识,包括程序结构、函数定义、控制流、注释、符号、集合操作和项目结构。随着学习的深入,你将发现 Clojure 语言简洁而强大的特性。
下面是一个完整的 Clojure 程序示例,它包含了一些基础语法和详细的注释,以帮助理解代码的工作原理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
; 定义命名空间,类似于其他语言中的 package 或 module
; :gen-class 选项用于生成一个 Java 类,以便可以作为独立应用程序运行
(ns clojure.examples.basic
(:gen-class))
; 使用 def 宏定义一个常量 pi,它将在整个命名空间中可用
(def pi 3.14159)
; 使用 defn 宏定义一个函数,它接受一个半径作为参数并返回圆的面积
(defn circle-area [radius]
; 使用 * 运算符计算圆的面积
(* pi (Math/pow radius 2)))
; 使用 defn 定义一个主函数,它是程序的入口点
(defn -main [& args]
; 使用 println 函数打印欢迎信息
(println "Welcome to the Clojure basic syntax example.")
; 定义一个半径变量
(def radius 5)
; 调用 circle-area 函数并打印结果
; 使用 str 函数将数字格式化为字符串
(println (str "The area of the circle with radius " radius " is: "
(circle-area radius)))
; 处理命令行参数
(if (> (count args) 0)
; 如果有参数,尝试将其作为半径计算面积
(let [input-radius (Double/parseDouble (first args))]
(println (str "The area with input radius " input-radius " is: "
(circle-area input-radius))))
; 否则,打印提示信息
(println "You can pass a radius as an argument to calculate the area."))
; 返回 nil 表示程序正常结束
nil)
; 程序入口点,JVM 调用这个方法来启动程序
(-main)
|
这个程序首先定义了一个命名空间 clojure.examples.basic
,并使用 :gen-class
选项来生成一个 Java 类。然后定义了一个常量 pi
,接着定义了两个函数:circle-area
用于计算圆的面积,-main
作为程序的入口点。
-main
函数首先打印欢迎信息,然后定义了一个半径变量 radius
并调用 circle-area
函数来计算并打印圆的面积。如果命令行提供了参数,程序将尝试使用第一个参数作为半径来计算面积。最后,-main
函数返回 nil
,表示程序正常结束。
这个示例涵盖了 Clojure 的基本语法元素,包括命名空间定义、常量和函数定义、字符串操作、条件判断、命令行参数处理等。