加载中…
个人资料
mat.liutos
mat.liutos
  • 博客等级:
  • 博客积分:0
  • 博客访问:36,236
  • 关注人气:31
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
评论
加载中…
留言
加载中…
访客
加载中…
博文
标签:

it

分类: 伟大的Lisp
首先我会跑题,这应该算是我写博客的风格XD

因为写在GitHub博客的话没什么人会注意到,所以就搬来新浪博客了。不过其实应该是有人看到的,只不过因为GitHub博客是静态的,后台有不是我写的(压根就没有后台嘛~),所以没办法统计每篇东西有多少人看,也没啥评论之类的。好吧,我是虚荣心作祟了,因为确实希望自己的博客有多点人看的,算是人之常情吧;-)

如果是抒发感受之类的,不带什么代码的博客,贴过来新浪的博客这边也挺不错的嘛~;-)

算了,入正题吧~

因为某个老师的原因,所以我这学期居然还要做课程设计——这种一般大四的学生都不用做的东西了(至少我们专业就报了那个老师课的人要做罢了),而且还是数据库的课程设计。内容自选了,所以是把上次参加编程马拉松没完成的概念拿出来炒冷饭,也就是吵架网站。本来是打算用Java加上Play框架来做的,结果嘛~因为不熟悉的原因,折腾了好久,不仅没啥成就感,反而是获得了很多的挫败感如果不是因为CLSQL在SBCL上面无法用(后来解决了),以及Cave
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
在某篇文章里看到说,CPS转换过程在编译当中占据很大比例,而编写CPS转换程序也是一种对程序员的考验。想想既然如此,那我也来沾点光,把自己摸索这东西的过程写出来,一来炫耀,二来分享。
首先得知道CPS是什么,CPS是continuation-passing style的简称,而continuation一般翻译为续延,也即续延传递风格。
续延是一种代表计算的数据结构,它表示“接下来的计算过程”,例如Lisp代码(+ (+ 1 2) 3)中,参数首先会被计算,即先算(+ 1 2),那么然后要算什么呢?然后要把算得的3和3相加,那么“接下来的计算”可以用一个函数调用来表示,即((lambda (v) (+ v 3)) 3)。更一般地讲,续延可以用一个单参数的匿名函数表示。
而所谓的CPS转换就是把一段普通的代码转换成CPS的形式。例如上面那段,写成CPS就是(+& 1 2 (lambda (v) (+ v 3)))。这里的+&是一个为CPS而修改得来的函数,它会把前两个参数相加,然后作为参数调用第三个函数。
这里的CPS也可以认为不完整,因为最内层的加法函数并没有换成+&,意味着对最内层的加法而言没有更进一步的运算了。其实不然,因为在Lisp中,计算完还要打印,所以实际可以把最内层的加法改成续延版本让打印操
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
Lisp即LISt Processing的意思,可见列表这种数据结构在这门语言中的重要性。Lisp中的列表其实是广义表,用名为cons的另一种数据结构来实现。其实可以简单地认为,cons就是一个定义为带有两个成员变量的结构体类型,并且两个成员变量都即可以指向原子类型的值,也可以指向同为cons类型的值。用C语言来实现的话,cons就是一个struct,而串起来的cons,实际上就是链表。

学过数据结构课程的人都知道,链表是一种适合进行插入和删除操作的数据结构。对链表进行插入和删除操作显然要比对数组进行同样的操作来得简单,而在搜索方面,如果数组没有排过序的话,那么搜索列表和搜索数组其实没有差别,都是从头开始找,一股脑地往后遍历直到找到目标元素就对了。不过在随机存取方面,链表就比不上数组了。这里有个可以谈谈的地方。

举个例子,在Common Lisp中怎么取出一个数组中某个索引所指向的哪个元素呢?为了说明的完整,首先我们需要先定义一个数组,像这样

CL-USER> (make-array 5)
#(0 0 0 0 0)

