LightTable的结构(一)
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的结构(一)的更多相关文章
- LightTable的结构(二)
这节主要研究下object的一个属性,behaviors 定义一个behavior需要提供name,trigger,reaction (behavior ::on-close-destroy :tri ...
- 【.net 深呼吸】细说CodeDom(1):结构大观
CodeDom 是啥东东?Html Dom听过吧,XML Dom听过吧.DOM一般可翻译为 文档对象模型,那 Code + DOM呢,自然是指代码文档模型了.如果你从来没接触过 CodeDom,你大概 ...
- 读书笔记:《HTML5开发手册》--HTML5新的结构元素
读书笔记:<HTML5开发手册> (HTML5 Developer's CookBook) 虽然从事前端开发已有很长一段时间,对HTML5标签也有使用,但在语义化上面理解还不够清晰.之前在 ...
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- HTML5 语义元素(一)页面结构
本篇主要介绍HTML5增加的语义元素中关于页面结构方面的,包含: <article>.<aside>.<figure>.<figcaption>.< ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
- ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构
和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...
- Go结构体实现类似成员函数机制
Go语言结构体成员能否是函数,从而实现类似类的成员函数的机制呢?答案是肯定的. package main import "fmt" type stru struct { testf ...
随机推荐
- ajax 传参数 数组 会加上中括号
解决办法 1,由于版本过高导致 我用的是1.9版本 2, 有三种选择. 一种是JSON.stringify([1,2,3]),到后端再解析. 另外一种是后端的接受的contentType改成appli ...
- ubuntu server 12.04.4安装配置
这里讲
- 慕课笔记利用css进行布局【一列布局】
<html> <head> <title>一列布局</title> <style type="text/css"> bo ...
- table 设置自动宽度后 td 的固定宽度 在 谷歌浏览器自动拉伸
table 设置自动宽度后 td 的固定宽度 在 谷歌浏览器自动拉伸 解决方案 <table style="table-layout:fixed;">
- noip模拟赛 斐波那契
分析:暴力分有90,真良心啊. a,b这么大,连图都建不出来,肯定是有一个规律.把每个点的父节点写出来:0 1 1 12 123 12345 12345678,可以发现每一个循环的长度刚好是斐波那契数 ...
- bzoj 1962 硬币游戏 (猜数问题)
[bzoj1962]模型王子 2015年3月26日1,6460 Description Input 输入数据共一行,两个整数N,K,用一个空格隔开,具体意义如题目中所述. Output 输出数据共一行 ...
- 真--可并堆模板--BZOJ2333: [SCOI2011]棘手的操作
n<=300000个点,开始是独立的,m<=300000个操作: 方法一:单点修改.查询,区间修改.查询?等等等等这里修改是块修改不是连续的啊,那就让他连续呗!具体方法:离线后,每次连接两 ...
- CF676E:The Last Fight Between Human and AI
人类和电脑在一个多项式上进行博弈,多项式的最高次项已知,一开始系数都不确定.电脑先开始操作,每次操作可以确定某次项的系数,这个系数可以是任意实数.给出一个博弈中间状态,最后如果这个多项式被x-K整除就 ...
- Memory Ordering in Modern Microprocessors
Linux has supported a large number of SMP systems based on a variety of CPUs since the 2.0 kernel. L ...
- winform总结6=>线程和委托的关系
基础类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...