0%

编译原理已经学了很多了吧?还有所迷茫?那么今天跟着我一起学习如何暴力写一个Parser Generator

Why Java:

因为Java有着丰富的对开发人员傻瓜式友好的内置数据结构,什么Map,Set,Stack,求交集求并集也就一句a.contains(b);a.addAll(b)的事情,并且不需要担心资源泄漏(?)的问题,对于我们的暴力实现非常有帮助。而且相比C++我也更为熟悉..

What is parser generator

这里就指的是支持用户输入CFG(Context-free grammar),然后生成出一个Java代码,这个代码可以编译以后得到一个Parser用来Parse符合输入CFG定义的文法,类似于Yacc

迷糊了?举个例子,就是假如用户定义了这样一组CFG,用来匹配一个对于正整数的加法和乘法

阅读全文 »

这次写一下关于Swift中AnyClass的使用以及动态类型的实例化和使用场景

AnyClass与AnyObject

Swift中,任何自定义的对象都是AnyClass的子类,类似于Java的Object类(但注意,这和Objective-C的NSObject不同,后者在Swift中是专门的UIKit或者AppKit框架里面定义的类型,而非语言所规定的类型)

AnyClass
The protocol to which all class types implicitly conform.

Declaration
typealias AnyClass = AnyObject.Type

AnyObject

阅读全文 »

React-Native VS Cocoa Touch – 下一代UI编程思维

React 与状态

React.js自从Facebook一推出,就受到Web前端工程师的强烈推崇。虽说曾经火过一时的Angular.js颠覆了前端的工程,但是React更多颠覆的,是下一代UI编程的思维。

传统UI编程,基本很多地方都需要将数据来源,绑定到对应的UI对象,比如用户点击了一个操作,更改了名称,那么你需要更新执行一个回调函数来处理点击操作,并且把新的数据更新原有的UI对象的属性,比如大概就是这样的东西

1
2
3
4
5
func onClick(sender) {
var data = getData(sender);
self.button.title = data.name;
self.button.color = data.color;
}

这样虽然说直观,但是有很大的问题。试想,假如有很多种的回调函数,每个回调函数监听不同的操作,比如onMounseDown,onMouseUp,onKeyDown,onScroll……甚至根据不同的sender,我们会有不同的操作,我们就必须得手写很多机械的

阅读全文 »

BST插入顺序与平衡性

众所周知,二查搜索树(BST)的搜索、插入、删除的复杂度等于树高,所以平衡度越高,越接近$ O(nlogn) $,越有序越退化为$ O(n) $

线性BST
随机BST

  • 对于左侧的BST来说,只有唯一的构造序列:$ <1,2,\dots,14> $
  • 但对于右侧的BST,可以存在21964800种不同序列

也就是说,随即插入序列到二叉树所形成的平衡度,将大于部分有序插入所形成的二叉树

形式化证明可以得到(具体证明过程,参见Open Data Structures

阅读全文 »

我保证,不再在网上又发布一篇Monad教程(By Erik Meijer)

自我娱乐,附赠各种Functional with OO,参见GitHub

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Define
Monad = function() {
this.value = arguments[0];
};
Monad.prototype.unit = function (value) {
this.value = value;
return this;
}
Monad.prototype.bind = function (func) {
var value = func(this.value);
var monad = new Monad(value);
return monad;
}
Monad.prototype.extract = function () {
return this.value;
}

//Use
var monad = new Monad;
var monad = new Monad(10);

monad.unit(20);
monad.unit(new Monad(30));

monad.bind(function (value) { return value });
var result = monad.bind(function (value) {
return value.extract() * 2;
})

console.log(result.extract());//60

//Test
var monad = new Monad;
monad.unit(10);

console.log(monad.extract());//10

var firstMonad = monad.bind(function (value) {
return value / 2;
});

console.log(firstMonad.extract());//5

var secondMonad = monad.bind(function (value) {
return value + 1;
}).bind(function (value) {
return value + 2;
}).bind(function (value) {
return value + 3;
});

console.log(monad.extract())//10
console.log(secondMonad.extract());//16

Promise简介

Promise是一种解决异步回调问题而发展的编程语言特性,在各种语法中都有支持,比如在JavaScript(ECMAScript 6)/Java(8)/Node.js(0.12)都有原生的支持,而没有原生支持的语言更可以通过第三方框架来简单引入(比如大名鼎鼎的Q

为什么说异步回调不是好的解决方案

1.Callback Hell

1
2
3
4
5
6
7
8
9
10
11
loadScript("a.js",function(){
loadScript("b.js",function(){
loadScript("c.js",function(){
loadScript("d.js",function(){
loadScript("e.js",function(){
console.log("Fuck to load async files")
}
})
})
})
})

2.依赖习惯编码

阅读全文 »

又是一个学期过去了,我在软件工程这条路上又迈出一步,这只是写给自己的,对自己这一学期的总结罢了。

最后的PHP?

学期初,最开始便是做的一个基于ThinkPHP的毕业生投票网站,也做了一个简单的微信和手机Web版本。

嘛,关于PHP我还是比较冷静的,PHP适用于传统中等业务逻辑和低并发要求的Web应用。

毕竟没有太多时间,我和另一个同学就直接用了ThinkPHP这种简单无脑框架(当然,还理所应当的踩了坑,这些细节就不说了)


所谓国人自己的框架——ThinkPHP

阅读全文 »