2008-08-25

listings

LaTeX中的listings包可以用来方便地排版各种编程语言。它默认内置了对多达80多种语言的支持,包括Lisp -- 不过可惜的是没有对Scheme的直接支持。不过这也不是一个大的问题,因为listings提供了宏命令lstdefinelanguage来自定义新的语言。

\lstdefinelanguage{Scheme}{%
morekeywords={begin,call-with-current-continuation,call/cc,define,%
case,cond,do,delay,else,force,for-each,map,if,and,or,not,lambda,%
let,let-syntax,let*,letrec,letrec-syntax,syntax,syntax-rules%
},%
sensitive,%
alsodigit=-,%
morecomment=[l]{;},%
morecomment=[s]{\#|}{|\#},%
morestring=[b]{``}%
}[keywords,comments,strings]

其实Scheme的关键字相当稀少,除了define, lambda, if等等,其它多数只是宏而已,不过一起定义出来使得排版出来的代码自动语法高亮,还是相当赏心悦目。

标签:

PGF and TikZ

接触LaTeX也两三年了。在处理文字排版问题时,它已经成为我的个人首选。渐渐的,我也开始对字体、版式和图片有所挑剔。并且我发现完成一篇文档需要的时间远比用M$ Office来的多,其中主要时间在插图 -- Linux下一只没有用起来顺手的作图工具。Xfig比较不错,不过我只喜欢用键盘,而笔记本又没有鼠标中键,很不方便。

然而终于找到一个perfectly适合我个人品味的解决方案:PGF/TikZ包。有个老外博士很nice的在其网站上展示了一系列漂亮的示例,包含tex源文件和生成的pdf文件。

很多软件看起来不够人性,门槛较高,不过一旦你跨过那道槛,便是另外一个天地了。Vim, Emacs, 以及LaTeX等,莫不如此。此外,不要满足于20%的足够80%的应用,不要有事没事总是google,系统的完整的阅读一下(至少扫描一眼)所用软件的手册先。

英文手册[pdf],中文手册[pdf]。

标签:

2008-08-22

remember

美眉说很久没在我的blog看见她的影子了。想想确实如此。感情这东西,写的浓了流于煽情,写的淡了让人伤心,实在很难把握。何况多少涉及隐私,而且心知人民群众目光如炬,着实不敢自取其辱。既然如今旨意已下,只好硬着头皮把前些日子的一篇draft完成。

那天其实是七夕,也是公司成立两周年。一个小小的ceremony后我端了一点香槟回到座位继续干活。那几天鼻炎比较厉害,基本上两三天就能消耗一桶纸。小气的admin很久之前就把pantry的抽纸换成了窃以为比较差的卷纸。在自备的纸消耗完后不得不来回奔波于cubicle和pantry之间,时不时的抽一长串纸。

瓜分完蛋糕的同事们渐渐回来了。有点意外的是,美眉也居然出现在面前,并带来了珍贵的礼物:厚厚的一搭餐纸。``给!收好。阿姨在忙着收拾一次性纸杯,我在忙着一张桌子一张桌子的收餐纸。''那一刻,心里一阵温暖。爱,其实很简单 -- 这无疑是最好的七夕礼物。

标签:

Scheme笔记 -- 6

Lisp之特殊之处在于过程和数据之间其实没有什么区别,过程可以作为数据,数据也可以作为数据。当然这归功于该语言中过程实际上是一等公民,这再其它动态语言如Python, Ruby中也很常见。但Lisp的数据和过程都可以用List来表示,这种惊人的统一性在看似古怪的表面之下有着及其迷人的魅力。

Scheme只有一个很小的内核,除了最基本的求值规则之外几乎没有任何强加的规则。语言的设计者意识到,任何一门语言都不可能实现所有程序员都希望的特性,于是他们为程序员提供了扩展该语言的手段 -- 程序员可以自定义语法,最大程度的重用解释器内核。

Lisp在诞生50年之后仍然在不断进化,并形成一个大家族。这也足以证明该语言强大的生命力。学Lisp后会对以下概念有更深入的理解:
1. 过程、数据
2. closure,tail call, FP
3. macro

Lisp macro是其魅力的主要源泉之一,它提供了强大的抽象表达方式,并很容易用来书写Code Generator等等。至于Scheme中特有的continuation,可以用来实现任意的流程控制。或许太过强大,但绝对是Scheme语言里一颗璀璨的明珠。

标签:

2008-08-20

Scheme笔记 -- 5

偶尔看到一篇文章,The Swine Before PERL[pdf|ppt],来自MIT的lightweight language workshop,相当精彩,读了数遍仍然意犹未尽。其中有一段代码,放在Chez Scheme, MzScheme,UCB STk,MIT-Scheme以及Guile 1.6下都能跑,唯独Guile 1.8总是报错,让我开始怀疑这是否是它的bug,结果却出乎意料:只有Guile 1.8才是做了该做的事 -- 从源代码eval.c的997到1003行可以看出端倪。

这里是各种Scheme解释器中运行的结果:
;; STk interpreter version 4.0.1-ucb1.3.6
(case 'x (x 1) (else 0)) ;; 1
(case 'x ((x) 1) (else 0)) ;; 1
(case 'x ('x 1) (else 0)) ;; 1
(case 'x ('x 1) ('y 2) (else 0)) ;; 1

;; MzScheme v4.0
(case 'x (x 1) (else 0)) ;; bad syntax
(case 'x ((x) 1) (else 0)) ;; 1
(case 'x ('x 1) (else 0)) ;; 1
(case 'x ('x 1) ('y 2) (else 0)) ;; 1

;; MIT-Scheme 7.7.90.+
(case 'x (x 1) (else 0)) ;; Ill-formed clause
(case 'x ((x) 1) (else 0)) ;; 1
(case 'x ('x 1) (else 0)) ;; 1
(case 'x ('x 1) ('y 2) (else 0)) ;; 1

;; Guile 1.6.7
(case 'x (x 1) (else 0)) ;; bad or missing clauses
(case 'x ((x) 1) (else 0)) ;; 1
(case 'x ('x 1) (else 0)) ;; 1
(case 'x ('x 1) ('y 2) (else 0)) ;; 1

;; Guile 1.8.3
(case 'x (x 1) (else 0)) ;; bad or missing clauses
(case 'x ((x) 1) (else 0)) ;; 1
(case 'x ('x 1) (else 0)) ;; 1
(case 'x ('x 1) ('y 2) (else 0)) ;; Duplicate case label

因为Scheme中'x等价于(quote x),于是最后一个语句等价于:
(case (quote x)
((quote x) 1) ;; A
((quote y) 2) ;; B
(else 0))
显然分支A和B中含有相同标号quote,这就是错误的根源。改成:
(case 'x ((x) 1) ((y) 2) (else 0))
就行了。

早晨搜到一个难兄难弟:链接

标签:

2008-08-02

signature

``sudo dpkg-reconfigure fontconfig-config''了一把,使得字体对LED屏幕优化,顺便又安装了文泉驿字体,现在系统的字体看起来很舒服。因为对字体的好奇,搜到一篇好文章,``The Beauty of LaTeX''. 按图索骥,我用LaTeX做了个signature:

重点不在于色彩,而是对`kerning'的演示。Kerning is the process of selectively adjusting the spacing between letters pairs to improve the overall appearance of text.

标签: