博客
关于我
(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基础 | 关于“循环”那些事
    查看>>
    python系列【仅供参考】:python 远程rdp
    查看>>
    python基于flask搭建http服务(四)—— Docker容器化部署
    查看>>
    Python块键盘/鼠标输入
    查看>>
    python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
    查看>>
    python在gpu上运行_【python】python开启GPU加速
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在def函数中使用for循环
    查看>>
    Python在Conda环境中,但在Windows虚拟环境中没有激活
    查看>>
    python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
    查看>>
    python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
    查看>>
    Python图像处理:从内存加载jpeg
    查看>>
    python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
    查看>>
    python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
    查看>>
    python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
    查看>>
    python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
    查看>>
    Python哪个版本最稳定好用2023.10.19
    查看>>
    Python和黑客技术的渊源
    查看>>
    Python和RF编写接口自动化
    查看>>
    python和js哪个难_【Python】记一次学习,Python 与 js 在实现闭包时的差异
    查看>>