2010年6月26日

首先,这个话题太厚重了,水平还远远达不到系统阐述它的能力,只是对最近零碎感悟以及学习所得的一点汇集。(大家谁有好的书或资料推荐一下?)
因为对.NET平台熟一点,所以命令式语言就以c#为例,函数式语言就以fsharp为例。

最近对函数式编程语言有些兴趣,通过网上资料,书籍了解了一些FP语言:像微软的fsharp以及haskell,与以前一直使用的命令式语言有许多的不同(当然一些语言既可以让你以命令式语言的思维去编写,又提供FP的编程范式,最明显的莫过于javascript了),这些不同之处体现在以下一些方面
immutable  不可变对象,(简单的说immutalbe就是一定声明定义后就不能更改其值了)在FP里immutable对象是主流,是默认的(当然像fsharp提供关键字可以让你定义可变对象),不同于c#等编程语言,虽然它们提供readonly,const等关键字让你定义immutable对象,但这种定义过程是可选的,在命令式语言的世界里mutable是主流。
很自然的会想,FP为什么会这样呢,是出于一种什么理念这么去实现?
原来是因为 “λ演算”(读作lambda演算),更准确的说正是为存在lambda演算这种形式系统,才会诞生FP,FP只是lambda演算的实践。以下是wiki里关于lambda演算的定义
λ演算lambda calculus)是一套用于研究函数定义、函数应用和递归形式系统。它由阿隆佐·邱奇和他的学生斯蒂芬·科尔·克莱尼20世纪30年代引入。邱奇运用λ演算在1936年给出判定性问题(Entscheidungsproblem)的一个否定的答案。这种演算可以用来清晰地定义什么是一个可计算函数。关于两个lambda演算表达式是否等价的命题无法通过一个“通用的算法”来解决,这是不可判定性能够证明的头一个问题,甚至还在停机问题之先。Lambda演算对函数式编程语言有巨大的影响,比如Lisp语言ML语言Haskell语言

从简单一点的角度去说就是对一个已存在的object赋值,命令式语言的处理方式就像我们人脑一样直观,简单的给它赋予新值就行了(当然像string这样从性能考虑需要interned的例外)而函数式语言则是应用一个函数到object上返回一个新的object,被作用的对象本身是没有状态改变的。

在知道了函数式语言和lambda演算的关系后,我就想像c#这种命令式语言背后也存在那么一个形式系统吗?
网上搜一下,真有,听着还很耳熟,那就是“图灵机”。
以下摘自wiki
图灵机,又称确定型图灵机,是英国数学家阿兰·图灵1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。

图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:
在纸上写上或擦除某个符号;
把注意力从纸的一个位置移动到另一个位置;

图灵机,名字听着很高级啊,原来就是用机器模拟人脑做题 -_-b 当然这是个很通俗的说法,其背后所蕴含的数学知识,至少我是看那7个符号就已经晕了,等缓一缓再深入下。

ok,现在我们有了两组对应关系
图灵机:c, c#,java,等等
lamda演算: lisp, scheme, haskell, fsharp等等
那是否存在更多的计算模型或是形式系统及其实现了它们的编程语言呢?网上继续搜。。。。 还真有

 更多部分请参见  http://www.yyliuliang.cn/posts/programming-language-underlying-math-theories-part-one/

 

posted @ 2010-06-26 14:38 yyliuliang 阅读(277) 评论(1) 编辑

2009年8月4日

写了几年代码,从最开始根本没有源代码管理这种概念,到本地化的VSS6,到可外网访问的VSS2005,SVN,分布式的GIT,认识到合适的源代码管理真是非常必要(即使是开发团队只有一个人!),一方面体现在可以很方便的进行源代码历史回溯,分支,再就是可以避免误删代码这种灾难性失误。

一般来说,.NET开发环境下配合VSS2005进行源代码管理比较普遍,毕竟都是MS一家嘛,和VISUAL STUDIO 一起能很好的工作。

现在SVN应用也越来越广了,毕竟作为天生面对网络环境下的它有着得天独厚的优势,能够适应绝大部分开发者的需求。最近的项目基本是以用它为主啦。

 