然后我们可以使用aref函数对取出数组中的某个元素,例如使用(aref * 1),就可以取出下标为1的位置所对应的元素了,
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
出于编写课程设计的程序的需要,我用了CLSQL这个库。这个用来和关系型数据库交互的第三方库确实是一个非常强大的东西,除了支持众多的后端和提供了丰富的SQL操作以外,还提供了方便将Lisp代码和SQL语句揉合在一起的读取器宏。不过这里要介绍的重点不是CLSQL,所以它的众多特性就不赘述了,感兴趣的可以尝试一下使用,LispWorks的网站上有一篇很好的教程。

使用CLSQL的时候我遇到了一点点问题,就是直接使用CLSQL所支持的面向对象功能进行记录的查询时总有可能无法得到完整的结果——即使我不使用where子句,select操作还是无法返回整个表构造出来的对象列表。这让我苦恼了一阵子,因为我不知道原因出在哪,而CLSQL又很优秀以致于不舍得这个工具。不过CLSQL的select函数还可以不直接操作类,而是像平常的SQL操作那样返回以列表为元素的列表,并且每个子列表等价于直接在数据库中使用select语句查询得到的一行记录。通过拆分列表并传递给make-instance函数适当的值,就可以模拟select函数的面向对象效果了。

一开始的时候我并没有意识到这是一个可以提取成公共函数的操作,即从列表中生成特定类的实例。那时候正在尝试编写课程设计,只对一种类型的
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
花了好长的时间,总算是读完了《Object-Oriented Programming in Common Lisp》。花的时间所以长,主要是因为读这本书的过程断断续续的,因为中途穿插了很多别的事情使我没空来看书,也因为自己的集中力不太好,很容易在看书的时候分心。看的是扫描出来的PDF,质量不太好,看着挺艰难的,不过可惜现在囊中羞涩买不起那么贵的英文版——总之上帝请宽恕我看盗版书的行为吧。

顾名思义,这本书讲的是和Common Lisp中的面向对象扩展——CLOS有关的事情。CLOS的全称是``Common Lisp Object System'',维基百科的介绍中说``CLOS is a powerful dynamic object system which differs radically from the OOP facilities found in more static languages such as C++ or Java''。且不说CLOS是不是powerful和dynamic(貌似很多语言都用这两个词来介绍自己,有点用滥了的感觉),``differs radically''(完全不同)倒是可以认可。

我不懂C++,用Java来作对比好了。Java里面的方法是定义在类的内部的,例如,我定义了类foo,然后要定义和foo类相关的叫做bar的方法,那么我需要这样写

