Clojure - 语法

首页 / Clojure / Basic Syntax

为了了解Clojure的基本语法,我们首先来看一个简单的Hello Learnfk程序。

在完整的Clojure程序中编写" Hello Learnfk",以下是一个示例。

(ns clojure.examples.hello
   (:gen-class))
(defn hello-Learnfk []
   (println "Hello Learnfk"))
(hello-Learnfk)

关于上述程序,需要注意以下几点。

  • 程序将被写入一个名为main.clj的文件中,扩展名"clj"是clojure代码文件的扩展名,在上面的示例中,文件名称为main.clj。

  • " defn"关键字用于定义函数,我们创建一个名为helloLearnfk的函数,它将具有我们的主要Clojure代码。

  • 在Clojure代码中,我们使用" println"语句将" Hello Learnfk"打印到控制台输出。

  • 然后我们调用hello-Learnfk函数,该函数依次运行" println"语句。

上面的程序产生以下输出。

无涯教程网

Hello Learnfk

声明形式

任何语句的一般形式都需要用大括号括起来,如以下示例所示。

(+ 1 2)

在上面的示例中,整个表达式用大括号括起来,上面的语句的输出为3。+运算符的作用类似于Clojure中的函数,该函数用于添加数字,值1和2被称为函数的参数。

让我们考虑另一个示例,在此示例中," str"是用于连接两个字符串的运算符,字符串" Hello"和" Learnfk"用作参数。

(str "Hello" "Learnfk")

如果我们结合以上两个语句并编写一个程序,它将类似于以下内容。

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (println (str "Hello Learnfk"))
   (println (+ 1 2)))
(Example)

上面的程序产生以下输出。

无涯教程网

Hello Learnfk
3

命名空间

名称空间用于定义Clojure中定义的模块之间的逻辑边界。

当前命名空间

这定义了当前Clojure代码所在的当前名称空间。

*ns*

在REPL命令窗口中,运行以下命令。

链接:https://www.learnfk.com/clojure/clojure-basic-syntax.html

来源:LearnFk无涯教程网

*ns*

当我们运行上述命令时,输出将取决于当前名称空间是什么,以下是输出示例, Clojure代码的名称空间是-

clojure.examples.hello

(ns clojure.examples.hello
   (:gen-class))
(defn Example []
   (println (str "Hello Learnfk"))
   (println (+ 1 2)))
(Example)

Require语句

Clojure代码打包在库中,每个Clojure库都属于一个名称空间,该名称空间类似于Java包,您可以使用" Require"语句加载Clojure库。

(require quoted-namespace-symbol)

以下是此语句的用法示例

(ns clojure.examples.hello
   (:gen-class))
(require clojure.java.io')
(defn Example []
   (.exists (file "Example.txt")))
(Example)

在上面的代码中,我们使用" require"关键字来导入名称空间clojure.java.io,该名称空间具有输入/输出函数所需的所有函数。

Clojure注释

注释用于记录您的代码。使用;;标识单行注释。以下是一个示例

(ns clojure.examples.hello
   (:gen-class))

;;亲,我是注释
(defn Example []
   (println "Hello Learnfk"))
(Example)

定界符(Delimiters)

在Clojure中,可以使用弯曲的或方括号的大括号对语句进行拆分或定界。

(ns clojure.examples.hello
   (:gen-class))

;; This program displays Hello Learnfk
(defn Example []
   (println (+ 1 2 3)))
(Example)

上面的程序产生以下输出。

无涯教程网

6

以下是另一个示例

(ns clojure.examples.hello
   (:gen-class))

;; This program displays Hello Learnfk
(defn Example []
   (println [+ 1 2 3]))
(Example)

上面的程序产生以下输出。

无涯教程网

[#object[clojure.core$_PLUS_ 0x10f163b "clojure.core$_PLUS_@10f163b"] 1 2 3]

空格(Whitespaces)

空格可以在Clojure中使用,以拆分语句的不同部分,以提高可识别度, 这可以在逗号(,)运算符的帮助下完成。

如以下两个语句是等效的,并且两个语句的输出均为15。

(+ 1 2 3 4 5)
(+ 1, 2, 3, 4, 5)

尽管Clojure忽略逗号,但有时会使用逗号使程序员更容易阅读。

如果您具有如下所示的哈希图(def a-map {:a 1:b 2:c 3})并在REPL窗口中询问其值,则Clojure将输出显示为{:a 1, :b 2,:c 3}。

符号(Symbols)

在Clojure中,符号等效于其他编程语言中的标识符,但是与其他编程语言不同,编译器将符号视为实际的字符串值,因为符号是值,所以可以像其他任何对象一样将符号存储在集合中,作为参数传递给函数等。

以下是符号的有效示例。

tutorial-point!
TUTORIAL
+tutorial+

项目结构

最后,让我们谈谈Clojure项目的典型项目结构,由于Clojure代码在Java虚拟机上运行,​​因此Clojure内的大多数项目结构与Java项目中的结构相似。以下是Eclipse中Clojure项目的示例项目结构的图。

Basic 语法

关于上述程序结构,需要注意以下关键事项。

  • demo_1                 -  这是放置Clojure代码文件包。

  • core.clj                  -  这是主要的Clojure代码文件,其中将包含Clojure应用程序的代码。

  • Leiningen             -   文件夹包含诸如clojure-1.6.0.jar之类的文件,该文件是运行任何基于Clojure的应用程序所必需的。

  • pom.properties   -   文件将包含诸如groupId,artifactId和Clojure项目版本的信息。

  • project.clj             -   文件包含有关Clojure应用程序本身的信息,以下是项目文件内容的示例

(defproject demo-1 "0.1.0-SNAPSHOT"
   :description "FIXME: write description"
   :url "http://example.com/FIXME"
   :license {
      :name "Eclipse Public License"
      :url "http://www.eclipse.org/legal/epl-v10.html"
   }
   :dependencies [[org.clojure/clojure "1.6.0"]])

这一章《Clojure - 语法》你学到了什么?在下面做个笔记吧!做站不易,你的分享是对我们最大的支持,感谢!😊

相关文章

微服务架构实战160讲 -〔杨波 - 171讲〕

程序员进阶攻略 -〔胡峰 - 65讲〕

系统性能调优必知必会 -〔陶辉 - 47讲〕

TensorFlow 2项目进阶实战 -〔彭靖田 - 56讲〕

BsonSerializationException:类的创建者映射有 2 个参数,但没有...

根据 url 列表创建合并的 df [pandas]

将json反序列化为pojo,其中json字段具有不同的数据类型C#

如何在考虑另一表的值的情况下计算一列的值

如何停止 func 运行并在一分钟后返回一个值?

如何以与 inspect.signature 一起使用的方式包装 python 函数?

好记忆不如烂笔头。留下你的足迹吧 :)