首先下载必须的软件。

Visual SVN,一款挺好用的VISUAL STUDIO的svn插件,http://www.visualsvn.com/

(如果你有自己的外网托管windows服务器,VisualSVN SERVER必下)

TortoiseSVN,SVN客户端,http://tortoisesvn.tigris.org/

然后在提供svn服务的网站注册一个账号

http://www.sourceforge.net/  (推荐)

http://www.codeplex.com/

http://www.svnhost.cn/

这里以sf为例,注册好账户后,按照网站提示创建好项目并指定项目的unix-name

然后打开VISUAL STUDIO 点 VisualSVN菜单下的 Get Solution from subversion,在Repository url一栏下按照

https://project-unix-name.svn.sourceforge.net/svnroot/project-unix-name

的格式填写好就OK了

随便添加一个文件,然后commit一下  看看是不是管用了?

posted @ 2009-08-04 22:25 yyliuliang 阅读(277) 评论(0) 编辑

2009年6月29日

Fluent Interface 直译过来是 “流畅(流利)的接口”,照字面有点难以理解。
咱们还是从用代码来说明 (c#)
public interface IRect
{
       void SetWidth(int width);
       void SetHeight(int height);
}
public Rect : IRect
{
       private int _width;
       private int _height;
       public void SetWidth(int width) { this._width = width; }
       public void SetHeight(int height){ this_height = height; }
}
public static void Main(string [] args)
{
       IRect rect = new Rect();
       rect.SetHeight(10);
       rect.SetWidth(50);
}
没有什么花俏的东西,一个可设长宽的矩形接口并提供一个简单实现。接下来看看用另一种方式
public interface IRectFluent
{
       IRectFluent SetWidth(int width);
       IRectFluent SetHeight(int height);
}
public RectFluent : IRectFluent
{
       private int _width;
       private int _height;
       public IRectFluent SetWidth(int width) { this._width = width; return this; }
       public IRectFluent SetHeight(int height){ this_height = height; return this; }
}
public static void Main(string [] args)
{
       IRectFluent rect = new RectFluent();
       rect.SetHeight(10).SetWidth(50);  // checkpoint
}
这种“链式"方法调用方式是不是更接近我们人脑的思维方式,更简洁呢。没错, It's Fluent Interface。
个人理解的Fluent Interface 就是 在面向对象编程中,使用某种方式(通常但不限于使用 方法链方式)来实现更具可读性,易用性的编程方式。而方法链的关键之处就是在方法内部调用最后要返回调用者本身。
所谓Fluent借助于wikipedia的说法就是‘This style is beneficial due to its ability to provide a more fluid feel to the code."
说到这里,经常使用jquery的朋友肯定感觉很熟悉上面的使用方式。
没错,类似于 $('id').show().css('').fadeOut(); 这种就是一种Fluent Interface实现。
类似的应用此种实现手法的还有Fluent NHibernate
WIKI: Fluent_Interface
posted @ 2009-06-29 13:19 yyliuliang 阅读(206) 评论(0) 编辑

2009年6月7日

也许你正在去往学校的途中 虽然学习的过程并不轻松 但学校还有那么多可爱的同学和玩伴 总会让人感到欢欣
也许你正赶赴工作岗位 虽然有那么多紧张的工作任务在等待你去完成  但一想到过完今天便是周末  总会让人充满干劲
也许你已经满头白鬓 步履蹒跚 虽然身子骨已日渐西下 但一想到膝下满堂的儿孙 风雨同舟的老伴 总会感到精神矍铄
。。。。。
一切来得是那么猝不及防
浓重的黑雾遮盖了你的视线
你放肆的努力 踢打
是多么想冲破它啊!可是徒劳。。。。
可怕的火焰瞬间扑来 想要吞噬
你拼命的躲避 挣扎
多么希望能够有那么一种力量能够带我离开这座炼狱啊!!!
奇迹终究还是没有诞生
有的只是身边一个个灵魂的悲恸 哀号
。。。。。。。。。
愿天堂里没有车来车往 你便再也不受禁锢
愿 逝者安息 生者珍重
posted @ 2009-06-07 15:30 yyliuliang 阅读(76) 评论(0) 编辑

2009年4月30日

django官方自带的manage.py syncdb只能根据已有的models同步新建数据表,而无法做到和rails一样根据实体同步修改数据表,好在有第三方插件可以提供这项功能。
django_evolution
When you run ./manage.py syncdb, Django will look for any new models that have been defined, and add a database table to represent those new models. However, if you make a change to an existing model, ./manage.py syncdb will not make any changes to the database.
This is where Django Evolution fits in. Django Evolution is an extension to Django that allows you to track changes in your models over time, and to update the database to reflect those changes.
使用步骤
1. checkout http://django-evolution.googlecode.com/svn/trunk/ 获取源代码
2. cd django_evolution -> python setup.py install 安装
3. 修改你的django项目的settings.py的INSTALLED_APPS项,比如
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django_evolution'
)