class foo {
    public void bar ()
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
Clack是一个Common Lisp的库,负责在Web服务器和上层应用之间提供一个抽象层。而Caveman则是一个比较像模像样的Web框架,它架构在Clack之上,而Clack也做到了它所期望做的部分——一个Web服务器和上层应用(Web框架)之间的抽象层。

其实说到Web框架,我一直觉得是一个比较虚无飘渺的东西。很久之前学习Python的时候,碰过一下下的Django,大致上理解了所谓的MVC模型是怎么应用在Web应用的开发中的;用Weblocks的时候,又发现Web框架可能还要代劳一部分的可视化功能——例如Weblocks中通过继承已经写好的类就可以为自定义的类生成像表格或者表单这样的HTML元素;看《Ruby元编程》的时候,也了解到Rails中的ActiveRecord库甚至能够帮助进行ORM(应该是这样的意思吧~)。

不过对于Web框架究竟能够做些什么,应该做些什么,还是没有概念。目前大致上可以认识到的,是Web框架应该帮助划分程序为模型、试图和控制器三部分。至于具体的什么东西,就没有概念了。Caveman的功能貌似不少,不过还是很不熟悉。目前用来写Web应用的话,我用了自己积累下来的一套直接基于Hunchentoot的工具,Caveman还是无法上手使用。

不过既然打算使用了,就
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
这是一骗瞎扯淡的文章……

标题是抄袭自1905年伟大的论文《论运动物体的电动力学》的,爱因斯坦弄了个狭义相对论出来,我决定来个广义绝对论……

打一局拳皇的过程,其实也就是一个编程的过程。编程是什么?编程不就是为了解决一个问题,而告诉计算机一些规则,然后给出输入,让计算机给出输出的过程嘛~那这么看来,打拳皇又何尝不是呢?要打赢一局比赛,需要挑选角色,然后安排出战顺序,然后亲自操控每一个角色的动作来和对手较量,并且最后取得胜利的过程。虽然我本人不太喜欢``解决问题''这么老土的说辞,不过不管怎么反感也好,用在这里确实是挺恰当的……

不过和编程有点不一样,就是编程面对的是一个已经分析过的问题,而打拳皇时面对的,是一个尚未得到完整分析的人。这么看来,打拳皇居然还是一个解决人工智能问题的过程:P而且打拳皇用的编程语言,绝对不是像Java(讨厌!)这样的先编写再编译最后再执行的语言,而是像Lisp那样的带有交互式环境的语言——当然了,不一定非得是Lisp家族,很多语言都可以,如Haskell、OCaml、Erlang、Ruby、Python、Prolog、Lua、Io(最近刚开始接触)都可以。总之,一定是一门更具备互动性
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
标签:

转载

忽然间很期待博主讲关于宏的东西,哈哈,对Lisp特别偏爱啊~

话说王垠大大其实真是高产出呢……
原文地址:初学者程序语言的选择作者:王垠
很多人都关心这个问题,来信问我。我一直想总结一下经验,让大家可以免得走弯路。今天终于开始写这篇文章。我的文章一般都会在发表之后不断改动,所以如果转载请只给出链接,以便得到最新的版本。


面向对象语言不适合入门
阅读  ┆ 评论  ┆ 转载原文 ┆ 收藏 
标签:

迷茫

技术

杂谈

分类: 闲情逸致
感觉自己越来越烦躁了,做事总是静不下心来,莫非是因为生活在这个信息被过度消费的时代的缘故。每天打开电脑,都会上新浪微博、豆瓣、知乎、Gmail、GitHub和Ubuntu中文论坛,去看看别人有没有叫唤自己,有没有什么引人注意的新消息,有没有什么适合灌水的话题等等。并且自己也越来越缺乏耐心了,浏览豆瓣和知乎都非常地快,似乎并不怎么关注它们。

或许是我自己的问题,把知乎当作一个像论坛那样用来消遣的地方了。不过我自己也确实不怎么经营自己的豆瓣帐号,基本上没有发过多少言,尽管在一些小组还算活跃,但是豆瓣说基本上是很久很久才更新一次的。而Gmail上的话题我也没有深入讨论,几乎都是一些灌水性质的回复,少有对所讨论的技术话题的切实回答,可能是因为我自己对Linux本身的内容关注的不多吧,真是惭愧;GitHub则更可怜,我只是上去看看有没有别人给自己的仓库添加comment,有没有人follow自己,有没有人watch自己的仓库等等,满足一下虚荣心,似乎自己并没有真正用心来学习和钻研技术,再一次惭愧;而且这个博客也没有怎么打理啊,内容的更新速度确实太慢,这可能也很大程度上是因为我没有在用心钻研技术,没有那个耐心来好好地写一篇博文的原因吧
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
好久没写博客了,怕荒废了,赶紧动动手再说……

Common Lisp是目前为止最喜欢的语言,没有之一。尽管最近学了OCaml,CL在我心目中的地位出现那么一纳米的动摇,不过还是稳坐在王座上。当然,以后就很难讲了,毕竟OCaml实在是太有意思了,嗯,其实Haskell也很好……

好吧,跑题了,回到CL和MySQL交互的故事上来。大三上学期,也就是刚刚过去的那一学期,报了一门数据库概论的选修课。数据库的老师还是很不错的,尽管普通话可能普通了点,不过最让我高兴的一点就是他对我们的实验设计所选用的方式没有限制,我不仅可以使用MySQL数据库而不用上实验课时讲的SQL Server,而且还可以用心爱的Common Lisp而不需要用Java或者VB,这个老师值得一赞

实在是不喜欢SQL Server,不过或许是因为对MySQL先入为主好感所致吧。也不怎么喜欢Java和VB。VB是没接触过,不过对那种拖拖拉拉的方式挺反感的,当然没有轻视使用VB的人的意思。Java真是让我又爱又恨,不怎么喜欢Java的大部分,却很喜欢SWT,莫非就因为它是IBM弄的?!
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有