博客
关于我
(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.cljshello_word/core.cljhello_word/core.cljc

    绑定与函数

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

    绑定

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

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

    函数

    函数的特点是:

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

    函数定义方式:

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

    流程控制

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

    • 条件语句ifwhencond
    • 循环语句loop
    • 异常处理trycatchfinally
    • 递归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/

    你可能感兴趣的文章
    pandas 数据框至海运分组条形图
    查看>>
    pandas 时序统计的高级用法!
    查看>>
    pandas 时间序列重新采样结束给定的一天
    查看>>
    pandas 根据不是常量的第三列的值将值从一列复制到另一列
    查看>>
    pandas 根据值从多列中的一列查找
    查看>>
    Pandas 根据布尔条件选择行和列
    查看>>
    pandas 滚动窗口 - datetime64[ns] 未实现
    查看>>
    pandas 版本兼容特定的蟒蛇和NumPy配置吗?
    查看>>
    pandas 生成excel多级表头
    查看>>
    Pandas 的 DataFrame 详解-ChatGPT4o作答
    查看>>
    pandas 读取excel数据,以字典形式输出
    查看>>
    Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
    查看>>
    pandas 适用,但仅适用于满足条件的行
    查看>>
    pandas 重新采样到每月的特定工作日
    查看>>
    pandas :我如何对堆叠的条形图进行分组?
    查看>>
    pandas :按移位分组和累加和(GroupBy Shift And Cumulative Sum)
    查看>>
    pandas :检测一个DF和另一个DF之间缺失的列
    查看>>
    Pandas-从具有嵌套列表列表的现有列创建动态列时出错
    查看>>
    Pandas-通过对列和索引的值求和来合并两个数据框
    查看>>
    pandas.columns、get_dummies等用法
    查看>>