`

clojure 变量定义 函数定义 宏定义

阅读更多

这篇文章介绍clojure的变量,函数,宏的定义及调用

1. 变量定义

变量定义使用def关键字,clojure中的变量是常量,一旦定义就不可改变

另外变量定义是全局可见的,比如你在函数中使用def定义变量,执行该

函数后,在函数体外是可以访问该变量的

=>(def a 10);定义变量a的值

10           

 

2. 函数定义  

函数定义有多种方式,具体可看官方文档,这里以defn为例子

(defn name doc-string? attr-map? [params*] body
(defn name doc-string? attr-map? ([params*] body) + attr-map?)

例子:

=> (defn add [a b] (+ a b))

=>(add 1 2)

3

还可以用fn, 用于定义匿名函数

=> (def add (fn [a b] (+ a b)))

=>(add 1 2)

3

还可以用 读取器宏‘#’来定义匿名函数

=>(def add #(+ %1 %2));  %1,代表第一个参数

 

3. 宏定义

宏定义使用 defmacro,宏非常强大,也是一个难点,

  • (defmacro name doc-string? attr-map? [params*] body)
  • (defmacro name doc-string? attr-map? ([params*] body) + attr-map?)

以下定义了一个执行三次表达式的宏

=>(defmacro triple-do [form]
    (list 'do form form form)
)

=>(triple-do (println "test"));  打印3次test

分享到:
评论

相关推荐

    Clojure Handbook(2012.11.1)

    在学习Clojure的过程中,Handbook介绍了语言的基础知识,如REPL(Read-Eval-Print Loop)交互式环境、变量定义、基本类型、类型判断、执行多条语句的do表达式、条件语句、循环语句、正则表达式、命名空间、结构体...

    defun:定义带有参数模式匹配的clojure函数的宏,就像erlang或elixir

    在Clojure编程语言中,`defun`是一个非常有用的宏,它允许开发者定义函数并支持参数模式匹配。这个特性借鉴了Erlang和Elixir等函数式编程语言的设计理念,使得编写函数时能够更加灵活和简洁。下面我们将深入探讨`...

    the joy of clojure.pdf

    1. **基础语法与构造**:这一部分介绍了Clojure的基础语法,包括数据类型、变量定义、条件判断和循环等基本概念。 2. **Clojure标准库**:Clojure的标准库提供了丰富的功能,包括集合操作、文件处理、网络通信等功能...

    Clojure编程乐趣_PDF电子书下载 带书签目录 完整版

    3. **强大的元编程能力**:Clojure支持宏,允许开发者定义新的语法结构,从而实现更灵活的编程方式。 4. **高效的并发模型**:Clojure提供了一种称为“软件事务内存”(Software Transactional Memory, STM)的机制...

    managementbu-0.0.4.zip

    描述中提到的"def-clj.zip"是Clojure语言的一个宏库,专门用于函数定义。Clojure是一种基于Lisp家族的动态类型编程语言,它运行在Java虚拟机(JVM)上。宏在Lisp系语言中是非常重要的特性,它们允许在编译时进行代码...

    Clojure Handbook (by jamesqiu).pdf

    2.2 定义变量、函数和绑定:Clojure提供了多种方式来定义变量、函数和绑定,包括def、let、binding等。 2.3 内部变量:在Clojure中,可以定义内部变量,用于存储函数内部使用的局部状态。 2.4 基本类型:Clojure...

    clojure 使用资料

    4. **宏(macro)**:Clojure允许定义宏,这是一种编译时的代码生成工具,可以用来扩展语言本身的语法,实现更高级别的抽象。 5. **社区和生态**:Clojure拥有活跃的社区和丰富的库生态系统,这些资源为开发者提供了...

    用于Clojure开发的VisualStudioCode扩展

    自动完成功能则能够快速提供函数、变量和常量的建议,减少手动输入时间,同时帮助学习和记忆Clojure的API。代码格式化则保持了代码的一致性,使得团队协作更为顺畅。 其次,错误检查或Linting工具可以实时检测代码...

    clojure-basics-源码.rar

    例如,你可能会看到如何使用`defn`定义函数,`let`创建局部变量,或者如何使用`map`函数对集合进行操作。此外,源码可能还涉及到Clojure的并发模型,如`swap!`函数用于原子性更新状态,以及`future`或`promise`来...

    clojure in action

    这一章通过一系列示例程序让读者快速了解Clojure的核心特性,如数据结构操作、函数定义、宏使用等。 - **第3章:Clojure的基础构建块** 在这一章中,作者深入讲解了Clojure中的基本类型、集合数据结构以及序列...

    sicp-clojure:在 Clojure 中解决的 SICP 练习

    在 sicp-clojure 中,你可能会发现一些例子展示了如何使用 `defmacro` 定义宏,或者利用 `reflect` 和 `meta` 函数获取关于代码的信息。 通过这个项目,你不仅能够学习 Clojure 语言,还能深化对编程语言原理和函数...

    fdat.cljc:Clojure进程和方言之间的函数序列化

    通过将函数定义转换为可以嵌入到其他数据结构中的形式,`fdat.cljc` 可能包含了处理这种转换的逻辑。 5. **Java Interop**:由于Clojure运行在JVM上,它可以利用Java的序列化机制。然而,Clojure的函数不是Java的`...

    函数式编程另类指南.pdf

    - **Lisp**及其衍生语言(如Scheme和Clojure):历史悠久的函数式编程语言,支持宏定义等高级特性。 - **Scala**:结合了面向对象和函数式编程特性的多范式语言。 - **Erlang**:强调并发处理和分布式系统的函数式...

    clojure-style-guide:Clojure编程语言的社区编码风格指南

    - 使用`(defn)`定义函数,参数列表放在括号内,函数体使用大括号包裹。 - 长函数应拆分为多个短函数,每个函数专注于一个特定任务。 - 使用`(fn)`定义匿名函数,常用于λ表达式和作为参数传递。 3. **函数设计**...

    clojure-rust:Clojure转换为Rust编译器

    4. **语义转换**:将Clojure的AST映射到Rust的AST,处理函数定义、变量绑定、控制流结构等。 5. **代码生成**:最后,从Rust的AST生成可编译的Rust源代码。 在这个过程中,编译器需要处理Clojure特有的功能,如: -...

    getting-started-clojure

    Clojure中的`fn`用于定义函数,`let`用于创建局部变量,`map`, `filter`, `reduce`等高阶函数则用于函数式数据处理。 **宏:** Clojure的宏(Macros)允许程序员在编译时进行代码操作,创建新的语法结构。宏不是在...

Global site tag (gtag.js) - Google Analytics