
Lisp
文章平均质量分 74
ensoo
这个作者很懒,什么都没留下…
展开
-
Recursion
Recursion1. IntroductionRecursion is a technique that allows us to break down a problem into one or more subproblems that are similar in form to the original problem. <br /> 2. Example: The FactorialRecall that factorial, which is written n!, has the follo转载 2010-07-08 13:58:00 · 1003 阅读 · 0 评论 -
Lisp, I'm back
Lisp, I'm back. 沉寂了很久, 打算重新开始Common Lisp的学习和研究工作。离开的两三年里, 身边发生了很多变化, 在技术领域里把大部分时间投入到了学习其他语言(Haskell,日语!!!...)和概念(函数式, 类型系统...)里去,每天周游在家庭生活, 公司工作和语言学习中,疲于奔命的结果是搜集了大量的Lisp论文和书,却没什么时间去看看原创 2015-03-14 13:00:12 · 2525 阅读 · 1 评论 -
Boehm garbage collector
好吧,boehm的发音是/bame/,是美式英语中一个从德文来的姓氏。今天想讲的是一个C下面的垃圾回收器,名叫boehm garbage collector。该回收器是使用mark and sweep算法的增量式分代垃圾回收器。使用类似x11的许可证,没错!自由软件。碰到这个垃圾回收器是在网上闲逛想寻找一种产生的软件比C更快或差不多的scheme的时候。这些scheme使用C作原创 2012-04-22 17:20:32 · 1793 阅读 · 0 评论 -
Monad你我他
初识函数式编程的时候,Monad这个词就一直萦绕在我的耳边眼前和脑海中。这个在1991年由Eugenio Moggi从Category理论引进而来的概念,如同函数式编程中的许多其他概念一样有着深厚的数学背景。也许正是如此,Monad对于习惯了用传统命令式编程语言思考的人们可谓是一个难以理解的Monster。然而这个概念在越来越多的地方不断地出现,Haskell语言的官方站点上有一个关于Monad教原创 2012-04-26 11:28:09 · 1864 阅读 · 0 评论 -
Computational Reflection
80年代,Brian Smith在《Procedural Reflection》中将“反射”这一概念提到了前所未有的高度。在他的这篇博士论文中,给出了在程序设计语言中实现反射这一机制的通用方法。使用过高级语言的程序员们一定不会对反射概念陌生。如今多数通俗的读物上都是这么描述反射的“反射是一种让程序(或者计算)能够检查和改变自我的机制”。这样的理解确实通俗易懂,却很难让人体会反射真正的机理。想要深入原创 2012-04-24 16:40:23 · 1327 阅读 · 1 评论 -
SBCL编译过程
SBCL编译过程 SBCL源自于CMUCL (Carnegie-Mellon University Common Lisp),而CMUCL出现于上世纪80年代。因此SBCL的代码算是已经比较成熟,从开发的角度来讲,SBCL社区的活跃度已经比较低了。事实上也的确如此,单就我所知道转载 2011-07-21 11:07:10 · 9404 阅读 · 0 评论 -
Emacs神器初养成
<br />文本编辑器是程序员日常工作生活中不可缺少的重要工具。优秀的文本编辑器可以解放劳动力、提高生产率。在程序员的世界里效率是一件重要的事情。因此,文本编辑器之争也就成为大家茶余饭后的谈资(如同程序设计语言一样)。我向来是一个自由主义者。谁好谁坏这种事情,所持的观点和角度不同,有时候很难分辨。程序员和文本编辑器之间的关系,应该有点像谈恋爱,萝卜青菜各有所爱。<br /> <br />Emacs是编辑器排行榜中争论较为突出的一位,支持者声称Emacs是世界上最好用的编辑器(因为配置和扩展的能力实在太强,它原创 2010-12-30 12:50:00 · 6957 阅读 · 4 评论 -
Making a small Lisp project with quickproject and Quicklisp
<br />Nov. 24th, 2010 | 11:35 am<br /><br />A few years ago I wrote about how I make small Common Lisp projects. With the availability of Quicklisp and ASDF2, my process has changed quite a bit. Here's what I do lately. <br />Get a comfortable environment转载 2010-12-06 10:27:00 · 1353 阅读 · 0 评论 -
Ackermann函数的尾递归实现
曾经在微博中谈到在可计算理论中著名的Ackermann函数。当时接触到的算法是Rózsa Péter 在1935年提出的算法:A(0, n):= n + 1 for n ≥ 0 A(m, 0):= A(m - 1, 1) for m > 0 A(m, n):= A(m - 1, A(m, n - 1)) for m, n > 0该算法基于两个参变量的递归函数,但不是尾递归的。由于此算法对递归深度的增加是超过了指数级的,因此在32位的系统中,这个算法很快就能将堆栈消耗光。首先给出此算法的CL代码:;;Ack原创 2010-07-13 13:38:00 · 1603 阅读 · 0 评论 -
Continuation in LISP
Continuation(First-class continuation)是控制指令执行顺序的一种能力。可以用来从当前执行函数跳转回上层调用函数,或者跳转到之前以退出的函数。可以把它想象成将程序的当前状态保存下来,以便以后恢复(有点像给VM做snapshot)。但要注意的是,真正的Continuation仅仅存储执行上下文,而非程序的数据。下面是的比喻能够很好的解释这一点:话说你在厨房的冰箱前,考虑来点三明治尝尝。如果这时候你做了个continuation,并将其存放到你的口袋中。然后你把火鸡和面包从冰箱翻译 2010-07-06 14:56:00 · 2161 阅读 · 0 评论 -
Common Lisp的值类型及SBCL中的底层表示
动态类型 vs. 静态类型众所周知Common Lisp是一种动态类型语言, 虽然编译器会在编译时检查类型, 但这种检查往往出于编译优化的目的,而不是为了类型安全的严格检查。至于动态类型,喜欢的人喜欢它,赞扬它可以让代码简洁,开发高效, 厌恶的人厌恶它,批评它不够安全,无法协同工作构建复杂系统。这也正是是动态类型语言的优美和邪恶的地方。 在Common Li原创 2015-03-22 22:29:57 · 1825 阅读 · 0 评论