manbetx手机版登陆零到嗡 - 行动2

在本次文章中,我们将着眼于实际ClojureScript源代码,一步一步来。的源代码上可以找到GitHub上

注意:我强烈建议阅读以前的帖子首先,如果你还没有这样做的话。

ClojureScript 101

在我们潜入之前,我们将看看Clojurescript的哲学。

由于ClojureScript是一种Lisp方言,它除掉,你可以从其他编程语言知道语法最。这使得它非常简单 - 但它在第一次看起来很陌生。

(+ 1 1)

该表达式(也称为S-表达,用于短象征性的表情)具有价值2。每个表达式都有一个值。括号界定其范围。基本上,一切在ClojureScript归结为这个简单的形式:

(功能param1 param2 ... paramn)

表达式中的第一个元素是功能位置中,其它的是它的参数。这就是所谓的前缀表示法,而相比之下,代数符号1 + 1从C的语言。

当然,表达式可以嵌套,太:

(Println( -  10(* 2 5)))))

此表达将打印0由于表达式从内到外评估。但有趣的是,它的价值是以来println.只有副作用,返回无意义的值。

注意+println.是评估为价值实际上只是符号,在这种情况下的功能。它们类似于在这方面的常量。

有三种类型的值可以在功能位置:

关于宏一两件事:他们是扩展语言和转换代码的一个非常有力的方式。例如,可以在执行前一函数的所有参数必须进行评估 - 但在的情况下(和(FN ...)(FN ...))我们不想评价第二个参数,如果第一个已经是假的!好东西是一种宏:它以懒惰地执行每个参数的方式转换代码,并且函数尽早返回。

但足够的了解宏。现在,我们将通过待办事项应用程序的源代码会继续。

第一步

我们的应用程序由三个ClojureScript源文件:app.cljs.item.cljsutils.cljs。让我们先从容易的。为了得到ClojureScript的感觉,我们将看看最小的文件第一:utils.cljs

;;utils.cljs,部分#1(NS todomvc.utils(:要求[cljs.reader:如读取器])(:进口[goog.ui IdGenerator]))

在第一行中,该文件的命名空间是通过指定ns.。每个ClojureScript文件需要定义一个唯一的命名空间,todomvc.utils.在这种情况下。这可以防止名称碰撞并与Google Closure的模块概念很好地集成。注意:命名空间与文件路径匹配并不巧合(Todomvc / utms.) - 必须的。

在第二行,外部Clojurescript命名空间cljs.reader装有:要求。它被命名读者通过所需:如并且可以通过在整个文件中此别名来引用。

在第三行中,:进口加载模块idgenerator.来自名称空间goog.ui的谷歌关闭图书馆。到差异:要求是我们加载特定元素,而不是命名空间,以便按名称引用它们。

注意:开头的词语是关键字。他们就像符号 - 但只是评价自己,而不是任意值。

;;utils.cljs,部分#2(DEFN变复数[n个字(如果(== n 1)的字;;“true'块(STR字 “S”)));;“false'块

DEFN定义了一个函数多个有两个参数:ñ。在身体里,如果返回原词时ñ等于1 - 否则字符“S”追加到一个新的字符串

注意DEFN是定义匿名功能的快捷方式FN并将其绑定到符号高清

;;utils.cljs,第3部分(现在,defn [](js / date。))

现在是不带任何参数的函数。它返回JavaScript的一个新实例日期目的。由于它是一个原生的JavaScript对象前缀JS /必须用来访问JS.命名空间。

注意:不显眼的负责调用该对象的构造,像在JavaScript中。

;;utils.cljs,部分#4(DEFN GUID [](.getNextUniqueId(.getInstance IdGenerator)))

GUID使用Closure库的idgenerator.返回一个新的唯一ID。这也说明了如何调用一个JavaScript对象的方法:(.methodName jsObject),注意开头。表达转化为idgenerator.getInstance()。getnextUniqueID()在JavaScript中。

;;utils.cljs,零件#5(defn隐藏[是隐藏的](如果是-imidd #js {:display“none”} #js {}))

返回JavaScript对象{显示: “无”}当参数是隐藏的是真的。正如你看到的,返回一个本地JavaScript对象使用#js {...}该元件在键/值对定义没有任何特殊字符,如

注意:在ClojureScript既不骆驼香烟盒也不snake_case使用,但是破折号分开的小写

;;utils.cljs,部分#6(DEFN存储([NS](存储纳秒NIL));; 1个参数(纳秒EDN]; 2个参数(如果 - 不是(零?EDN)(.setItem JS / localStorage的NS(STR EDN))(让[S(.getItem JS / localStorage的NS)](如果 - 不是(零?S)(读取器/读取字符串s)[])))))

商店读取数据并将数据写入浏览器的本地存储。它包含很多有趣的新事物。

首先,它是一个多参数数量的功能。这意味着允许的论点多个号码,[NS][ns edn]在这种情况下。它类似于函数在其他语言超载。在常见的情况是,为参数提供默认值。在这里,它使用对于第二个参数,如果否则指定。

其次,我们看到一些新功能。如果不显然是否定版本如果零?(在具有布尔返回类型的函数结束时具有“?”后缀的最佳实践)检查提供的值等于(其等同于空值在JavaScript)。允许绑定符号值局部地,有点像一个密闭高清:它从绑定,对符号/值的向量,和使用表达式的主体结束。这结合小号到本地存储访问的结果。

第三,序列化和反序列化ClojureScript数据结构:的文本结果(STR EDN)用本地存储写入.setItem从本地存储读取.getItem- 与反序列化(读者/读字符串S)来自读者命名空间更早加载。

注意:edn.可扩展的数据符号)就像是JSON的扩展版本与像非字符串映射键,设置和标签一些额外的好处。

这就是现在它。在行动3.我们来看看详细的OM-特定代码。

在此期间,如果您想了解更多关于ClojureScript我衷心推荐教程光表从大卫·诺伦,嗡的创造者。

斯蒂芬·贝肯

通过交易软件开发商。大部分时间都在持久的追求简单,优雅和守则中的代码。或者只是在介于两者之间完成的东西。

评论本站由反驳