博客
关于我
(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/

    你可能感兴趣的文章
    Objective-C实现获取GPU显卡信息(附完整源码)
    查看>>
    Objective-C实现获取HID设备列表 (附完整源码)
    查看>>
    Objective-C实现获取PE文件特征(附完整源码)
    查看>>
    Objective-C实现获取文件大小(字节数) (附完整源码)
    查看>>
    Objective-C实现获取文件头的50个字符(附完整源码)
    查看>>
    Objective-C实现获取文件最后修改时间(附完整源码)
    查看>>
    Objective-C实现获取文件末的50个字符(附完整源码)
    查看>>
    Objective-C实现获取本机ip及mac地址(附完整源码)
    查看>>
    Objective-C实现获取本机系统版本(附完整源码)
    查看>>
    Objective-C实现蓄水池算法(附完整源码)
    查看>>
    Objective-C实现观访问者模式(附完整源码)
    查看>>
    Objective-C实现视频流转换为图片(附完整源码)
    查看>>
    Objective-C实现视频除雾算法(附完整源码)
    查看>>
    Objective-C实现角谷猜想(附完整源码)
    查看>>
    Objective-C实现解密 Atbash 密码算法(附完整源码)
    查看>>
    Objective-C实现解密藏头诗(附完整源码)
    查看>>
    Objective-C实现解析数学表达式解析(附完整源码)
    查看>>
    Objective-C实现解释器模式(附完整源码)
    查看>>
    Objective-C实现计时(附完整源码)
    查看>>
    Objective-C实现计算各种形状的面积算法(附完整源码)
    查看>>