博客
关于我
(cljs/run-at (->JSVM :browser) "语言基础")
阅读量:427 次
发布时间:2019-03-06

本文共 2090 字,大约阅读时间需要 6 分钟。

ClojureScript入门与实践探索

两年多前知道ClojureScript的存在时十分兴奋,但由于工作中并无实际应用,国内也缺乏相关职位,导致对其深入探索被搁置。然而,随着函数式编程的热潮来临,主导新项目的前端架构让我有幸引入Ramda.js,填补了内心深处的探索渴望。如今,毫无顾虑地追逐ClojureScript的足迹,已经让我对这门语言充满了向往。

ClojureScript简述

ClojureScript(ClojureScript,简称cljs)是将Clojure代码转译为JavaScript代码,从而在浏览器或其他JSVM环境中运行的技术。由于宿主环境的差异,cljs只能在JSVM与宿主环境无关的Clojure代码中发挥作用。尽管cljs未能完全实现Clojure的所有语言特性,但由于JSVM是单线程环境,因此也不需要像Clojure那样支持STM等并发特性。

为什么选择ClojureScript?

在众多转译为JavaScript的函数式编程语言(如Elm、PureScript)中,选择ClojureScript主要基于以下几个原因:

  • 独特的语法风格:ClojureScript的语法确实带有些geek感,给人一种随心所欲的感觉。
  • 灵活性:ClojureScript在代码转译和运行时提供了较高的灵活性。
  • 社区支持:ClojureScript拥有活跃的开发者社区和丰富的资源。
  • 快速入门

    如果你对ClojureScript感兴趣,可以直接通过clojurescript.net的Web REPL进行实践。

    注释方式

    在编程过程中,注释是必不可少的。ClojureScript支持多种注释方式:

    • 单行注释:; 或 ;; 或 ;;;
    • 多行注释:;;、;;;、; (comment "多行注释")
    • 宏或defmulti的注释:;;;;
    • 命名空间注释:#_

    数据类型

    ClojureScript的数据类型种类繁多,为程序的逻辑设计提供了多样化的选择。主要数据类型包括:

    • 标量类型

      • nil:表示空值或空集
      • String:字符串
      • Char:字符(支持\a和\newline)
      • Boolean:布尔类型
      • Long:长整型
      • Float:浮点型
      • Keyword:关键字(以:开头)
      • Symbol:标识符
    • 集合类型

      • List:列表
      • Vector:向量
      • Set:集合
      • Map:映射

    命名空间

    在ClojureScript中,每个符号都属于特定的命名空间。命名空间的声明通常放在文件的开头:

    (ns hello-world.core)

    文件与命名空间的对应关系如下:

    • 命名空间hello_world.core对应文件hello_word/core.cljs、hello_word/core.clj或hello_word/core.cljc。

    绑定与函数

    ClojureScript采用不可变数据结构,因此没有变量的概念,而是引入了“绑定”概念。

    绑定

    • 全局绑定声明:(declare x)
    • 全局绑定定义:(def x)
    • 带有初始化值的全局绑定:(def x 1)

    注意:ClojureScript的绑定和函数遵循先声明后使用的规则。

    函数

    函数的特点是:

    • 必定返回一个值
    • 默认返回最后一个表达式的结果

    函数定义方式:

    (defn 函数名 [参数1 参数2 & ...] 函数体)

    流程控制

    ClojureScript提供了丰富的流程控制结构,包括:

    • 条件语句:if、when、cond
    • 循环语句:loop
    • 异常处理:try、catch、finally
    • 递归:recur

    进阶主题

    与JavaScript互操作

    由于ClojureScript运行在JSVM上,与JavaScript代码的互操作性非常重要。以下是一些常用的操作:

    • 调用JavaScript函数:

      (js/Math.pow 2 2) ;; 或 (pow js/Math 2 2)
    • 获取和设置JavaScript对象属性:

      (.-body js/document) ;; 获取嵌套属性(aset! js/location "href" "新链接") ;; 设置属性
    • 数据类型转换:

      ;; 将ClojureScript类型转换为JavaScript类型(js/Array. 1 2) ;; [1, 2];; 将JavaScript类型转换为ClojureScript类型(clj->js [1 2]) ;; [1, 2]
    • 解构与 destructuring:

      (let [[a _ b :as orig] [1 2 3 4 5]]  (println {:a a, :b b, :more more, :orig orig}))

    总结

    ClojureScript的语法优雅,特性独特,适合那些追求代码简洁与功能强大的开发者。虽然在实际项目中可能不如Ramda.js那么流行,但它的独特性和灵活性使其在某些场景下难以替代。接下来,我们将一起深入探索ClojureScript的更多特性,并了解如何在实际项目中应用它。

    转载地址:http://zxsuz.baihongyu.com/

    你可能感兴趣的文章
    python中0、1、True、False、if条件
    查看>>
    python中argparse模块关于 parse_args() 函数详解(全)
    查看>>
    python中base64编码与解码
    查看>>
    python中break怎么用_详解Python中break语句的用法
    查看>>
    python中del函数的垃圾回收
    查看>>
    Python中DrissionPage的详细解析与实战
    查看>>
    python中enumerate、变量类型转换
    查看>>
    python中execute是啥_python – 为什么“c.execute(…)”打破循环?
    查看>>
    python中exit和break区别_Python中exit()和sys.exit()之间的区别
    查看>>
    python中h5的用法
    查看>>
    python中http协议编程_HTTP编程
    查看>>
    python中if的效率_python中关于if-else使用性能的一点感悟
    查看>>
    python中import os_Python:相对导入与绝对导入(import)、os.path、__file__
    查看>>
    python中is和==操作符
    查看>>
    python中range()函数的返回值是多少?
    查看>>
    Python中range对象的使用以及打印九九乘法表
    查看>>
    Python中reshape函数参数-1的意思?
    查看>>
    Python中set.discard和set.remove方法之间的运行时差异?
    查看>>
    Python接口自动化测试企业级实战
    查看>>
    python中tkinter中value_输入字段中的python Tkinter get()值
    查看>>