LightTable使用clojurescript来生成js,然后使用 node-webkit 来处理UI

clojurescript非常适合做抽象程度很高的页面和编辑逻辑结构设计,

最近会对整体进行分析整理一个大题的结构图

程序的入口在lt.objs.app@init

可以看到init做了几件事情进行初始化

(defn init []
(object/raise app :deploy)
(object/raise app :pre-init)
(object/raise app :init)
(object/raise app :post-init)
(object/raise app :show))

  而操作的对象,app的初始化在: 

(object/object* ::app
:tags #{:app :window}
:delays 0
:init (fn [this]
(ctx/in! :app this))) (def app (object/create ::app))

app是object/object*和object/create一起生成的

(defn object* [name & r]
(-> (apply make-object* name r)
(store-object*)
(handle-redef)))
(defn make-object* [name & r]
(let [obj (merge {:behaviors #{} :tags #{} :triggers [] :listeners {} ::type name :children {}}
(apply hash-map r))]
obj)) (defn store-object* [obj]
(add obj)
obj)
(defn add [obj]
(swap! object-defs assoc (::type obj) obj))

  

(defn create [obj-name & args]
(let [obj (if (keyword? obj-name)
(@object-defs obj-name)
obj-name)
id (or (::id obj) (swap! obj-id inc))
inst (atom (assoc (dissoc obj :init)
::id id
:args args
:behaviors (set (:behaviors obj))
:tags (set (conj (:tags obj) :object))))
inst (store-inst inst)
_ (merge! inst (update-listeners inst))
content (when (:init obj)
(apply (:init obj) inst args))
content (if (vector? content)
(crate/html content)
content)
final (merge! inst {:content content})] (add-watch inst ::change (fn [_ _ _ _]
(raise inst :object.change)))
(raise* inst (trigger->behaviors :object.instant (:tags @inst)) nil)
(raise inst :init)
inst))

  

object/object*生成了一个hash-map的对象,对象包含了behavior,tag之类的属性,每个object对应一个唯一的名字,存在object-defs这个atom对象里,这个object-defs用于记录所有的类对象的定义

object/create中,先是通过(@object-defs obj-name)来获取object,然后对object做一些创建的工作,

inst是instance的缩写,采用了类似javascript里的clone的方式来创建一个object的instance

LightTable的结构(一)的更多相关文章

  1. LightTable的结构(二)

    这节主要研究下object的一个属性,behaviors 定义一个behavior需要提供name,trigger,reaction (behavior ::on-close-destroy :tri ...

  2. 【.net 深呼吸】细说CodeDom(1):结构大观

    CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...

  3. 读书笔记:《HTML5开发手册》--HTML5新的结构元素

    读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...

  4. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  5. HTML5 语义元素(一)页面结构

    本篇主要介绍HTML5增加的语义元素中关于页面结构方面的,包含: <article>.<aside>.<figure>.<figcaption>.< ...

  6. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  7. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  8. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  9. Go结构体实现类似成员函数机制

    Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...

随机推荐

  1. linux系统查看网络连接情况

    netstat命令状态说明: CLOSED                      没有使用这个套接字[netstat 无法显示closed状态] LISTEN 套接字正在监听连接[调用listen ...

  2. [转]TOpenDialog

    转自:http://www.cnblogs.com/zhangzhifeng/archive/2011/08/04/2127395.html 1.TOpenDialog组件的典型用法“打开”对话框是用 ...

  3. 合并多个MP4文件

    把多个MP4文件连接起来的方法与音频文件不太一样,比较有效的方法是: $ cat mylist.txt file '/path/to/file1' file '/path/to/file2' file ...

  4. php - namespace篇

    之前没有系统学习过PHP语言,直接上手TP框架了,所以认为namespace和use是TP框架的一部分,最近学习语言模块的时候遇到了这个问题,所以汇总了一下. PHP中命名空间可以解决两类问题: 用户 ...

  5. [bzoj1058][ZJOI2007][报表统计] (STL)

    Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个 ...

  6. [java基础原理] 数字类型原理

    1.常识 2.包装类型的继承树 3.通用JAVA包装类示例 package base.com.hzeng.jdk; import java.lang.annotation.Native; public ...

  7. MSP430F5529时钟系统深究

    1.为什么要进行时钟管理? 时钟系统是一个数字器件的命脉,对于普通的51单片机来说,它的时钟来源只有外部晶振,然后每12个振荡周期完成一个基本操作,所以也叫做12T单片机,但对于当前高级一点的单片机来 ...

  8. 动态规划法解最长公共子序列<算法分析>

    一.实验内容及要求 1.要求按动态规划法原理求解问题: 2.要求在20以内整数随机产生两个序列数据: 3.要求显示随机产生的序列及最长公共子序列.二.实验步骤 1.随机产生数列: 2.输出随机序列:  ...

  9. POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28838   Accepted: 9843 -& ...

  10. [luoguP1272] 重建道路

    传送门 奇奇怪怪的分组背包. #include <cstdio> #include <cstring> #include <iostream> #define N ...