4.进入你的django项目文件夹, python manage.py syncdb创建 django_evolution所需的表
5.python manage.py evolve --hint --execute 根据实体同步修改你的数据表
over
posted @ 2009-04-30 22:47 yyliuliang 阅读(164) 评论(0) 编辑

2009年4月11日

摘要: 走出一号线车厢,还是如往常一样随着熙攘的人流涌到我们共同的中转站。目的地相同,姿态却不一样,有时尚的OL结伴而行议论女人话题,也有不紧不慢慵懒踱步的老头老太,当然更少不了像我一样背着电脑包的IT民工兄弟们。行进在这汹涌潮流里我有时就想:他们是什么样的人?又是怀着怎样的目的漂泊在这城市呢、、、、还记得小时候,和大多数男孩子一样,热衷于恐龙特级克赛号,圣斗士这类充满英雄气概的动漫画,童心里渴望着也成为...阅读全文
posted @ 2009-04-11 11:28 yyliuliang 阅读(43) 评论(0) 编辑

2009年4月3日

摘要: 一直以来,在SP无线运营系统的中关于同步接口的设计由于上下家系统设计的规范不一致,导致这一部分不能很好的抽象共用,在我近2年来接触的各方平台接口大部分都是以一个接口作为一个页面的形式开放给上下家使用,表现形式只是编程平台的不同,或asp或php等,同一系统各接口的共用部分也多以数据访问层为主。 接下来将就我如何应用IoC控制反转容器和AOP来从技术角度解决这一问题做一个描述。 阅读全文
posted @ 2009-04-03 21:41 yyliuliang 阅读(1500) 评论(0) 编辑
摘要: 常用号段如下:中国移动134.135.136.137.138.139.150.151.152.157.158.159.187.188 ,147(数据卡)中国联通130.131.132.155.156.185.186 中国电信133.153.180.189 CDMA 133,153正则如下: /// <summary>/// 匹配移动手机号/// </summary>publ...阅读全文
posted @ 2009-04-03 19:39 yyliuliang 阅读(1367) 评论(0) 编辑

2009年4月1日

摘要: delegate 委托可以理解为cxx 语言中的函数指针,标示了方法调用的回调函数的规范。强类型,便于编译时检查是它的最大优点,从此可以和void * 说再见了。event 事件用以delegate委托声明事件,标示响应该事件的回调函数必须符合其声明委托的定义lambda 表达式在.net世界中表现为匿名委托,之前又要提到匿名方法(函数)public class Test{public void ...阅读全文
posted @ 2009-04-01 22:43 yyliuliang 阅读(677) 评论(0) 编辑

2008年12月20日

摘要: 1.给xmlhttp请求添加提示[代码]2.全选Checkbox[代码]阅读全文
posted @ 2008-12-20 17:45 yyliuliang 阅读(178) 评论(0) 编辑

导航

公告


email: yyliuliang@gmail.com

点击这里给我发消息

昵称:yyliuliang
园龄:3年9个月
粉丝:1
关注:0
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

统计

搜索

 
 

常用链接

我的标签

随笔分类

随笔档案

相册

SICP

个人主页

积分与排名

阅读排行榜

评论排行榜

推荐排行榜