排版 Scheme

14.1  \scm

\scm 把 Scheme 程序括起来就可以进行显示了,并且含 有语法加亮信息。你只要试用 css.t2p 里提供的 CSS 样式就可以得 到很漂亮的 Scheme 语法加亮。比如:

\scm{ 
(define fact 
  "The factorial function" 
  (lambda (n) 
    (if (= n 0) 1 ;the base case 
        (* n (fact (- n 1)))))) 
}

结果是:

(define fact
  "The factorial function"
  (lambda (n)
    (if (= n 0) 1 ;the base case
        (* n (fact (- n 1))))))

14.2  Scheme 的样式

有了语法加亮的信息还不能把各种关键字用不同的颜色显示。 你必须在 CSS 文件里定义样式,或者把这些样式使用 \cssblock ...\endcssblock 的形式 嵌入 HTML 中。 比如:

\cssblock 
.scheme             {color: brown} /* background punctuation */ 
.scheme  .keyword   {color: #990000; font-weight: bold} 
.scheme  .builtin   {color: #990000} 
.scheme  .variable  {color: navy} 
.scheme  .global    {color: purple} 
.scheme  .selfeval  {color: green} 
.scheme  .comment   {color: teal} 
\endcssblock 

就可以对 Scheme 语句的各种关键字,变量等进行语法加亮了。

14.3  定义关键字

你可以使用

\scmbuiltin{cons car cdr} 

这样的形式定义内部函数。

\scmkeyword{define-class unwind-protect} 

这样的形式定义关键字。

使用

\scmvariable{and 42 +i} 

的形式定义变量。这样它们就能被加上特殊的颜色了。

14.4  slatex

以上都是 tex2page 自己提供的排版 Scheme的方式。 对 Scheme 排版,最好使用 Slatex, 它可以在

http://www.ccs.neu.edu/home/dorai/slatex/slatxdoc.html

下载。

在装好 slatex 之后。只要

\usepackage{slatex} 

就可以使用 slatex 提供的各种功能了。

14.4.1  schemedisplay 环境

使用 tex2page 提供的 \scm{...} 如果内容太长容易出错,所以用

\begin{schemedisplay} 
... 
\end{schemedisplay} 

就好多了。

14.4.2  插入段落的 Scheme 语句

段落中的 Scheme 语句,比如 (cons 'a '(b c)), 可以这样输入:

\scheme|(cons 'a '(b c))| 

14.4.3  插入 Scheme 程序文件

如果要读入一个 Scheme 程序文件就使用

\schemeinput{evenodd.scm} 
% the .scm is optional! 

上面介绍的这些这些基本够用了。如果你还不满足就继续看下一节。

14.4.4  \schemeresult

Scheme 解释器的输出结果可以用一种特殊的颜色显示:

\scheme|((lambda () (cons 'lambda 
'cons)))| yields 
\schemeresult|(lambda . cons)|. 

结果是:

((lambda () (cons 'lambda 'cons))) yields (lambda . cons).

14.4.5  特殊符号

你想不想把 (lambda () (begin ...) 都用 (\lambda () (begin ...) 来显示?

\setspecialsymbol{lambda}{$\lambda$} 

就可以达到你的目的。我们还可以花哨一点:

\setspecialsymbol{lambda}{$\lambda$} 
\setspecialsymbol{and}{$\land$} 
\setspecialsymbol{equiv?}{$\equiv$} 
\setspecialsymbol{below?}{$\subseteq$} 
\setspecialsymbol{above?}{$\supseteq$} 
\setspecialsymbol{a1}{$a_1$} 
\setspecialsymbol{a2}{$a_2$} 
 
\begin{schemedisplay} 
(define equiv? 
  (lambda (a1 a2) 
    (and (below? a1 a2) 
         (above? a1 a2)))) 
\end{schemedisplay} 

显示为:

(define \equiv
  (\lambda (a_1 a_2)
    (\land (\subseteq a_1 a_2)
         (\supseteq a_1 a_2))))

14.4.6  定义关键字

\setkeyword 
\setconstant 
\setvariable 
\setdata 

可以定义你自己需要的关键字,常数,变量,数据,它们会被正确的 语法加亮。比如,通常 cons 不是一个关键字,它一般显示为:

(cons 'a '(b c))

我们用了

\setkeyword{cons} 

之后,cons 就用跟 define 一样的方式显示了:

(cons 'a '(b c))

14.4.7  \scmdribble

这个命令可以把 \scm 区域里的内容送到最近的一个 \verbwritefile 指定的文件里,同时把这些代码语法加亮在 文档中显示。

这可以被作为一种 Scheme “文学编程”的方式。我来试试:

\verbwritefile test1.scm 
\scmdribble{ 
(define factorial 
  (lambda (n) 
    (if (= n 0) 
        ;\scheme{(zero? n)} 
        ;also possible 
        1 (* n (factorial 
                 (- n 1)))))) 
} 

嗯。还真是生成了一个文件叫做 test1.scm. 里面是这些代码。

(define factorial
  (\lambda (n)
    (if (= n 0)
        ;\scheme{(zero? n)}
        ;also possible
        1 (* n (factorial
                 (- n 1))))))