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

本文共 2095 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    Node-RED中使用node-red-node-ui-iframe节点实现内嵌iframe访问其他网站的效果
    查看>>
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Node-RED中通过node-red-ui-webcam节点实现访问摄像头并截取照片预览
    查看>>
    node-request模块
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    Node.js 的事件循环(Event Loop)详解
    查看>>
    node.js 简易聊天室
    查看>>
    Node.js 线程你理解的可能是错的
    查看>>
    Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js中环境变量process.env详解
    查看>>