<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6001650352455840760</id><updated>2024-09-21T18:49:17.624+08:00</updated><category term="Index"/><title type='text'>Z&#39;s Yard[中文]</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default?start-index=26&amp;max-results=25'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>198</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-4829675824597732045</id><published>2012-06-01T21:12:00.006+08:00</published><updated>2012-06-01T21:54:44.536+08:00</updated><title type='text'>那啥简单的Sexp解析</title><content type='html'>* 简单的Sexp解析&lt;br /&gt;&lt;br /&gt;嘛，没啥东西可贴，就找找以前有没有什么好玩的东西出来吧 &gt;_&lt;&lt;br /&gt;这个就是简单地把那种lisp括号表达式在Python中解析成字符串组成的元组。&lt;br /&gt;能解析的格式被简化的很厉害，不仅是为了实现简单，也是确实让代码可以更简单一些。&lt;br /&gt;用的LL的递归下降对字符解析，考虑到Python3有流IO，用那个会更好一些。&lt;br /&gt;&lt;blockquote&gt;#! /usr/bin/env python26&lt;br /&gt;# coding: utf-8 &lt;br /&gt;&lt;br /&gt;class SSexpr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;A Simple Simplified Sexpr Reader.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Author ee.zsy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Date Mar.2012&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type ssexpr = Symbol of string | Block of ssexpr list;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function parse : string - &amp;gt; ssexpr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&amp;gt;&amp;gt; parse(r&#39;(1 2 &amp;quot;3\&amp;quot; 4&amp;quot;( 1 2 3))&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&#39;1&#39;, &#39;2&#39;, &#39;3&amp;quot; 4&#39;, [&#39;1&#39;, &#39;2&#39;, &#39;3&#39;]]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Notice that Python evaluates expressions from left to right.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w = &amp;quot; \n\t&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e = &amp;quot; \n\t()[]&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = (lambda i:lambda s,x:i(x).pop())(set(&#39;)]&#39;).difference)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = &#39;Brackets or Parentheses do not match.&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = dict(zip(&#39;\&amp;quot;\&#39;nt\\&#39;,&#39;\&amp;quot;\&#39;\n\t\\&#39;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = &#39;Escape character is not recognized.&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(s,code):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.s, s.p = code, 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def read(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try:return s.exp()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;except RuntimeError as e:raise SyntaxError(e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def parse(c,code):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return c(code).read()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def peek(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return s.s[s.p] if s.p&amp;lt;len(s.s) else None&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def eat(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s.p += 1;return s.s[s.p-1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def exp(s,cm=0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = s.peek()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c is None:return None  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c in s.w:return s.eat() and s.exp()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == &#39;(&#39;:return s.eat() and s.blk(&#39;)&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == &#39;[&#39;:return s.eat() and s.blk(&#39;]&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == &#39;&amp;quot;&#39;:return s.eat() and s.str()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:return s.sym()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def sym(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = s.peek()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c is None or c in s.e:return &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:return s.eat() and c+s.sym()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def str(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = s.peek()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c is None:raise EOFError&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == &#39;&amp;quot;&#39;:return s.eat() and &#39;&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c ==&#39;\\&#39;:return s.eat() and s.esc(s.eat())+s.str()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:return s.eat() and c+s.str()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def esc(s,c):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c in s.a:return s.a[c]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:raise SyntaxError(s.f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def blk(s,end):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = s.peek()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if c is None:raise EOFError&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == s.b(end):raise SyntaxError(s.m)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c in s.w:return s.eat() and s.blk(end)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif c == end:return s.eat() and tuple()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:return tuple([s.exp()])+s.blk(end) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;if 1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert SSexpr(&amp;quot;&amp;quot;&amp;quot;123 12&amp;quot;&amp;quot;&amp;quot;).read() == &#39;123&#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert SSexpr(&amp;quot;&amp;quot;&amp;quot;(1 2 3 4(1 2 3))&amp;quot;&amp;quot;&amp;quot;).read() == (&#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, (&#39;1&#39;, &#39;2&#39;, &#39;3&#39;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert SSexpr(&amp;quot;&amp;quot;&amp;quot;(1 2 &amp;quot;3 4&amp;quot;( 1 2 3))&amp;quot;&amp;quot;&amp;quot;).read() == (&#39;1&#39;, &#39;2&#39;, &#39;3 4&#39;, (&#39;1&#39;, &#39;2&#39;, &#39;3&#39;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert SSexpr.parse(r&amp;quot;&amp;quot;&amp;quot;(1 2 &amp;quot;3\&amp;quot; 4&amp;quot;( 1 2 3))&amp;quot;&amp;quot;&amp;quot;) == (&#39;1&#39;, &#39;2&#39;, &#39;3&amp;quot; 4&#39;, (&#39;1&#39;, &#39;2&#39;, &#39;3&#39;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert SSexpr.parse(r&amp;quot;&amp;quot;&amp;quot;[]&amp;quot;&amp;quot;&amp;quot;) == tuple()&lt;br /&gt;&lt;br /&gt;if __name__ == &#39;__main__&#39;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print SSexpr(&amp;quot;&amp;quot;&amp;quot;[hello world]&amp;quot;&amp;quot;&amp;quot;).read()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while 1:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print SSexpr(raw_input()).read()&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;再往前的一个功能略微多一点点的版本，有单独的正则表达式实现的词法解析部分。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#@Date Nov.27,2011&lt;br /&gt;#@Author ee.zsy&lt;br /&gt;import re&lt;br /&gt;pattern = r&#39;&#39;&#39;&lt;br /&gt;&amp;nbsp;(?P&amp;lt;lpr&amp;gt;\()&lt;br /&gt;|(?P&amp;lt;rpr&amp;gt;\))&lt;br /&gt;|(?P&amp;lt;qte&amp;gt;\&#39;)&lt;br /&gt;|(?P&amp;lt;qqt&amp;gt;`)&lt;br /&gt;|(?P&amp;lt;uqs&amp;gt;,@)&lt;br /&gt;|(?P&amp;lt;uqt&amp;gt;,)&lt;br /&gt;|(?P&amp;lt;blt&amp;gt;\#[tT])&lt;br /&gt;|(?P&amp;lt;blf&amp;gt;\#[fF])&lt;br /&gt;|(?P&amp;lt;chr&amp;gt;\#\\.[^ \)\t\n\r]*)&lt;br /&gt;|(?P&amp;lt;shr&amp;gt;\#)&lt;br /&gt;|(?P&amp;lt;num&amp;gt;[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)&lt;br /&gt;|(?P&amp;lt;str&amp;gt;\&amp;quot;(\\.|[^&amp;quot;])*\&amp;quot;)&lt;br /&gt;|(?P&amp;lt;wht&amp;gt;([ \t\n\r]+)|(;.*?[\n\r]))&lt;br /&gt;|(?P&amp;lt;sym&amp;gt;[^ ;\)\(\t\n\r]+)&lt;br /&gt;&#39;&#39;&#39;&lt;br /&gt;token = re.compile(pattern,re.S|re.X)&lt;br /&gt;def peekToken(text,start=0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;regex = token.match(text,start)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if regex:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tag = [(k,v) for k,v in regex.groupdict().items() if v]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return tag[0],regex.end()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return None,None&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;然后余下的语法解析还是一样的了，只是情况相比要多一些。&lt;br /&gt;不过代码代码不像这里这样简单的看的那么清爽，这里就不贴了。&lt;br /&gt;虽然这里的东西都故意做了简化，但是改动之后倒是可以做表达式计算或者类AWK的解析什么的。&lt;br /&gt;手写LL(1)的时候，有些左连接的操作符，要把循环的部分单独写一条规则出来。&lt;br /&gt;比如像“num &quot;+&quot; num {&quot;+&quot; num}”这样的，要保证可以只根据下一个未处理的Token作出分支。&lt;br /&gt;这里的这种情况有个专门的名词叫做什么什么来着的，囧死了人家都不知道了。&lt;br /&gt;&lt;br /&gt;话说内部接口封装不够不可靠都很讨厌。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Stack machine&lt;br /&gt;&lt;br /&gt;这里先假设操作符都是二元的，那么最简单的一个前缀转后缀可以这么实现。&lt;br /&gt;&lt;blockquote&gt;(define e &#39;(+ (* 3 (- 2 3)) (+ 2 3)))&lt;br /&gt;(define (t e) (if (pair? e) (let ((x (map t e))) (apply append (append (cdr x) (list (car x))))) (list e)))&lt;br /&gt;(display (t e))&lt;/blockquote&gt;&lt;br /&gt;那么接下来，那么接下来就以后再写吧。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/4829675824597732045/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/4829675824597732045' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/4829675824597732045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/4829675824597732045'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/06/ssexp.html' title='那啥简单的Sexp解析'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-8002449273329524774</id><published>2012-05-29T15:06:00.014+08:00</published><updated>2012-06-21T13:20:55.227+08:00</updated><title type='text'>关于AWK的絮絮叨叨</title><content type='html'>* 没啥特别重要的知道的可说的东西。&lt;br /&gt;&lt;br /&gt;* HelloWorld首先：awk &#39;BEGIN{print &quot;helloworld&quot;}&#39;&lt;br /&gt;&lt;br /&gt;* 写在文件里，开头用 #!/bin/awk -f&lt;br /&gt;&lt;br /&gt;* 变量不声明即有默认值，根据类型是0或空字符串。变量是全局的，局部通过函数的参数的形式来实现。&lt;br /&gt;&lt;br /&gt;* awk可用来处理文本数据，和排版输出文本。&lt;br /&gt;&lt;br /&gt;* 默认以一行为一条记录，$1 $2 ...依次为每行的字段（共NF个）。分割行和字段的方式可以自定义，文本的处理过程中是以行为单位触发处理事件的。&lt;br /&gt;&lt;br /&gt;* 记录用正则FS分割，当前行号是NR&lt;br /&gt;&lt;br /&gt;* 变量x用“x+0”转为数字，用“x &quot;&quot;”转换为字符串，比较运算符当有一侧为字符串时，都自动转换为字符串。&lt;br /&gt;&lt;br /&gt;* 识别的方式可以在识别过程中修改。&lt;br /&gt;&lt;br /&gt;* 有一堆系统变量可以读取和设置。&lt;br /&gt;&lt;br /&gt;* awk文件由多个“pattern { action }”构成，当模式的条件匹配后，会执行对应的命令。&lt;br /&gt;&lt;br /&gt;* 在规则中next和exit仅作用于当前行的匹配。&lt;br /&gt;&lt;br /&gt;* 模式可以是空或BEGIN/END或正则表达式或条件语句&lt;br /&gt;&lt;br /&gt;* 关联数组是字符串到变量值的映射，in操作符可用于if判断和for循环，具体使用方法照着示例代码用即可。&lt;br /&gt;&lt;br /&gt;* 多维数组，即C语言中数组的数组，是用SUBSEP拼接下标。&lt;br /&gt;&lt;br /&gt;* man 可参阅 http://www.manpagez.com/man/1/awk/ 。&lt;br /&gt;&lt;br /&gt;* man里有教程、用法、示例和参考列表。&lt;br /&gt;&lt;br /&gt;* 自带里数学/字符串/数组/IO/系统方面的一些函数。&lt;br /&gt;&lt;br /&gt;* 字符串连接是空格，逗号是分隔符。&lt;br /&gt;&lt;br /&gt;* 自定义的函数不可以复制给变量。&lt;br /&gt;&lt;br /&gt;* 基本语法和C和bc都差不多。&lt;br /&gt;&lt;br /&gt;* 正则表达式扮演了很重要的角色，比perl的正则功能上简单。&lt;br /&gt;&lt;br /&gt;* 交互接受用户输入可以用“getline input &quot;-&quot;”，然后使用input变量即可（留空则$0）。&lt;br /&gt;&lt;br /&gt;* 输出有print语句和printf函数，可输出到屏幕或文件。&lt;br /&gt;&lt;br /&gt;* 可以干bc/sed/shell可以干的活，可以放在shell里面干活，可配合管道（getline，print，system）使用。&lt;br /&gt;&lt;br /&gt;* 执行命令或输出到文件，相同字符串的所代表可以一直使用，直到close它。例如“while(getline&lt;&quot;file&quot;&gt;0)”是从文件不断读取行。&lt;br /&gt;&lt;br /&gt;* 输出到错误输出使用“print message I &quot;cat 1&gt;&amp;2&quot;”。&lt;br /&gt;&lt;br /&gt;* 命令行的参数ARGC、ARGV需在BEGIN中处理，之后将被当作是读入的文件名。&lt;br /&gt;&lt;br /&gt;* the awk language里有实现若干排序算法和对awk文法进行解析的例子。&lt;br /&gt;&lt;br /&gt;* 若干常见实例参考::《SED 单行脚本快速参考》的 awk 实现 http://linuxtoy.org/archives/sed-awk.html 。&lt;br /&gt;&lt;br /&gt;* mawk在windows下可用。&lt;br /&gt;&lt;br /&gt;* ideone.com里也有awk可玩。&lt;br /&gt;&lt;br /&gt;* 写python然后“python -c &#39;for i in file(&quot;a.txt&quot;):print i&#39;”作用和“awk &#39;{print $0}&#39; a.txt”差不多。&lt;br /&gt;&lt;br /&gt;* 不论手段，在更高效的前提下，把文本处理完就行。&lt;br /&gt;&lt;br /&gt;* 有时候不用来处理文本也行。&lt;br /&gt;&lt;br /&gt;* 不用awk也行。&lt;br /&gt;&lt;br /&gt;* 很多情况用文本编辑器也行。&lt;br /&gt;&lt;br /&gt;* 若干示例&lt;br /&gt; + 显示文件：awk &#39;{print}&#39;&lt;br /&gt; + 加行号：awk &#39;{print NR,$0}&#39;&lt;br /&gt; + 去行号：awk &#39;{sub(/^[0-9]+ /,&quot;&quot;);print}&#39;&lt;br /&gt; + 统计行数：awk &#39;END{print NR}&#39;&lt;br /&gt; + 排序：awk &#39;{A[NR]=$0}END{asort(x);for(i=1;i&lt;=NR;i++)print A[ i]}&#39;&lt;br /&gt; + 计算均值：awk &#39;{S+=$0}END{print S/NR}&#39;&lt;br /&gt; + 另一种均值写法：awk &#39;BEGIN{for(i=1;i&lt;ARGC;i++)s+=ARGV[ i];print s/(ARGC-1)}&#39;</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/8002449273329524774/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/8002449273329524774' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8002449273329524774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8002449273329524774'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/05/awk.html' title='关于AWK的絮絮叨叨'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-3027838347631623914</id><published>2012-05-23T21:27:00.002+08:00</published><updated>2012-05-23T21:36:43.910+08:00</updated><title type='text'>代码小练习三 - 图</title><content type='html'>继续代码小练习系列，理念是写出简单有趣的代码，虽然践行得有点失败的说。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 图的广度优先搜索&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;代码很粗暴，可以用来走走迷宫求求无权图的最短路径。&lt;br /&gt;此外把Queue换成Stack就是深度优先搜索了，递归也行。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;type graph = int list*(int*int) list&lt;br /&gt;let g = ([1;2;3;4],[(1,2);(2,3);(3,4);(3,1);(2,4)])&lt;br /&gt;let bfs (g:graph) s =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let q = Queue.create() in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let module S = Set.Make(struct type t = int let compare = compare end) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let set = ref (S.add s S.empty) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec loop c = begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print_int c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List.iter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(fun (x,y)-&amp;gt;if x==c &amp;amp;&amp;amp; not (S.mem y !set) then begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set := (S.add y (!set))); Queue.push y q end) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(match g with _,edges-&amp;gt;edges);        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if Queue.is_empty q then () else loop (Queue.pop q);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end in loop s;;&lt;br /&gt;bfs g 1;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 有权无向连通图的最小生成树&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MinimumSpanningTrees就是用那啥Kruskal和Prim，往生成树中贪婪地添加最优边。&lt;br /&gt;关于所添加的最优的边的选择，前者是图中权最小的边，后者是生成树相邻的边。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;type weight=int &lt;br /&gt;&amp;nbsp;and vertex=int &lt;br /&gt;&amp;nbsp;and edge=vertex*vertex*weight &lt;br /&gt;&amp;nbsp;and graph=vertex list*edge list&lt;br /&gt;let g = ([1;2;3;4],[(1,2,2);(2,3,3);(3,4,2);(1,3,4);(2,4,2)])&lt;br /&gt;let mst_kruskal g=&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let s = Hashtbl.create 0 in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec find_set (x:vertex) =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x=(try (Hashtbl.find s x) with Not_found-&amp;gt;x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then x else find_set (Hashtbl.find s x) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let union x y = Hashtbl.replace s (find_set x) (find_set y) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let module P = Set.Make(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct type t = vertex*vertex let compare = compare end) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let a = ref P.empty in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let edges = List.sort (fun (_,_,w1) (_,_,w2)-&amp;gt;w1-w2) (snd g) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List.iter (fun (x,y,z)-&amp;gt;if find_set(x)&amp;lt;&amp;gt;find_set(y) then &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin union x y; a := (P.add (x,y) (!a)) end) edges;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;P.iter (fun (x,y)-&amp;gt;begin Printf.printf &amp;quot;\\/(%d,%d)&amp;quot; x y end) !a;&lt;br /&gt;;;&lt;br /&gt;mst_kruskal g;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;g = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(1,3,4),(2,4,2)])&lt;br /&gt;def mst_prim(g,r):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k,p,q,w={r:0},{},g[0][:],dict(sum([[[(x,y),z],[(y,x),z]] for x,y,z in g[1]],[]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while q: u = min(q,key=lambda x:k.get(x,float(&#39;+inf&#39;))); q.remove(u)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for v in set([y for x,y,_ in g[1] if x==u]+[x for x,y,_ in g[1] if y==u]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if v in q and w[(u,v)]&amp;lt;k.get(v,float(&#39;+inf&#39;)):       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k[v], p[v] = w[(u,v)], u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return p&lt;br /&gt;print mst_prim(g,1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 带权有向图的单源最短路径 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Single-Source Shortest Paths可从起点按照距离动态规划。&lt;br /&gt;Dijkstra可以得到从单一起点到其他所有顶点的距离及路径。&lt;br /&gt;Bellman-Ford当负权边存在时路径若经过负圈则路径不存在。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;g = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(1,3,4),(2,4,2)])&lt;br /&gt;def dijkstra(g,s,t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q, w = g[0][:], {(x,y):z for x,y,z in g[1]}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d, p = {i:0 if i==s else float(&#39;+inf&#39;) for i in g[0]}, {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while q:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u = min(q,key=lambda x:d[x]); q.remove(u)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if u==t:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = lambda i:[i]+([] if i==s else f(p[i]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return list(reversed(f(t)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for v in {y for x,y,_ in g[1] if x==u}:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if d[v] &amp;gt; d[u] + w[(u,v)]:       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[v], p[v] = d[u]+w[(u,v)], u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return None&lt;br /&gt;print dijkstra(g,1,4)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;g2 = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(3,1,-9),(2,4,2)])&lt;br /&gt;g3 = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(3,1,-4),(2,4,2)])&lt;br /&gt;def bellman_ford(g,s,t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d, p = {i:0 if i==s else float(&#39;+inf&#39;) for i in g[0]}, {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(len(g[0])-1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for u,v,w in g[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if d[v] &amp;gt; d[u] + w:       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[v], p[v] = d[u]+w, u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if any(d[v] &amp;gt; d[u] + w for u,v,w in g[1]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return None&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = lambda i:[i]+([] if i==s else f(p[i]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return list(reversed(f(t)))&lt;br /&gt;print bellman_ford(g,1,4)&lt;br /&gt;print bellman_ford(g2,1,4)&lt;br /&gt;print bellman_ford(g3,1,4)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;好吧，咱承认是在对着书敲的代码，脑子已经不大清楚了囧。&lt;br /&gt;这里的Dijkstra改改就是Prim，虽然作用不同代码结构一样。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 任意两点间的最短路径&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All-Pairs Shortest Paths，用Floyd-Warshall算法动态规划 ，一次得到图中任意两点间距离。&lt;br /&gt;&lt;br /&gt;g = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(3,1,4),(2,4,2)])&lt;br /&gt;def floyd_warshall(g):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n = len(g[0])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = [[float(&#39;+inf&#39;)]*n for i in g[0]]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = {v:k for k,v in enumerate(g[0])}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for u,v,w in g[1]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[t[u]][t[v]] = min(d[t[u]][t[v]],w)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k in range(n):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(n):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in range(n):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d[i][j] = min(d[i][j],d[i][k]+d[k][j])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return [(u,v,d[t[u]][t[v]]) for u in g[0] for v in g[0]]&lt;br /&gt;print &amp;quot;\n&amp;quot;.join(&amp;quot;%s-&amp;gt;%s : %s&amp;quot;%(u,v,w) for u,v,w in floyd_warshall(g))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 网络流的最大流&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maximum Flow，可以通过不断添加流量到增广路上（Augmenting Path）计算。&lt;br /&gt;其中增广路通过广度优先搜索在剩余网络（Residual Network）上查找得到。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;g  = ([1,2,3,4],[(1,2,2),(2,3,3),(3,4,2),(3,1,4),(2,4,2)])&lt;br /&gt;g2 = ([1,2,3,4],[(1,2,3),(2,3,3),(3,4,2),(3,1,4),(2,4,2)])&lt;br /&gt;g3 = ([1,2,3,4],[(1,2,5),(2,3,3),(3,4,2),(3,1,4),(2,4,2)])&lt;br /&gt;g4 = ([&#39;s&#39;,&#39;o&#39;,&#39;p&#39;,&#39;q&#39;,&#39;r&#39;,&#39;t&#39;],[(&#39;s&#39;,&#39;o&#39;,3),(&#39;s&#39;,&#39;p&#39;,3),(&#39;o&#39;,&#39;p&#39;,2),(&#39;o&#39;,&#39;q&#39;,3),(&#39;p&#39;,&#39;r&#39;,2),(&#39;r&#39;,&#39;t&#39;,3),(&#39;q&#39;,&#39;r&#39;,4),(&#39;q&#39;,&#39;t&#39;,2)])&lt;br /&gt;def edmonds_karp(g,s,t):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w = dict(sum(([[(u,v),w],[(v,u),0]] for u,v,w in g[1]),[]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = {i:0 for i in w.keys()}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def bfs():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q, u, p = [], s, []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while u!=t:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q.extend(p+[e] for e in w.keys() if e[0]==u and e not in p and f[e]&amp;lt;w[e])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not q: return None&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = q.pop(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u = p[-1][1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for p in iter(bfs,None):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = min(w[e]-f[e] for e in p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for u,v in p:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f[(u,v)] += c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f[(v,u)] -= c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sum(f[e] for e in w.keys() if e[0]==s)&lt;br /&gt;print edmonds_karp(g,1,4)&lt;br /&gt;print edmonds_karp(g2,1,4)&lt;br /&gt;print edmonds_karp(g3,1,4)&lt;br /&gt;print edmonds_karp(g4,&#39;s&#39;,&#39;t&#39;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;这里没理解错什么吧，有些细节还未考虑过，感觉有不大对劲。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* A*搜索与拓扑排序</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/3027838347631623914/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/3027838347631623914' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3027838347631623914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3027838347631623914'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/05/blog-post_23.html' title='代码小练习三 - 图'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-830172434178490715</id><published>2012-05-21T16:22:00.005+08:00</published><updated>2012-05-23T21:30:41.723+08:00</updated><title type='text'>代码小练习二 - 优先队列</title><content type='html'>继续代码小练习，优先队列，还会有些其他的应用的例子吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Binary Heap&lt;br /&gt;&lt;br /&gt;实现上PriorityQueue可以用BinaryHeap结构，也可用于排序。这里的数组下标为方便是从0而没有从1开始算的。&lt;br /&gt;&lt;br /&gt;def heapify(lst,i,size=None,less=lambda x,y:x&amp;lt;y):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left, right = 2*i+1, 2*(i+1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size = size if size else len(lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;largest = i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if left&amp;lt;size and less(lst[largest],lst[left]):#lst[left]&amp;gt;lst[largest]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;largest = left&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if right&amp;lt;size and less(lst[largest],lst[right]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;largest = right&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if largest!=i:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst[i],lst[largest] = lst[largest], lst[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;heapify(lst,largest,size=size)&lt;br /&gt;def build_heap(lst):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(int(len(lst)/2),-1,-1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;heapify(lst,i)&lt;br /&gt;def heap_sort(lst):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;build_heap(lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(len(lst)-1,0,-1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst[0], lst[i] = lst[i], lst[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;heapify(lst,0,size=i)        &lt;br /&gt;class PriorityQueue:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self,less=lambda x,y:x&amp;lt;y):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.less = less&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.container = list()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def push(self,x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst = self.container&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;parent = lambda x:int((i-1)/2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst.append(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i = len(lst)-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = parent(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while i&amp;gt;0 and self.less(lst[p],lst[i]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst[i],lst[p] = lst[p], lst[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i = p; p = parent(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def pop(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not self.empty():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst = self.container&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x, lst[0] = lst[0], lst[-1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst.pop()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;heapify(lst,0,less=self.less)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise &amp;quot;underflow&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def top(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not self.empty():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.container[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise &amp;quot;empty&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def size(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return len(self.container)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def empty(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.size()==0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Huffman Coding&lt;br /&gt;&lt;br /&gt;一个PriorityQueue的实际的例子，用于数据压缩。&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;#include &amp;lt;queue&amp;gt;&lt;br /&gt;#include &amp;lt;map&amp;gt;&lt;br /&gt;#include &amp;lt;bitset&amp;gt;&lt;br /&gt;#include &amp;lt;cstring&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;struct Node {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int freq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* left;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* right;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;explicit Node(char data,int freq)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:data(data),freq(freq),left(NULL),right(NULL) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;explicit Node(Node* left,Node* right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:data(&#39;\0&#39;),freq(left-&amp;gt;freq+right-&amp;gt;freq),left(left),right(right) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~Node(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(left)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete left;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete right;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool isLeaf() const {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return left==NULL or right==NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;struct NodeCmp {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool operator()(const Node* n1,const Node* n2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return n1-&amp;gt;freq &amp;gt; n2-&amp;gt;freq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;br /&gt;Node* huffman_tree(const map&amp;lt;char,int&amp;gt;&amp;amp; entries) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;priority_queue&amp;lt;Node*,vector&amp;lt;Node*&amp;gt;,NodeCmp&amp;gt; pq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(map&amp;lt;char,int&amp;gt;::const_iterator it=entries.begin(); it!=entries.end(); ++it )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pq.push(new Node(it-&amp;gt;first,it-&amp;gt;second));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int n = entries.size();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//while(pq.size()&amp;gt;1){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0; i&amp;lt;n-1; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* x = pq.top();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pq.pop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* y = pq.top();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pq.pop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* n=new Node(x,y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pq.push(n);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return pq.top();&lt;br /&gt;}&lt;br /&gt;void huffman_count(string text,map&amp;lt;char,int&amp;gt;&amp;amp; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(unsigned i=0; i&amp;lt;text.size(); i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result[text[i]]++;&lt;br /&gt;}&lt;br /&gt;void huffman_travel(Node* node,vector&amp;lt;bool&amp;gt;&amp;amp; code,map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt;&amp;amp; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(node-&amp;gt;isLeaf())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result[node-&amp;gt;data] = code;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;bool&amp;gt; left(code);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left.push_back(false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_travel(node-&amp;gt;left,left,result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;bool&amp;gt; right(code);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;right.push_back(true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_travel(node-&amp;gt;right,right,result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void huffman_code(Node* tree,map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt;&amp;amp; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;bool&amp;gt; empty;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_travel(tree,empty,result);&lt;br /&gt;}&lt;br /&gt;void huffman_print(map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt;&amp;amp; code) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;&amp;quot;dict\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt;::iterator i=code.begin() ; i != code.end(); ++i ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt; i-&amp;gt;first &amp;lt;&amp;lt; &amp;quot; =&amp;gt; &amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(vector&amp;lt;bool&amp;gt;::iterator j=i-&amp;gt;second.begin(); j!=i-&amp;gt;second.end(); ++j) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout &amp;lt;&amp;lt;((*j)?&#39;1&#39;:&#39;0&#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;void huffman_print(vector&amp;lt;bool&amp;gt;&amp;amp; code) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;&amp;quot;list\n&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(unsigned i=0; i&amp;lt;code.size(); i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;code[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;endl;&lt;br /&gt;}&lt;br /&gt;void huffman_print(const char* code) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;&amp;quot;string\n&amp;quot;&amp;lt;&amp;lt;code&amp;lt;&amp;lt;endl;&lt;br /&gt;}&lt;br /&gt;Node* huffman_encode(const string&amp;amp; text,map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt;&amp;amp; dict,vector&amp;lt;bool&amp;gt;&amp;amp; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;lt;char,int&amp;gt; entries;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_count(text,entries);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* tree = huffman_tree(entries);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_code(tree,dict);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(unsigned i=0; i&amp;lt;text.size(); i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const vector&amp;lt;bool&amp;gt;&amp;amp; append = dict[text[i]];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;copy(append.begin(),append.end(),back_insert_iterator&amp;lt; vector&amp;lt;bool&amp;gt; &amp;gt;(result));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return tree;&lt;br /&gt;}&lt;br /&gt;void huffman_decode(vector&amp;lt;bool&amp;gt;&amp;amp; code,Node* const tree,string&amp;amp; result) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* p = tree;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(unsigned i=0; i&amp;lt;code.size(); i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool bit = code[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = (bit==false)?p-&amp;gt;left:p-&amp;gt;right;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(p-&amp;gt;isLeaf()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result.push_back(p-&amp;gt;data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = tree;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;int main(int argc, char **argv) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const char* text = &amp;quot;William Shakespeare (baptised 26 April 1564; died 23 April 1616) was an English poet and playwright, widely regarded as the greatest writer in the English language and the world&#39;s pre-eminent dramatist. He is often called England&#39;s national poet and the \&amp;quot;Bard of Avon\&amp;quot;. His surviving works, including some collaborations, consist of about 38 plays, 154 sonnets, two long narrative poems, and several other poems. His plays have been translated into every major living language and are performed more often than those of any other playwright.&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;map&amp;lt;char, vector&amp;lt;bool&amp;gt; &amp;gt; code;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vector&amp;lt;bool&amp;gt; encode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Node* tree = huffman_encode(text,code,encode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_print(code);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_print(encode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;&amp;quot;bit length &amp;quot;&amp;lt;&amp;lt;strlen(text)*sizeof(char)*8&amp;lt;&amp;lt;&amp;quot;-&amp;gt;&amp;quot;&amp;lt;&amp;lt;encode.size()&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string decode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_decode(encode,tree,decode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;huffman_print(decode.c_str());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete tree;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/830172434178490715/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/830172434178490715' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/830172434178490715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/830172434178490715'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/05/blog-post_21.html' title='代码小练习二 - 优先队列'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-6055308714651341506</id><published>2012-05-09T19:44:00.004+08:00</published><updated>2012-05-09T19:59:16.280+08:00</updated><title type='text'>代码练习 - 容器</title><content type='html'>一组简单的代码练习，实现了基本的容器类型。&lt;br /&gt;小小的活动手指，了解相关的运行调试编译环境。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 代码练习一，简单的双向链表。&lt;br /&gt;&lt;br /&gt;增删元素时，节点对前后节点的引用可千万别弄错呦。&lt;br /&gt;包括自己的以及前后节点的都得修改，有遗漏就糟糕了。&lt;br /&gt;依赖调试就不好了，得能够手写一遍就正确才可以的。&lt;br /&gt;&lt;br /&gt;class DList(object):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Doubly linked list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;link: http://www.w3schools.com/jsref/jsref_obj_array.asp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class Node:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self,item,prev,next):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.item = item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.prev = prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.next = next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sentinel = self.Node(None,None,None)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sentinel.prev = self.sentinel&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sentinel.next = self.sentinel&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def length(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k,v in enumerate(self,1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert k == self.len&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return k&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __len__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.len&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def shift(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if self.sentinel.next is self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise Exception(&amp;quot;empty&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len -= 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node = self.sentinel.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._remove(node)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return node.item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def unshift(self,item):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self._insert(item,self.sentinel.next)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sentinel.next = self.Node(item,self.sentinel,self.sentinel.next)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.sentinel.next.next.prev = self.sentinel.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.len&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def push(self,item):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._insert(item,self.sentinel)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self.sentinel.prev = self.Node(item,self.sentinel.prev,self.sentinel)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self.sentinel.prev.prev.next = self.sentinel.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return self.len&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def pop(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if self.sentinel.prev is self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise Exception(&amp;quot;empty&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len -= 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node = self.sentinel.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._remove(node)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self.sentinel.prev.prev.next = self.sentinel.prev.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self.sentinel.prev = self.sentinel.prev.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return node.item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def indexOf(self,item):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k,v in enumerate(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if v==item:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return k&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def lastIndexOf(self,item):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k,v in enumerate(reversed(self)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if v==item:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return k&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def slice(self,start,end):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = self.__class__()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length = self.length()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin = start+length if start&amp;lt;0 else start&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop = end+length if end&amp;lt;0 else end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k,v in enumerate(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= stop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= begin:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l.push(v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def _remove(cls,node):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node.prev.next = node.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node.next.prev = node.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@classmethod&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def _insert(cls,item,node):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node.prev.next = cls.Node(item,node.prev,node)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;node.prev = node.prev.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def splice(self,start,howmany,*items):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = self.__class__()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;length = self.length()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin = start+length if start&amp;lt;0 else start&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stop = begin + howmany&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k, p = 0, self.sentinel.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while p is not self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= stop:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= begin:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l.push(p.item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._remove(p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len -= 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = p.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in items:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self.len += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;self._insert(i,p)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def _copy(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = self.__class__()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in self:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l.push(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def concat(self,*lists):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = self._copy()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in lists:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in i:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l.push(j)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def join(self,sep):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;assert hasattr(sep,&#39;join&#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sep.join(map(str,self))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def reverse(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = self.sentinel&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while True:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q = p.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.prev, p.next = p.next, p.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = q&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if p is self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def sort(self,cmp=lambda x,y:x-y):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rest = self.sentinel.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while rest is not self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m, p =rest, rest.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while p is not self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if cmp(p.item,m.item)&amp;lt;0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = p.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if rest is m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rest = m.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#self._remove(m);self._insert(m.item,rest)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m.prev.next, m.next.prev = m.next, m.prev           &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m.prev, m.next = rest.prev, rest&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rest.prev.next, rest.prev = m, m&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __iter__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = self.sentinel.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while p is not self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield p.item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = p.next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __reversed__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = self.sentinel.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while p is not self.sentinel:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield p.item&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = p.prev&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __str__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &#39;,&#39;.join(map(str,self))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def __repr__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &#39;[%s]&#39;%&#39;, &#39;.join(map(str,self))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def valueOf(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return str(self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def toString(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return repr(self)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def map(self,proc):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = self.__class__()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in self:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l.push(proc(i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def forEach(self,proc):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in self:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proc(i)&lt;br /&gt;&lt;br /&gt;这里通过私有的remove和insert方法来增删节点比直接增删节点要不容易错一些。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 代码小练习二，仿JavaScript数组的实现。&lt;br /&gt; &lt;br /&gt;接着前面的那一个再做个小练习，不过咱好菜呀，居然写得好费尽的感觉（沮丧。&lt;br /&gt;下标和范围什么的总是搞错，单个函数一长的话就头晕晕的了，而且最后还是依赖调试了。&lt;br /&gt;这样是不行的，真的不行的，在非类型安全的语言或者纸张上书写的话这样就写不出正确的代码是不行的。&lt;br /&gt;嘛，或许再熟练一些就会好一些吧，对于常见的情况抽象为函数或固定的代码。恩，或许就是这样的。&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var print = function(x) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.write(x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.writeln(&amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;};&lt;br /&gt;var p = print;&lt;br /&gt;print(&amp;quot;hello world&amp;quot;);&lt;br /&gt;function JArray() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var that = (this instanceof arguments.callee) ? this : new arguments.callee();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(arguments.length == 1 &amp;amp;&amp;amp; this instanceof arguments.callee)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;that.length = arguments[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;that.length = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; arguments.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;that.push(arguments[i])&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return that;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.push = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[this.length] = item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ++this.length;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.pop = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(this.length == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return undefined;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.length--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var item = this[this.length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete this[this.length];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return item;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.shift = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(this.length == 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return undefined;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var item = this[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[i] = this[i + 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.length--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete this[this.length]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return item;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.unshift = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = this.length; i &amp;gt; 0; i--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[i] = this[i - 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[0] = item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ++this.length;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.join = function(sep) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var sep = sep || &#39;,&#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var string = this.length == 0 ? &amp;quot;&amp;quot; : this[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 1; i &amp;lt; this.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string += sep + this[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return string;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.toString = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this.join();&lt;br /&gt;};&lt;br /&gt;JArray.prototype.slice = function(start, end) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var array = new this.constructor();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var start = start &amp;lt; 0 ? start + this.length : start;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var end = end || this.length;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end = end &amp;lt; 0 ? end + this.length : end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = start; i &amp;lt; end &amp;amp;&amp;amp; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array.push(this[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return array;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.indexOf = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(this[i] == item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.lastIndexOf = function(item) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = this.length - 1; i &amp;gt;= 0; i--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(this[i] == item)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.concat = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var array = new this.constructor();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array.push(this[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; arguments.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var j = 0; j &amp;lt; arguments[i].length; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array.push(arguments[i][j]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return array;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.splice = function(index, howmany, item1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var array = new this.constructor();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var index = index &amp;lt; 0 ? index + this.length : index;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var howmany = Math.min(this.length - index, howmany);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var end = index + howmany;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = index; i &amp;lt; end; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array.push(this[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var itemnum = arguments.length - 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(howmany &amp;gt; itemnum) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var eat = howmany - itemnum;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = end; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[i - eat] = this[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = this.length - eat; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete this[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.length -= eat;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var room = itemnum - howmany;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = this.length - 1; i &amp;gt;= index; i--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[i + room] = this[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.length += room;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; itemnum; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[index + i] = arguments[i + 2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return array;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.reverse = function(start, howmany, item1) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0, j = this.length - 1; i &amp;lt; j; i++, j--) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var tmp = this[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[i] = this[j];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this[j] = tmp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;};&lt;br /&gt;JArray.prototype.sort = function(cmp) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cmp = cmp || (function(x, y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return x &amp;lt; y ? -1 : 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var partition = function(array, x, y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var pivot = array[x];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var z = x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = x + 1; i &amp;lt; y; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var tmp = array[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(cmp(tmp, pivot) &amp;lt; 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array[i] = array[z];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array[z] = tmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array[x] = array[z];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;array[z] = pivot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return z;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var qsort = function(array, x, y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(x &amp;lt; y) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var z = partition(array, x, y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qsort(array, x, z);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qsort(array, z + 1, y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qsort(this, 0, this.length);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return this;&lt;br /&gt;};&lt;br /&gt;JArray.prototype.forEach = function(proc) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proc(this[i])&lt;br /&gt;};&lt;br /&gt;JArray.prototype.every = function(proc) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var i = 0; i &amp;lt; this.length; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(!proc(this[i]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true;&lt;br /&gt;};&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;测试代码没有贴，不过最好其实还是给每个方法都对应几种情况写好自动测试为好吧这样。&lt;br /&gt;好写细节和js本身的Array不一样，比如一些可选参数的情况，这里仅做拙劣的练习就不完善它了。&lt;br /&gt;link: https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.6#Array_extras&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 代码小练习三，简单的关联数组。&lt;br /&gt;&lt;br /&gt;一个简单的关联数组，key限定为字符串类型。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;cstring&amp;gt;&lt;br /&gt;using namespace std;&lt;br /&gt;template&amp;lt;class T&amp;gt;&lt;br /&gt;class Hash{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class NotFound{};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class Full{};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct Entry{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const char* key;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int _capacity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* table;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* search(const char* key){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int hash = strhash(key)%_capacity;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=hash;i&amp;lt;hash+_capacity;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* entry = &amp;amp;table[i%_capacity];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(entry-&amp;gt;key==NULL || streq(entry-&amp;gt;key,key))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return entry;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;public:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static int strhash(const char* str){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int hash = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(const char* p = str; *p; p++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash = 31 * hash + *p;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return hash;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static bool streq(const char* str1,const char* str2){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return !strcmp(str1,str2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hash(int capacity)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:_capacity(capacity),table(new Entry[capacity]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(int i=0;i&amp;lt;capacity;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table[i].key = NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~Hash(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete[] table;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void put(const char* key,T value){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* entry = this-&amp;gt;search(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(entry){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(entry-&amp;gt;key==NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry-&amp;gt;key = key;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry-&amp;gt;value = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw Full();//&amp;quot;Full&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void del(const char* key){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* entry = this-&amp;gt;search(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(entry &amp;amp;&amp;amp; entry-&amp;gt;key){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry-&amp;gt;key=NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entry-&amp;gt;value=NULL;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;T get(const char* key){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* entry = this-&amp;gt;search(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(entry &amp;amp;&amp;amp; entry-&amp;gt;key)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return entry-&amp;gt;value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw NotFound();//&amp;quot;Not Found&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bool has(const char* key){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Entry* entry = this-&amp;gt;search(key);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return entry &amp;amp;&amp;amp; entry-&amp;gt;key;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;&amp;quot;hello world&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hash&amp;lt;int&amp;gt; hash(100);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;hash.has(&amp;quot;a&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash.put(&amp;quot;a&amp;quot;,125);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash.put(&amp;quot;b&amp;quot;,128);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;hash.has(&amp;quot;a&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;hash.has(&amp;quot;b&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;hash.get(&amp;quot;b&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hash.del(&amp;quot;b&amp;quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cout&amp;lt;&amp;lt;hash.has(&amp;quot;b&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//cout&amp;lt;&amp;lt;hash.get(&amp;quot;c&amp;quot;)&amp;lt;&amp;lt;endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 代码练习四，优先队列。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/6055308714651341506/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/6055308714651341506' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6055308714651341506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6055308714651341506'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/05/blog-post.html' title='代码练习 - 容器'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-9043226257617691562</id><published>2012-04-25T19:57:00.011+08:00</published><updated>2012-04-25T20:33:14.319+08:00</updated><title type='text'>Blogger后台截图留恋</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFgME5cVC6haQP0eLcrwN76HDU12nN2pibRfp6bhcJcs44g_xjhSV4CCgWJfBLFpwo4MaAe41bnyzSzKmysiTEV6BjNmvyNQGuW8Kc4tGEftfi-DczJa6wZ2-rW2S-VSlepTRKqHFrjWQ/s1600/bs2.PNG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 400px; height: 319px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFgME5cVC6haQP0eLcrwN76HDU12nN2pibRfp6bhcJcs44g_xjhSV4CCgWJfBLFpwo4MaAe41bnyzSzKmysiTEV6BjNmvyNQGuW8Kc4tGEftfi-DczJa6wZ2-rW2S-VSlepTRKqHFrjWQ/s400/bs2.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5735306589040811506&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBHbtpIDpPM-aMrKIKyl7e0vKHt4UifqqUv-u2wCiwUyFPhycD1kYehM6rddsVKyWHMMgrO4SQ0bLifWCuK0bUN1qSA44y77HlSw828U-sj7io3RbbziAnnC16JJC_F6cobJBsTHDBBRc/s1600/bs.PNG&quot;&gt;&lt;img style=&quot;cursor:pointer; cursor:hand;width: 400px; height: 319px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBHbtpIDpPM-aMrKIKyl7e0vKHt4UifqqUv-u2wCiwUyFPhycD1kYehM6rddsVKyWHMMgrO4SQ0bLifWCuK0bUN1qSA44y77HlSw828U-sj7io3RbbziAnnC16JJC_F6cobJBsTHDBBRc/s400/bs.PNG&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5735306582956342626&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由于Blogger比Gmal更早一些，所以帐号就不是Gmail的帐号了。&lt;br /&gt;这个后台界面挺让人怀念的，毕竟用了很长时间，被GPlus了真讨厌呢。&lt;br /&gt;有些是草稿，这个貌似之前说到过了，没想到挺占屏幕的。&lt;br /&gt;没写过什么有价值的东西，都是自言自语胡思乱想的东西。&lt;br /&gt;以前blogger和youtube都是可以很方便就能上的站点呢。&lt;br /&gt;当初google还不强推什么googleplus这个整合地令人讨厌的东西呢。&lt;br /&gt;当初墙还对ssl无奈呢，当初网页不是css布局，科技发展真是飞快呀。&lt;br /&gt;当初知道窗口原来还可以用标题栏拖动位置，还真是吃了一惊呢。&lt;br /&gt;当初还对着键盘敲着dir，然后进wps，然后打字打字打字只会打字呢。&lt;br /&gt;回忆真是无趣，明明未来将获得更美好的东西，明明回忆是蕴含着——&lt;br /&gt;希望，财富，信念，憧憬，活力的的过去时光，&lt;br /&gt;何必总以未来的没有到来而让回忆就总染上了橘红色的悲伤气氛呢。&lt;br /&gt;&lt;br /&gt;所谓“永恒”呢，或许它不是历史长河中注定的一尘不变的遗忘，而是在过去与将来的种种的不相干的事物之中呈现出来的一致面。一份由过去的经验与财富给当前留下的踏实感，一份由未来可以继续传递下去的憧憬和希望，这些都是由“永恒”所连接起的美好回忆与期盼的那一份璀璨纽带。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/9043226257617691562/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/9043226257617691562' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/9043226257617691562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/9043226257617691562'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/04/blogger.html' title='Blogger后台截图留恋'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFgME5cVC6haQP0eLcrwN76HDU12nN2pibRfp6bhcJcs44g_xjhSV4CCgWJfBLFpwo4MaAe41bnyzSzKmysiTEV6BjNmvyNQGuW8Kc4tGEftfi-DczJa6wZ2-rW2S-VSlepTRKqHFrjWQ/s72-c/bs2.PNG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-5681204549277438835</id><published>2012-04-08T21:04:00.011+08:00</published><updated>2012-04-25T14:52:54.728+08:00</updated><title type='text'>一种Scheme语言中基于消息传递的面向对象机制 上 -- 语言机制</title><content type='html'>以下代码是单纯为了试一试在Scheme里面使用使用面向对象机制而写。&lt;br /&gt;大致可行不过仍需完善，利用更多常见的使用情况还需要单独地特别考虑一下。&lt;br /&gt;&lt;br /&gt;代码贴在这里格式乱掉了。。。&lt;br /&gt;&lt;br /&gt;其实OO有很多中实现方式，这里主要是使用闭包了。&lt;br /&gt;闭包有天然的作用域可以作为访问控制&lt;br /&gt;----&lt;br /&gt;http://pastebin.com/ifbtVEPS&lt;br /&gt;&lt;br /&gt;;#lang r5rs&lt;br /&gt;;(define error display)&lt;br /&gt;;;;一种Scheme语言中基于消息传递的面向对象机制 上 -- 语言机制 - Closure&lt;br /&gt;;;;面向对象的机制的实现方式很都多种，常见的比如基于向量和隐藏this指针的。&lt;br /&gt;;;;这里是基于程序语言中的闭包特性来实现的，尝试了面向对象机制中的一些常见情况。&lt;br /&gt;;;;参考1 OCaml http://caml.inria.fr/pub/docs/u3-ocaml/ocaml-objects.html&lt;br /&gt;;;;参考2 SICP http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-17.html&lt;br /&gt;;;;参考3 R5RS http://www.schemers.org/Documents/Standards/R5RS/HTML/&lt;br /&gt;;;;查找对象方法的时间复杂度依赖所用实现的case语句的实现方式，若有优化则为O(1)。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;========================= 定义部分 ============================&lt;br /&gt;&lt;br /&gt;;;;function send&lt;br /&gt;;;;向对象发送消息&lt;br /&gt;;;;type = closure * symbol * object list -&gt; object&lt;br /&gt;;;;example. (send pair &#39;set-car! 1) == (set-car! pair 1)&lt;br /&gt;(define (send object method . arguments)&lt;br /&gt;  (cond ((object method)&lt;br /&gt;         =&gt;(lambda (x) (apply x arguments)))&lt;br /&gt;        (else (error &quot;method missing&quot;))))&lt;br /&gt;;;;function interface&lt;br /&gt;;;;检验对象是否实现方法，注意方法名一致不能保证方法的语义正确&lt;br /&gt;;;;type = symbol list -&gt; (closure -&gt; boolean)&lt;br /&gt;;;;example. sequence? == (interface &#39;car &#39;cdr)&lt;br /&gt;(define (interface . methods)&lt;br /&gt;  (lambda (object)&lt;br /&gt;    (let loop ((methods methods))&lt;br /&gt;      (cond ((null? methods) #t)&lt;br /&gt;            ((not (object (car methods))) #f)&lt;br /&gt;            (else (loop (cdr methods)))))))&lt;br /&gt;;;;functon coerce&lt;br /&gt;;;;将对象绑定的若干方法表示为列表，用于调用泛型函数使用&lt;br /&gt;;;;type = symbol list -&gt; procedure list&lt;br /&gt;;;;example. (coerce &#39;car &#39;cdr)&lt;br /&gt;(define (coerce . methods)&lt;br /&gt;  (map (lambda (method) &lt;br /&gt;         (lambda (object . arguments) (apply send object method arguments)))&lt;br /&gt;       methods))&lt;br /&gt;;;;function method&lt;br /&gt;;;;从对象链中查找方法&lt;br /&gt;;;;type = symbol * closure list -&gt; (procedure | false)&lt;br /&gt;;;;example. ((method &#39;car pair)) == (send pair &#39;car)&lt;br /&gt;(define (method symbol . objects)&lt;br /&gt;  (let loop ((protos objects))&lt;br /&gt;    (cond ((null? protos) #f)&lt;br /&gt;          (((car protos) symbol) =&gt; (lambda (x) x))&lt;br /&gt;          (else (loop (cdr protos))))))&lt;br /&gt;;;;macro object&lt;br /&gt;;;;创建对象&lt;br /&gt;;;;syntax = (object (prototypes ...) ((method (arguments ...) body ...) ...))&lt;br /&gt;;;;example. (send (object () ((one () 1)))) &#39;one) == 1&lt;br /&gt;(define-syntax object&lt;br /&gt;  (syntax-rules ()&lt;br /&gt;    ((_  (prototypes ...) ((method-name (arguments ...) body ...) ...))&lt;br /&gt;     (lambda (m)&lt;br /&gt;       (case m&lt;br /&gt;         ((method-name) (lambda (arguments ...) body ...)) ...&lt;br /&gt;         (else (apply method m (list prototypes ...))))))))&lt;br /&gt;;;;macro thunk&lt;br /&gt;;;;用于延迟绑定&lt;br /&gt;;;;syntax = (thunk object)&lt;br /&gt;;;;example. (thunk 0)&lt;br /&gt;(define-syntax thunk&lt;br /&gt;  (syntax-rules () ((_ x) (lambda () x))))&lt;br /&gt;;;;;macro object2&lt;br /&gt;;;;上述“macro object”的 rich 版本&lt;br /&gt;;;;syntax = (object2 self (prototype-news ...) ((slot value) ...) ((method (arguments ...) body ...) ...) init ...)&lt;br /&gt;;;;example. &lt;404&gt;&lt;br /&gt;(define-syntax object2;define&lt;br /&gt;  (syntax-rules ()&lt;br /&gt;    ((_ self (prototype-news ...) ((slot value) ...) ((method (arguments ...) body ...) ...) init ...)&lt;br /&gt;     (letrec ((slot value) ...&lt;br /&gt;              (self &lt;br /&gt;               (lambda (m)&lt;br /&gt;                 (case m&lt;br /&gt;                   ((method) (lambda (arguments ...) body ...)) ...&lt;br /&gt;                   (else (let loop ((protos (list (prototype-news (lambda () self)) ...)))&lt;br /&gt;                           (cond ((null? protos) #f)&lt;br /&gt;                                 (((car protos) m) =&gt; (lambda (x) x))&lt;br /&gt;                                 (else (loop (cdr protos))))))))))&lt;br /&gt;       init ... self))))&lt;br /&gt;;;;object top-object2&lt;br /&gt;;;;用于继承树的根节点&lt;br /&gt;(define (top-object2 this)&lt;br /&gt;  (object2 self () () ((init () (this)))))&lt;br /&gt;;;;function new&lt;br /&gt;;;;用来构造一个对象&lt;br /&gt;(define (new class . arguments)&lt;br /&gt;  (define self (apply send (class (thunk self)) &#39;init arguments))&lt;br /&gt;  self)&lt;br /&gt;;;;========================= 示例部分 ============================&lt;br /&gt;&lt;br /&gt;;;;* 示例一 Pair::mcons&lt;br /&gt;;;;该示例用来演示如何创建一个对象&lt;br /&gt;;;;定义A&lt;br /&gt;(define (mcons0 x y)&lt;br /&gt;  (lambda (m)&lt;br /&gt;    (case m&lt;br /&gt;      ((car) (lambda () x)) &lt;br /&gt;      ((cdr) (lambda () y))&lt;br /&gt;      ((set-car) (lambda (z) (set! x z)))&lt;br /&gt;      ((set-cdr) (lambda (z) (set! x z)))&lt;br /&gt;      ((-&gt;pair) (lambda ()(cons x y)))&lt;br /&gt;      (else #f))))&lt;br /&gt;;;;定义B&lt;br /&gt;(define (mcons x y)&lt;br /&gt;  (object ()&lt;br /&gt;          ((car () x)&lt;br /&gt;           (cdr () y)&lt;br /&gt;           (set-car (z) (set! x z))  &lt;br /&gt;           (set-cdr (z) (set! y z)) &lt;br /&gt;           (-&gt;pair () (cons x y)))))&lt;br /&gt;;;;泛型&lt;br /&gt;(define (mcar mpair)&lt;br /&gt;  ((mpair &#39;car))) &lt;br /&gt;(define (mcdr mpair) &lt;br /&gt;  ((mpair &#39;cdr))) &lt;br /&gt;(define (set-mcar mpair obj)&lt;br /&gt;  ((mpair &#39;set-car) obj))&lt;br /&gt;(define (set-mcdr mpair obj)&lt;br /&gt;  ((mpair &#39;set-cdr) obj))&lt;br /&gt;(define (mpair-&gt;pair mpair)&lt;br /&gt;  ((mpair &#39;-&gt;pair)))&lt;br /&gt;;;;使用&lt;br /&gt;(let example-1 ()&lt;br /&gt;  (define x (mcons 1 2))&lt;br /&gt;  (display (mcdr x))&lt;br /&gt;  (newline))&lt;br /&gt;&lt;br /&gt;;;;* 示例二 sequence&lt;br /&gt;;;;该示例用来演示接口和泛型的使用&lt;br /&gt;(define sequence? (interface &#39;car &#39;cdr))&lt;br /&gt;(define (mlist . objects) &lt;br /&gt;  (if (null? objects) &#39;() &lt;br /&gt;      (mcons (car objects) (apply mlist (cdr objects)))))&lt;br /&gt;(define (for-each0 p lst)&lt;br /&gt;  (cond ((null? lst) &#39;())&lt;br /&gt;        (else (p (car lst)) (for-each p (cdr lst)))))&lt;br /&gt;(define (mfor-each p lst)&lt;br /&gt;  (cond ((null? lst) &#39;())&lt;br /&gt;        (else (p (mcar lst)) (mfor-each p (mcdr lst)))))&lt;br /&gt;(define (generic-for-each prod lst car cdr)&lt;br /&gt;  (cond ((null? lst) &#39;())&lt;br /&gt;        (else (prod (mcar lst)) (generic-for-each prod (mcdr lst) car cdr))))&lt;br /&gt;(define (mrange start end step)&lt;br /&gt;  (letrec ((self (object()&lt;br /&gt;                        ((car () start)&lt;br /&gt;                         (cdr () (let ((x (+ (send self &#39;car) step)))&lt;br /&gt;                                   (if (cond ((&gt; step 0) (&lt;= start x end)) &lt;br /&gt;                                             ((&lt; step 0) (&gt;= start x end))&lt;br /&gt;                                             (else (error &quot;mrange&quot;)))&lt;br /&gt;                                       (mrange x end step) &#39;())))))))&lt;br /&gt;    self))&lt;br /&gt;(let example-2 ()&lt;br /&gt;  (define x (mlist 1 2 3 4 5))&lt;br /&gt;  (mfor-each display x)&lt;br /&gt;  (display (sequence? x))&lt;br /&gt;  ;(mfor-each display (mrange 0 10 2))&lt;br /&gt;  ;(generic-for-each display (mrange 0 10 2) mcar mcdr)&lt;br /&gt;  (apply generic-for-each display (mrange 0 -10 -3) (coerce &#39;car &#39;cdr))&lt;br /&gt;  (newline))&lt;br /&gt;&lt;br /&gt;;;;* 示例三 slots&lt;br /&gt;;;;该示例用来演示构造器和私有成员&lt;br /&gt;(define (box x)&lt;br /&gt;  (letrec ((value &#39;())&lt;br /&gt;           (self (object()&lt;br /&gt;                        ((ref () value)&lt;br /&gt;                         (set! (x) (set! value x))&lt;br /&gt;                         (add! (x) (send self &#39;set! (+ x (send self &#39;ref))))))))&lt;br /&gt;    (set! value x)&lt;br /&gt;    self))&lt;br /&gt;(let example-3 ()&lt;br /&gt;  (define x (box 1))&lt;br /&gt;  (display (send x &#39;ref))&lt;br /&gt;  (send x &#39;set! 2)&lt;br /&gt;  (display (send x &#39;ref))&lt;br /&gt;  (send x &#39;add! 2)&lt;br /&gt;  (display (send x &#39;ref))&lt;br /&gt;  (newline))&lt;br /&gt;&lt;br /&gt;;;;* 示例四 inheritance&lt;br /&gt;;;;该示例用来演示扩充一个类&lt;br /&gt;(define (mlist2 . objects)&lt;br /&gt;  (define super (apply mlist objects))&lt;br /&gt;  (define self&lt;br /&gt;    (object (super)&lt;br /&gt;            ((for-each (prod) (apply generic-for-each prod self (coerce &#39;car &#39;cdr))))))&lt;br /&gt;  self)&lt;br /&gt;(let example-4 ()&lt;br /&gt;  (define x (mlist2 1 2 3 4 5))&lt;br /&gt;  (mfor-each display x)&lt;br /&gt;  (send x &#39;for-each display)&lt;br /&gt;  (newline))&lt;br /&gt;&lt;br /&gt;;;;* 实例五 virtual/override&lt;br /&gt;;;;该示例用来演示模板方法模式&lt;br /&gt;(let example-5 ()&lt;br /&gt;  (define (hello name)&lt;br /&gt;    (letrec((self &lt;br /&gt;             (object ()&lt;br /&gt;                     ((name () (name))&lt;br /&gt;                      (say () (for-each display (list &quot;hello &quot; (send self &#39;name) &quot;!\n&quot;)))))))&lt;br /&gt;      self))&lt;br /&gt;  (send (hello (lambda () &quot;world0&quot;)) &#39;say)&lt;br /&gt;  (define (hello-world)&lt;br /&gt;    (define super (hello (lambda () (send self &#39;name))))&lt;br /&gt;    (define self (object (super) ((name () &quot;world1&quot;))))&lt;br /&gt;    self)&lt;br /&gt;  (send (hello-world) &#39;say)&lt;br /&gt;  (define (hello2 this)&lt;br /&gt;    (object ()&lt;br /&gt;            ((name () &quot;&lt;null&gt;&quot;)&lt;br /&gt;             (say () (for-each display (list &quot;hello &quot; (send (this) &#39;name) &quot;!\n&quot;))))))&lt;br /&gt;  (define (hello-world2)&lt;br /&gt;    (define self &lt;br /&gt;      (object&lt;br /&gt;       ((hello2 (thunk self))) &lt;br /&gt;       ((name () &quot;world2&quot;))))&lt;br /&gt;    self)&lt;br /&gt;  (send (hello-world2) &#39;say)&lt;br /&gt;  (define (hello-world3)&lt;br /&gt;    (define self &lt;br /&gt;      (object2 self (top-object2 hello2) ()&lt;br /&gt;               ((name () &quot;world3&quot;))))&lt;br /&gt;    self)&lt;br /&gt;  (send (hello-world3) &#39;say)&lt;br /&gt;  (define (hello-world4 this)&lt;br /&gt;    (define self &lt;br /&gt;      (object2 self (top-object2 hello2) () &lt;br /&gt;               ((name () &quot;world4&quot;))))&lt;br /&gt;    self)&lt;br /&gt;  (send (new hello-world4) &#39;say)&lt;br /&gt;  (newline))&lt;br /&gt;&lt;br /&gt;;;;待续 一种Scheme语言中基于消息传递的面向对象机制 下 -- 使用模式&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----小改动，直接放在下面了----&lt;br /&gt;不过话说这样更像Java而不是OCaml了。。。&lt;br /&gt;&lt;br /&gt;(define-syntax object3;define&lt;br /&gt;  (syntax-rules (using method)&lt;br /&gt;    ((_ ((method-name (arguments ...) body ...) ...))&lt;br /&gt;     (lambda (m)&lt;br /&gt;       (case m&lt;br /&gt;         ((method-name) (lambda (arguments ...) body ...)) ...&lt;br /&gt;         (else #f))))&lt;br /&gt;    ((_ super class using (traits ...) self ((slot value) ...) method ((method-name  (arguments ...) body ...) ...))&lt;br /&gt;     (letrec ((super (class (lambda () self)))&lt;br /&gt;              (slot value) ...&lt;br /&gt;              (self &lt;br /&gt;               (lambda (m)&lt;br /&gt;                 (case m&lt;br /&gt;                   ((method-name ) (lambda (arguments ...) body ...)) ...&lt;br /&gt;                   (else (let loop ((protos (list super (traits (lambda () self)) ...)))&lt;br /&gt;                           (cond ((null? protos) #f)&lt;br /&gt;                                 (((car protos) m) =&gt; (lambda (x) x))&lt;br /&gt;                                 (else (loop (cdr protos))))))))))&lt;br /&gt;       self))&lt;br /&gt;    ((_ super class self ((slot value) ...) method ((method-name  (arguments ...) body ...) ...))&lt;br /&gt;     (_ super class using () self ((slot value) ...) method ((method-name  (arguments ...) body ...) ...)))&lt;br /&gt;    ((_ super class self method ((method-name  (arguments ...) body ...) ...))&lt;br /&gt;     (_ super class using () self () method ((method-name  (arguments ...) body ...) ...)))   &lt;br /&gt;    ))&lt;br /&gt;(define (root this)&lt;br /&gt;  (object3 ((init () (this)))))&lt;br /&gt;(define (new class . arguments)&lt;br /&gt;  (define self (class (thunk self)))&lt;br /&gt;  (apply send (class (thunk self)) &#39;init arguments)&lt;br /&gt;  self)&lt;br /&gt;(define (hello-world6 this)&lt;br /&gt;    (object3 super root using (hello2) self () method &lt;br /&gt;             ((init () (send super &#39;init))&lt;br /&gt;              (name () &quot;world6&quot;)&lt;br /&gt;               (say1 () (send (this) &#39;say)))))&lt;br /&gt;(send (new hello-world6) &#39;say1)&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;这样下去，干脆定义一个define-class算了。。。&lt;br /&gt;用super表示父类（只有一个父类）this表示子类的对象，self表示当前类的对象。&lt;br /&gt;这样好像把问题弄得复杂一下子就全部放在表面的问题。&lt;br /&gt;由于用的是R5RS的“高级”“卫生”宏/语法，所以功能上有较多约束，不过有这些约束写起来还是更清爽了一些。&lt;br /&gt;----&lt;br /&gt;补充，感觉还是让object语法“小”一些比较好，多父类的判断可以移到语法宏的外面。&lt;br /&gt;此外，多个原型也可以在子类中选择的调用，即不止一个spuer代表某个原型吧。&lt;br /&gt;恩，其实OCaml里的对象是作为一种结构来实现的，要类型的话让闭包返回类型的联合也成吧。&lt;br /&gt;嘛，这里也没多说清楚是怎么回事情，不过就是再补充一下了。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/5681204549277438835/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/5681204549277438835' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/5681204549277438835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/5681204549277438835'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/04/scheme.html' title='一种Scheme语言中基于消息传递的面向对象机制 上 -- 语言机制'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-8689804849488157152</id><published>2012-04-06T17:04:00.012+08:00</published><updated>2012-04-09T12:43:31.135+08:00</updated><title type='text'>堆文的恶趣味</title><content type='html'>曾一直有断断续续地写些篇幅较短的小说作为娱乐，文字多为含含糊糊的叙述描写，风格大多只是为了体现某些方面趣味，内容有时语无伦次。&lt;br /&gt;现在想这种趣味不能使得写出的文字有什么质量，不过缺失这种趣味的话，又觉得没什么自己来写的必要了。&lt;br /&gt;既然定位于自娱自乐了，那么发扬之前的趣味来继续扩展一些，并学习一点新的趣味增添其中，还是一件蛮有趣味的事情吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味一 信息流动&lt;br /&gt;&lt;br /&gt;即严格地在文本的阅读顺序中控制读者对整个故事知道什么，以怎样的顺序知道哪些事实，以及不同的事实之间存在着何种关联。&lt;br /&gt;这就像有的侦探小说或者电影在观众的脑海里留下许多零散的画面片段，但是又巧妙的串联在一起，使得故事呈现出一种立体感。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味二 情节和叙述两条线索&lt;br /&gt;&lt;br /&gt;故事情节本身是一条线索，而故事表现出来的是另一条线索，即叙事线和情节严格的分为两条线来处理。&lt;br /&gt;叙事线本身也是一个有开端有发展有结局的故事，不过这个故事是作为叙述来使用的，而故事本身仍然是真正的故事情节本身。&lt;br /&gt;通常来说可以用“寻找”“回忆”“失忆”“表现/真相”“历史/现实”这样的行为动机来构成表面的叙事线索。&lt;br /&gt;一般让读者在读完整个故事后，能够在自己的脑海中补完一条连续的情节线出来，这个时候让叙事线淡化。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味三 故事的情节以设定来代替叙事&lt;br /&gt;&lt;br /&gt;这个是关于情节构思方面的，即在构思的时候注重整理故事中的各个事件间的关联和关系，之间的影响以及是关于主题或话题的哪个方面的观点和视角。&lt;br /&gt;并不一定要说情节就是构思发生的某个故事那样的，而是说情节本身是一种事实一种为了内容的需要而产生的一种设定。&lt;br /&gt;文本故事性和趣味性可以通过叙事线来加强，而真正要讲述的故事本身是一多角度立体感的存在。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味四 人物的行为动机和人物间的影响&lt;br /&gt;&lt;br /&gt;整个叙述过程之中，一直围绕着人物的自身行动的动机来展开，即由于人物自身的某种目的来进行行动来构成故事。&lt;br /&gt;通常可以众多人物各自的行动都作为动机来推动叙事，并且人物之间的互动会使得各自的行动的动机发展并互相产生影响。&lt;br /&gt;这种人物自身的动机的发展，是用来交代真正的情节线的一个很重要的手段，并且人物间的互动也是很主题之间相关的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味五 叙事按照场景来划分，简化结构&lt;br /&gt;&lt;br /&gt;按照场景来划分，每个场景有固定的发生的环境（固定的也可以是运动的，是整体即可），有场景参与的人物。&lt;br /&gt;每个场景考虑交代了那些事实，又对叙事起到了怎样的推动作用，整个故事文本便通过这样若干场景以某种较为简单的结构构成。&lt;br /&gt;本身已经已经在叙事线和情节线上够折腾的了，所以以场景构成的叙事线就一定要简单明了，并尽可能的简化。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味六 人物细腻的情感&lt;br /&gt;&lt;br /&gt;故事的主题与话题是一方面，是作为文本的内容存在。而叙述的表现力是主要注重在人物的情感方面，包括人物对于自身，对于他人，对于现实，对于曾经所发生过的事情的看法观点态度情绪等等方面来作为故事所展现的风景的载体。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味七 世界观和历史观&lt;br /&gt;&lt;br /&gt;整个故事的发生环境，简单的说就是非现实世界的日常故事。&lt;br /&gt;即发生的环境可以是架空的，可以是科幻或奇幻，以及适合于适合于情节的在某种规则制约下的世界。不过就情节本身而言，要尽可能的呈现出一种属于日常的平平常常的故事那样的故事。&lt;br /&gt;背景是明显虚构的，但是要让故事本身有种真实的在这个背景下发生着的样子，人物有各自的信仰和社会角色，而不是一个单薄的存在。&lt;br /&gt;这个世界有其过去发生过去的事情，人们知道的事情，将来要面对的事情。每个人物也有过去的故事，这个过去的会成为他面对他人时的一个要素。&lt;br /&gt;不同人物的过去现在以及未来都有交织的可能性，这种交织和发展，成为了故事的一个重要的叙事方式。&lt;br /&gt;到底人物线怎么使用，是平行还是主次还是轮换还是其他的混合方式，这在实际运用中有发挥的余地。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味八 景色和对话&lt;br /&gt;&lt;br /&gt;景色和对话都是很有表现力的情节叙述方式，不过要避免因为使用得不得当而造成地情节不明了或叙述的错乱。&lt;br /&gt;景色和对话都是很适合让人物敞开心扉讲述属于他自己的故事的这样一种场景，用一种敞开心扉的态度来让人物和观众都作为一种读者的立场存在。&lt;br /&gt;情节和对话也都是很容易用来推动情节的，侧重于用景色和对话来讲述真正的情节线即可。运用对话中的情绪和对话参与者间关于事实的互动来推动叙述。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味九 人物和读者的立场&lt;br /&gt;&lt;br /&gt;让叙事线里的主角和读者都置于去获得整个故事的一种身份的这样一种一致的立场上。&lt;br /&gt;明确在叙事之中考虑不同的人物各自找到什么以及读者知道什么，这样的信息与事实的传递会影响到整个故事的叙事过程中的每个人物（包括读者）的立场和动机。&lt;br /&gt;当然不能限定死了读者的身份是怎样的，需要给读者自身存在感容纳和参与的众多余地。叙事线和情节线是一个方面，不过读者的整个阅读过程也是重要的体验与参与的过程，并同时有着旁观和亲历者的双重身份。这也是之前划分出单独的叙事线出来的一个理由所在。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味十 人物的性格刻画&lt;br /&gt;&lt;br /&gt;这是需要的，很是需要的。有抽象的说是某类属性的人物，也有具体说是经历的哪些事情认识哪些人物以及对它们都有什么身份和态度来构成的一个人物。&lt;br /&gt;不过性格特征明显一些的话人物就要容易辨认得多，这样也让情节的叙述明朗许多。&lt;br /&gt;虽然个人很想在淡化情节和运用设定来展现情感方面寻找些许趣味，不过人物方面不小心就路人了的感觉。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味十一 节奏和音乐的氛围&lt;br /&gt;&lt;br /&gt;其实就是指氛围了，在表面平淡的场景之中，有一种持续的氛围所笼罩，通常是抒情性的，还是不错的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味十二 以故事来讲述对故事的看法&lt;br /&gt;&lt;br /&gt;比如这里对于文本的趣味说了好些个人的喜好，其实这些喜好是可以通过一个具体的小说来展现出来，而不是这里通过文字的形式来说它是什么。&lt;br /&gt;也就是说，故事文本是用来讲述对故事或者对于主题的一个多方面的审视的存在。既在以某种叙事方式讲述着一个故事，并同时以这样的一个故事表达着对于故事本身以及对于故事的叙述的方式的的一种看法。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味十三 故事的主题&lt;br /&gt;&lt;br /&gt;这个通常老套一点就行了。比如成长友谊感情什么听起来乐观有趣鼓舞人心的的东西都可以。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 趣味十四 短篇形式的篇幅&lt;br /&gt;&lt;br /&gt;一个单独的完整的小故事即可，视角小些篇幅和情节都简化指留明了的主线相关物，然后故事也要有立体感。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 其他的补充&lt;br /&gt;&lt;br /&gt;看需要在补充吧。以上内容并没有好好的构思，只是想到什么然后就列为一点写下来了，也不知太片面或者考虑的不周全。&lt;br /&gt;既然是作为一篇随手写写记录记录的东西，自己明知要改动的话可以让内容在明了和完整些许吧。&lt;br /&gt;不过这里仅仅是流水的记录，记录下当前先想到的一些趣味的可能性，然后就不再继续，就暂且写到这里了吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-----&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;叙述之间从高潮部分插入，既故事一开始就是某个事件正在高潮的部分。然后再把故事具体的展开。这样先尽可能把把故事涉及的话题的全貌展示出来，然后再具体地增加立体感。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/8689804849488157152/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/8689804849488157152' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8689804849488157152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8689804849488157152'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/04/blog-post.html' title='堆文的恶趣味'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-9148789421535400814</id><published>2012-03-24T11:05:00.008+08:00</published><updated>2012-03-24T12:37:55.841+08:00</updated><title type='text'>本想写篇心情日记的</title><content type='html'>早上在床上被窝里缩了好久一直没起来，在这个安静的早晨里，感觉可以让脑子安静地去想象身边和周围的事情，于是就忽然有了有话说的感觉。如果刷微博的话确实是只言片语就了，不过想到咱是或许把微博更多地作为一个沟通和记录来用的话，在那种轻浮感之中来写日记只是觉得心里空荡荡的。于是还是起来打开电脑写写日志好了。&lt;br /&gt;以上便是开场，然后正文什么的本该是继续写下去的。不过等到洗完澡抚摸着键盘的时候，却又感到自己变得拘谨起来。所谓心情这种东西，一方是源于自己的心里的想法，一方面也是出于对自身情境的掩饰。就像乐观有时不是因为对结果的肯定，而是因为有可为结果所做的行动并获得可预计的回报；就像悲观有时不是因为能力的不足或意外的挫折，而是因为有时对风险的一种自我保护中需要一种推脱的借口。于是其中重要的事情便变成了是在做出怎样的一种行为，而所谓心情什么的就只变成了行为的表现方式的一种附属物了。&lt;br /&gt;所以说什么是满足什么是奢望，各自又会对应着什么样的行为，这是一件很微妙的事情。那些觉得一无是处不思进取的行为，或许就是值得骄傲并足以信赖的伙伴呢。并且在这同时可以再有一份心态，去创造机遇迎接变化便是了。&lt;br /&gt;或许过多的折腾只是改变了塑料瓶的的形状，压缩了它的体积让水看起来可以满一些，不过可能其实水却流失了。空或满的感官对于结果而言只是参照，心情对于言语亦只是想法与心态的婉转表达，原本想到的那些思绪还是不打算具体地写成什么了。&lt;br /&gt;这里，大体就写这些了。&lt;br /&gt;&lt;br /&gt;https://twitter.com/#!/LennaHammer/status/183384888844632064</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/9148789421535400814/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/9148789421535400814' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/9148789421535400814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/9148789421535400814'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/03/blog-post.html' title='本想写篇心情日记的'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-1149737910405255393</id><published>2012-02-17T21:58:00.009+08:00</published><updated>2012-02-17T23:26:20.056+08:00</updated><title type='text'>存活确认</title><content type='html'>看了一下后台“编辑帖子”列表，里面有好多写废了的文，或者认为不适合发布的内容。&lt;br /&gt;它们有的是开了个标题没写的，有的是涉及私事的，有的内容太幼稚的，有的在别处贴过的，有的涉及18x内容。&lt;br /&gt;内容有长有短，目前帖数是占据了公开帖数的三分之一了，和生活里的经历一起，构成了海平面下的冰川。&lt;br /&gt;最近是习惯在本地用文本编辑器编辑来再发出来，不知道那里还有什么写废的东西没。&lt;br /&gt;&lt;br /&gt;不过自己都知道是些写废的或者不愿意贴出来的东西，在这里说出来看起来也没什么意义。&lt;br /&gt;现在看大多数的博客或者日志之类都是想他人展现自己，一个积累并分享价值的一个平台吧。&lt;br /&gt;不过，咱这里呀，咱是完全当一个私人空间来看待，当作一个自言自语的地方了。&lt;br /&gt;甚至比推特微博之类的地方还要清静的感觉，一个可以容忍着自己继续幼稚或者犯傻的地方。&lt;br /&gt;&lt;br /&gt;那些曾经想回避的话题，在这个草稿箱里依然是难寻踪迹。如果将来遗忘了，那就可能是真的永远的遗忘了。那些其中经历的不愉快，那些其中收获的快乐，或许有那么一天，将会永远的消失在记忆的深处了吧。&lt;br /&gt;&lt;br /&gt;此刻，就总能想到一个孤单的身影呢。&lt;br /&gt;一个人孤单的裹在被子里的小男孩，伸出头来，数着窗外天空里的那片星星。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;久久，这里就没留下过什么了，这大概是荒废了吧。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;回想过去的这半年——&lt;br /&gt;奶奶病倒了，目前语言和记忆都受到印象，有些事情我这里先记着吧，暂时不写了。&lt;br /&gt;准备了一场考试，可惜自己太没有勇气了，总是缩手缩脚的，这样可不行。&lt;br /&gt;虽然最主要的事情便是忙这考试了，可以如果未达到的目的话，这半年的意义也就不明显了。&lt;br /&gt;不过期间也看了一些书了，也算是有所收获吧，于是也可以欣慰一些。&lt;br /&gt;坑了一个Scheme实现，初步实现了大体的功能，然后就一直坑着了。&lt;br /&gt;UUShare关闭了，几年记忆的实物就这么消失了，谢谢河马的最后时刻备份。&lt;br /&gt;开始用小号玩着推特和微博，谢谢啊七和河马的在使用上的帮助，留下点足迹。&lt;br /&gt;在KeyFc申请了版主，详情以后写，算有点经历和想法吧，可惜自己不珍惜便被退了。&lt;br /&gt;写了两篇文，一篇Clannad的同人当论坛活动，参与了一篇Key同人剧本，以后整理过来吧。&lt;br /&gt;推了些许游戏和小说和动漫，不过进度都很慢来着。&lt;br /&gt;现在想来，这些折腾的意义如何，也不甚明了了。&lt;br /&gt;可是毕竟半年的时光过去了，就这样原原本本的写下来吧。&lt;br /&gt;想做到很多事情，可是又无能为了，或者不愿去做，然后增加了许多烦恼吧。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;想象近几天习惯了用刷推特微博来消磨时间了，大概也出于自身在很多方面无能为力的失落感吧。&lt;br /&gt;这样便觉得自己所作的都是毫无意义，然后便对未来有了无助恐慌和害怕作出任何的事情了。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/1149737910405255393/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/1149737910405255393' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/1149737910405255393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/1149737910405255393'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/02/blog-post.html' title='存活确认'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-6956429995018719768</id><published>2012-01-01T14:25:00.015+08:00</published><updated>2012-02-24T16:24:57.079+08:00</updated><title type='text'>几个感觉不错的应用</title><content type='html'>很水的一帖，翻了翻手机和硬盘，看看有什么好玩的东西。。。&lt;br /&gt;* Stranded 一个孤岛生存类游戏，Win32&lt;br /&gt;http://stranded.unrealsoftware.de/s2_infos.php&lt;br /&gt;* RogueLight 很有冒险感觉的的rogue游戏，Win32&lt;br /&gt;http://gamejolt.com/freeware/games/rpg/roguelight/1425/&lt;br /&gt;* POWDER 一个地图紧凑的图形rogue游戏，按键少，PC/Mobile&lt;br /&gt;http://www.zincland.com/powder/&lt;br /&gt;* QDict Android平台的字典 &lt;br /&gt;http://mail.ustc.edu.cn/~wchao911/&lt;br /&gt;* MDict WM平台的字典 &lt;br /&gt;http://www.octopus-studio.com/&lt;br /&gt;* Cool Reader 简洁强大的电子书阅读器，Android平台&lt;br /&gt;http://coolreader.org/e-index.htm&lt;br /&gt;* MX Video Player Android上的视频播放器，媒体管理功能真心不错，自动生成列表记录媒体是否播放过播放到哪里&lt;br /&gt;http://sites.google.com/site/mxvpen/&lt;br /&gt;* RepliGo Reader Android上性能和不错的PDF阅读器，支持书签重排笔记&lt;br /&gt;http://www.cerience.com/products/reader/&lt;br /&gt;* Harmony 一个DOOM2的同人，怀旧感，Win32&lt;br /&gt;http://www.rabotik.nl/&lt;br /&gt;* Scratch 教学与原型的创造力，PC&lt;br /&gt;http://scratch.media.mit.edu/&lt;br /&gt;* AlReader 以前在WM手机上用的&lt;br /&gt;http://www.alreader.com/&lt;br /&gt;* TCPMP/CorePlayer 以前在WM手机上用的&lt;br /&gt;http://corecodec.com/products/coreplayer/&lt;br /&gt;* 云端 Win32上的应用虚拟化分发应用，还在用0.9版&lt;br /&gt;http://yunduan.cn/&lt;br /&gt;* RocketDock 放在桌面右边，然后把桌面图标关了&lt;br /&gt;PuzzleCollectionPortable 一堆桌面解谜游戏&lt;br /&gt;http://www.chiark.greenend.org.uk/~sgtatham/puzzles/&lt;br /&gt;* BTLocal 貌似能用的搜索辅助工具&lt;br /&gt;* minijoe 看着玩玩&lt;br /&gt;http://code.google.com/p/minijoe/&lt;br /&gt;* onscripter nscripter的开源实现，多平台&lt;br /&gt;* wintersweet Win32上挺方便的字典&lt;br /&gt;* dunwich 看着玩玩&lt;br /&gt;http://marijnhaverbeke.nl/dunwich/&lt;br /&gt;* Clark Productions 一个Basic的rogue游戏&lt;br /&gt;http://users.freebasic-portal.de/rdc/programs.html&lt;br /&gt;* MPlayer 必备&lt;br /&gt;* 魔王录 有格子感的动作要素淡化的动作游戏 &lt;br /&gt;* 金庸群侠传console_rpg 字符游戏的感觉还挺不错的&lt;br /&gt;http://code.google.com/p/flaswf/source/browse/trunk/JYtrpgYDZS/?r=223&lt;br /&gt;* Notepad++ 文本编辑器，加tagview插件&lt;br /&gt;* 简易三国志2 增强版  文本界面游戏？&lt;br /&gt;http://ishare.iask.sina.com.cn/f/11573234.html&lt;br /&gt;* everything 我已经不记得文件在哪个目录里了&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;OHRRPGCE&lt;br /&gt;http://en.wikipedia.org/wiki/OHRRPGCE&lt;br /&gt;monster2&lt;br /&gt;http://www.nooskewl.com/node/29/&lt;br /&gt;Gravity Bone&lt;br /&gt;http://blendogames.com/&lt;br /&gt;WinFF - Free Video Converter&lt;br /&gt;http://winff.org/html_new/&lt;br /&gt;漂亮同人堂&lt;br /&gt;http://www.acgmix.net/web/index.htm&lt;br /&gt;Simon Tatham&#39;s Portable Puzzle Collection&lt;br /&gt;http://www.chiark.greenend.org.uk/~sgtatham/puzzles/&lt;br /&gt;rocksndiamonds&lt;br /&gt;http://www.artsoft.org/rocksndiamonds/&lt;br /&gt;Ori, Ochi, Onoe&lt;br /&gt;http://games.renpy.org/game/o3.shtml&lt;br /&gt;StorytellingAlice&lt;br /&gt;scummvm&lt;br /&gt;leidao&lt;br /&gt;mldonkey&lt;br /&gt;mplayer&lt;br /&gt;Audacity</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/6956429995018719768/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/6956429995018719768' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6956429995018719768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6956429995018719768'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2012/01/blog-post.html' title='几个感觉不错的应用'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-7454324998474736154</id><published>2011-11-20T16:00:00.004+08:00</published><updated>2012-03-30T22:13:54.459+08:00</updated><title type='text'>简易Roguelike制作流程【转/待译】</title><content type='html'>原文地址：&lt;a href=&quot;http://roguebasin.roguelikedevelopment.org/index.php/How_to_Write_a_Roguelike_in_15_Steps&quot;&gt;roguebasin.roguelikedevelopment.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How to Write a Roguelike in 15 Steps&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is a rough route map for the creators of roguelikes. I&#39;m well aware that there are many possible routes and that no two journeys are the same -- this is a description of one of possibilities and maybe will help you to plan your own.&lt;br /&gt;Please add your comments -- maybe we could make this article really helpful. What are your own routes?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Contents&lt;br /&gt;1 Step 1 - Decide to write a game&lt;br /&gt;2 Step 2 - Hello world!&lt;br /&gt;3 Step 3 - It&#39;s a boy!&lt;br /&gt;4 Step 4 - The map&lt;br /&gt;5 Step 5 - Saving/Loading&lt;br /&gt;6 Step 6 - It&#39;s alive! Alive!&lt;br /&gt;7 Step 7 - Interaction&lt;br /&gt;8 Step 8 - Data files&lt;br /&gt;9 Step 9 - Items&lt;br /&gt;10 Step 10 - Magic&lt;br /&gt;11 Step 11 - Simple game&lt;br /&gt;12 Step 12 - Levels&lt;br /&gt;13 Step 13 - Experience&lt;br /&gt;14 Step 14 - Citizens&lt;br /&gt;15 Step 15 - Free at last&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 1 - Decide to write a game&lt;br /&gt;&lt;br /&gt;Most of you will have this step behind you already, but there are some hints about the direction of the first step. The best reason to start developing your own roguelike game is to create a game that you will enjoy playing yourself.&lt;br /&gt;Don&#39;t start by asking around about the definition of roguelike game -- you don&#39;t need it. If the game you write is not considered roguelike by others, but it&#39;s still fun to play for you -- you succeeded. It&#39;s not like there&#39;s some kind of a contest to write a game meeting certain specifications.&lt;br /&gt;Don&#39;t plan too much. Of course, if you want certain things in your game, you must write it so that there is room for them -- but don&#39;t even try to anticipate everything -- it&#39;s just impossible. When you write a design doc, you make a lot of decisions. Most of the decisions can&#39;t be made without performing some test first -- usually by writing small programs utilizing given feature. It&#39;s best to make the decisions when your project has already reached appropriate stage -- when you don&#39;t need to write an additional program, because your project already has everything you need.&lt;br /&gt;It&#39;s no fun to just proceed according to plan -- leave some space for improvisation. Don&#39;t be afraid about making mistakes or implementing something in an inflexible way -- you can improve it when you need it -- most of the time it will be ok.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2 - Hello world!&lt;br /&gt;&lt;br /&gt;Prepare your programming environment. Choose your language and platform, choose appropriate compilers/interpreters, editor, version control, automated build, and other utilities. Set them up so that you&#39;re comfortable with them.&lt;br /&gt;Decide on which libraries you&#39;re going to use -- it can change later, but it&#39;s usually a painful change. Don&#39;t think too much about portability -- it can be fixed later. Think about what you need and what you&#39;re comfortable with.&lt;br /&gt;Decide on the language you want to write comments and object names in your code, as well as the language you want to be used in your game. It&#39;s strongly recommended to use English in your source code -- you can get more help this way from others.&lt;br /&gt;Don&#39;t worry about i18n yet; translation is usually a very late step in the development process.&lt;br /&gt;Write a simple &#39;Hello world!&#39; program and test whether it works. Test your libraries, etc. -- you don&#39;t want any surprises.&lt;br /&gt;Start coding.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 3 - It&#39;s a boy!&lt;br /&gt;&lt;br /&gt;Start with screen output and keyboard input. Decide preemptively on your screen layout (easy, you can change it later) and make the routines that display map characters, status lines and messages.&lt;br /&gt;Make the routine to read key-presses (no config files, no keys redefinition).&lt;br /&gt;Make a &#39;@ walking around the empty screen&#39; demo. Play with it a little, clean things up, play some more, imagining the game is finished and you&#39;re playing it.&lt;br /&gt;Make the message handling routines -- especially for the debugging messages -- they come in handy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 4 - The map&lt;br /&gt;&lt;br /&gt;Decide on your map structure. Don&#39;t over-generalize -- you can add things later. Make your (empty) map displayed on the screen. Scrolled if you need it. Add some elements to your map to see if they are displayed correctly (just hard-code them, you don&#39;t need a level generator yet).&lt;br /&gt;Make your &#39;@&#39; appear on the map -- not as it&#39;s element at first, just as a cursor. Test the scrolling, maybe make a &#39;look&#39; command.&lt;br /&gt;Now turn &#39;@&#39; into creature. You still don&#39;t have time implemented, so the keyboard-reading routines will just move it around the map. Include the checks for walls in the movement code. Maybe add doors and open/close commands.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 5 - Saving/Loading&lt;br /&gt;&lt;br /&gt;Read the map from a file instead of hard-coding it. You can play with it and test different configurations if you make it human-readable from the start.&lt;br /&gt;Add the &#39;save&#39; command and the procedures to save your game -- the map at first, then, gradually, all of other game elements. From now on, when you implement something that needs saving, also implement saving it as soon as possible.&lt;br /&gt;Here&#39;s a handy article about save files and how to implement them; it&#39;s worthwhile to read when planning ahead what form you&#39;ll save things in.&lt;br /&gt;Once you work with files, you can make your preferences and keybindings config files. Again, if you make them human-readable, you&#39;ll save yourself a lot of trouble.&lt;br /&gt;Now, when you&#39;re not sure how any element of the game works, you can save the game to a file and just check it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 6 - It&#39;s alive! Alive!&lt;br /&gt;&lt;br /&gt;Implement other creatures (monsters) and time. Add a single monster to begin with. Give him some simple AI (like, say, stay still, or maybe move randomly).&lt;br /&gt;Start with my turn-your turn, then implement the time system you want (or, usually, a simplification of it and gradually make it more complicated later).&lt;br /&gt;Remember to test everything as you go.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 7 - Interaction&lt;br /&gt;&lt;br /&gt;Add stats for your creatures. A simplification of the ones you envisioned, probably. It&#39;s best to add stats as they are needed, not because they &#39;look cool&#39;, but you might not be able to resist ;).&lt;br /&gt;Make the creatures notice each other -- bump, attack, etc. Gradually improve their AIs, so that they can chase the player.&lt;br /&gt;Implement and test the combat system -- without equipment for now, just hardcode the values. Do lots of testing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 8 - Data files&lt;br /&gt;&lt;br /&gt;Move the creature, map features, etc. definitions to data files. Forget about scripting for now If something cannot be moved -- just leave it for now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 9 - Items&lt;br /&gt;&lt;br /&gt;Add items. For start, just objects you can pick up -- no properties. Gradually give them properties, kinds, stats, etc., implement inventory, picking up and dropping, equipping and using (no effects yet), also stacking, containers (if you want them), etc.&lt;br /&gt;This step usually requires lots of testing to balance.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 10 - Magic&lt;br /&gt;&lt;br /&gt;Add item effects, special monster attacks, spells. Add items and monsters to test them. You don&#39;t need all the possible effects right away, just the ones that are needed for the next step.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 11 - Simple game&lt;br /&gt;&lt;br /&gt;Try to make a simple, hard-coded game. Play it and give it to your friends. Test the mechanics you&#39;ve implemented so far. See if the game is fun.&lt;br /&gt;Change everything you need to change. Don&#39;t forget to test a lot. Always ask someone to test the game&#39;s &#39;fun factor&#39;, or test it yourself after a while; it&#39;s hard to notice some things right away.&lt;br /&gt;This step should take a pretty long time, until you&#39;ve got a playable, fun mini-game.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 12 - Levels&lt;br /&gt;&lt;br /&gt;Write your level generators. Implement moving between the levels, a wilderness and/or town if you want them, saving the levels on level change if you want them to be persistent (so that they don&#39;t take up memory).&lt;br /&gt;Spread your monsters and items on different depths. Add more monsters and items, with their effects, as needed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 13 - Experience&lt;br /&gt;&lt;br /&gt;Start developing your experience system and skill system. Tune the monsters&#39; and items&#39; stats. Make character generation screen, classes, races, and whatever else you need.&lt;br /&gt;Playtest your game frequently.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 14 - Citizens&lt;br /&gt;&lt;br /&gt;Add NPCs, shopkeepers, and simple quests if you need them. Keep adding features and tuning the stats.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 15 - Free at last&lt;br /&gt;&lt;br /&gt;Start adding and testing all the &#39;unique&#39; features you thought were so cool months (years?) ago, when you started the whole thing. Revise your opinions of them and see if they fit the game.&lt;br /&gt;Write your pet random plot generator, factions system, infinite wilderness generator, neural network AI, or other unique feature, since you can now test it in a working game.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Original version submitted to rec.games.roguelike.development by Radomir &#39;The Sheep&#39; Dopieralski</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/7454324998474736154/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/7454324998474736154' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/7454324998474736154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/7454324998474736154'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/11/how-to-write-roguelike-in-15-steps.html' title='简易Roguelike制作流程【转/待译】'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-6713959884112265696</id><published>2011-11-20T15:14:00.006+08:00</published><updated>2011-11-20T15:38:38.902+08:00</updated><title type='text'>算24【备份】</title><content type='html'>以前写过，不过这次应该代码好看些了吧。&lt;br /&gt;&lt;blockquote&gt;#!python2&lt;br /&gt;from itertools import *&lt;br /&gt;from operator import *&lt;br /&gt;calc24 = lambda a,b,c,d:list(set(sum((&lt;br /&gt;(o(p(i,q(j,k)),l)==24 and [&quot;(%s%s(%s%s%s))%s%s&quot;%s] or [])+&lt;br /&gt;(o(i,p(q(j,k),l))==24 and [&quot;%s%s((%s%s%s)%s%s)&quot;%s] or [])+&lt;br /&gt;(o(i,p(j,q(k,l)))==24 and [&quot;%s%s(%s%s(%s%s%s))&quot;%s] or [])+&lt;br /&gt;(o(p(i,j),q(k,l))==24 and [&quot;(%s%s%s)%s(%s%s%s)&quot;%s] or [])+&lt;br /&gt;(o(p(q(i,j),k),l)==24 and [&quot;(((%s%s%s)%s%s)%s%s)&quot;%s] or [])&lt;br /&gt;for nums,opp in [((a,b,c,d),(add,sub,mul,lambda x,y:truediv(x,y) if y else float(&#39;nan&#39;)))]&lt;br /&gt;for j,i,k,l in permutations(nums) for o,p,q in product(opp,repeat=3)&lt;br /&gt;for r in [dict(zip(opp,(&quot;+&quot;,&quot;-&quot;,&quot;*&quot;,&quot;/&quot;)))] for s in [(i,r[o],j,r[p],k,r[q],l)]),[])))&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&gt;&gt;&gt; calc24(6,6,6,6)&lt;br /&gt;[&#39;6+((6+6)+6)&#39;, &#39;(((6+6)+6)+6)&#39;, &#39;(6+(6+6))+6&#39;, &#39;(6+6)+(6+6)&#39;, &#39;(((6-6)-6)*6)&#39;, &#39;(6-6)*(6+6)&#39;, &#39;6+(6+(6+6))&#39;]&lt;br /&gt;&gt;&gt;&gt; calc24(2,3,8,9)&lt;br /&gt;[&#39;(8/(9*3))-2&#39;, &#39;8/(2/(9-3))&#39;, &#39;8*(9-(2*3))&#39;, &#39;8*((9/3)-2)&#39;, &#39;(((9*3)/2)-8)&#39;, &#39;(8*2)/(9-3)&#39;, &#39;(((9/3)*8)-2)&#39;, &#39;(9/3)-(2/8)&#39;, &#39;(9*3)-(8/2)&#39;, &#39;8*(9-(3*2))&#39;, &#39;(9*(3-2))*8&#39;, &#39;(9*(2-3))*8&#39;]&lt;/blockquote&gt;&lt;br /&gt;下面这个考虑了交换律的重复。故意写个很累赘的样子，&lt;br /&gt;而且为了吻合IEEE还把mapcan和format等等都替换了一下。&lt;br /&gt;&lt;blockquote&gt;(define (calc24 a b c d)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (flat-map p x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply append (map p x)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (filter p x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((null? x) &#39;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((p (car x)) (cons (car x) (filter p (cdr x))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (filter p (cdr x)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (drop-one x lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((null? lst) &#39;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((equal? x (car lst)) (cdr lst))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (cons (car lst) (drop-one x (cdr lst))))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (perm lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (null? lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;(())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(flat-map &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (y) (cons x y))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(perm (drop-one x lst))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (pow lst n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (zero? n) &#39;(())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(flat-map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (y) (cons x y))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(pow lst (- n 1))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lst)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (buld-exp num ops)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (i j k l)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (o p q)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`(,o (,p ,i ,j) (,q ,k ,l))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;`(,o (,p ,i (,q ,j ,k)) ,l)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ops))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (eval-exp exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (list? exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((arg (map eval-exp (cdr exp)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(/ (lambda (x y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (zero? y) +nan.0 (/ x y)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(case (car exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((+) (apply + arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((-) (apply - arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((*) (apply * arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((/) (apply / arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((--) (apply - (reverse arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((//) (apply / (reverse arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error &quot;op?&quot;))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exp))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (show-exp exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(define (bin-op-str op arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply (lambda (x y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(string-append &quot;(&quot; x op  y &quot;)&quot;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (x) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (number? x) (number-&gt;string x) x)) arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (list? exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((arg (map show-exp (cdr exp)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(/ (lambda (x y) (if (zero? y) +nan.0 (/ x y)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(case (car exp)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((+) (bin-op-str &quot;+&quot; arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((-) (bin-op-str &quot;-&quot; arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((*) (bin-op-str &quot;*&quot; arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((/) (bin-op-str &quot;/&quot; arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((--) (bin-op-str &quot;-&quot; (reverse arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((//) (bin-op-str &quot;/&quot; (reverse arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error &quot;op?&quot;))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exp))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (unique lst)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (null? lst) &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cons (car lst) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unique &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(filter (lambda (x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(not (equal? x (car lst)))) lst)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(unique&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(flat-map &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(flat-map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(flat-map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (z)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (= 24 (eval-exp z))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list (show-exp z))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;())) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(buld-exp x y)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(pow &#39;(+ - * / -- //) 3))) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(perm (list a b c d)))))&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;(calc24 2 3 8 9)&lt;br /&gt;(&quot;(((9-3)/2)*8)&quot; &quot;(8/(2/(9-3)))&quot; &quot;((8/2)*(9-3))&quot; &quot;((9-3)/(2/8))&quot; &quot;((9-3)*(8/2))&quot; &quot;((8*(9-3))/2)&quot; &quot;((9-(2*3))*8)&quot; &quot;((9-(3*2))*8)&quot;)&lt;br /&gt;(calc24 6 6 6 6)&lt;br /&gt;(&quot;((6+6)+(6+6))&quot; &quot;((6+(6+6))+6)&quot; &quot;((6*6)-(6+6))&quot; &quot;(((6*6)-6)-6)&quot;)&lt;/blockquote&gt;&lt;br /&gt;更多的不同语言写的可以看这个：&lt;br /&gt;http://rosettacode.org/wiki/24_game/Solve&lt;br /&gt;&lt;br /&gt;乱如备份下平时在npp里面用来插入行首空格的东西。&lt;br /&gt;能用，不过貌似可能会干出多余的事情来，比如不仅仅是行首的情况。&lt;br /&gt;另外使用前务必先用一下npp自带的转义&amp;amp; &amp;lt; &amp;gt; &amp;quot;的菜单命令。&lt;br /&gt;&lt;blockquote&gt;editor.pyreplace(r&quot;^ &quot;, r&quot;&amp;#38nbsp;&quot;)&lt;br /&gt;def s():editor.pysearch(r&quot;&amp;#38nbsp; &quot; ,lambda x,y:rp())&lt;br /&gt;def rp():editor.pyreplace(r&quot;&amp;#38nbsp; &quot;, r&quot;&amp;#38nbsp;&amp;#38nbsp;&quot;) and False or s()&lt;br /&gt;s()&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;如果要变成算24的游戏的话，还要一个随机数生成，和表达式计算的东西。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/6713959884112265696/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/6713959884112265696' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6713959884112265696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/6713959884112265696'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/11/24.html' title='算24【备份】'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-2611064168293129980</id><published>2011-11-19T23:26:00.003+08:00</published><updated>2011-11-19T23:43:24.956+08:00</updated><title type='text'>存活确认</title><content type='html'>觉得blogger最近登录不便，所以这段时间有点当长文回收的地方在用了。暂且不说有多少内容，仅仅是那堆放腾起的尘埃，也够让自己呛一阵的。不过其实呢，既然这里作为一个自己感到自在的地方，也不必总太多估计。可以有一些过程中的，不成熟的，零时的，盲目的，白痴的想法也写出来。因为作为结果而言，至少是作为一个暂且还达不到的，或者没有做到的事情来说，其中的过程也是不可欠缺的。缺少了或者说完全的抛弃了愚昧的状态，却反而回避很多需要的或者说感到满足或欣喜的结果的话，失去和得到的就不是同一事物的不能层面，而是皆至于无的状态了。所以，在这里，还是来发帖确认一下成活吧。以前烦了很多傻了，以后还是会继续来犯傻，同时再多展示一些令人欣慰的事情吧。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/2611064168293129980/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/2611064168293129980' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2611064168293129980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2611064168293129980'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/11/blog-post.html' title='存活确认'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-3572860452812642743</id><published>2011-10-25T23:04:00.005+08:00</published><updated>2011-10-25T23:31:04.095+08:00</updated><title type='text'>【怀旧向】关于ASCII风格Game的简单尝试 Part-I</title><content type='html'>堆了一个大体的框架，暂时没有实在的内容，还需要进一步抽象出可供不同数据复用的类型和模型出来。&lt;br /&gt;目前是用一个修改版的TinyScheme做解释器，增加了平台实现相关的clrscr、inkey（=getch）、exit三个用于终端界面的函数。&lt;br /&gt;为了以后移植方便，语言特性限定在IEEE和R5RS的最小子集的交集。&lt;br /&gt;即无eval且call/cc只能局部跳出用，并只用到最基本的两种数字类型。&lt;br /&gt;&lt;br /&gt;本来在别处写了一点说明和注释，价值不大就不搬过来了。&lt;br /&gt;代码这里合并为单文件。&lt;blockquote&gt;(define (require name)&lt;br /&gt;  ;(push! *loaded*)&lt;br /&gt;  (load (string-append (symbol-&gt;string name) &quot;.ss&quot;)))&lt;br /&gt;&lt;br /&gt;;;;=====(load &quot;core.ss&quot;)=====&lt;br /&gt;(define (filter pred list)&lt;br /&gt;  (cond&lt;br /&gt;    ((null? list) &#39;())&lt;br /&gt;    ((pred (car list)) &lt;br /&gt;     (cons (car list) (filter pred (cdr list))))&lt;br /&gt;    (else (filter pred (cdr list)))))&lt;br /&gt;(define (curry fun . args)&lt;br /&gt;          (lambda x&lt;br /&gt;            (apply fun (append args x))))&lt;br /&gt;(define (assert ture . msgs)&lt;br /&gt;  (if (not ture) (begin (for-each (lambda (x) (display x)) msgs) (error))))&lt;br /&gt;  &lt;br /&gt;;;;=====(require &#39;util)=====&lt;br /&gt;(define (wait-key)&lt;br /&gt;  (define (co key-map)&lt;br /&gt;    (define (co lst)&lt;br /&gt;      (cons&lt;br /&gt;       (char-downcase &lt;br /&gt;        (string-ref (symbol-&gt;string (car lst)) 0))&lt;br /&gt;       (cadr lst)))&lt;br /&gt;    (map co key-map))&lt;br /&gt;  (define key-map&lt;br /&gt;    (co &#39;((w u)(s d)(a l)(d r)(z a)(x b)(c s))))&lt;br /&gt;  (let loop ()&lt;br /&gt;    (cond&lt;br /&gt;      ((assoc (inkey) key-map)&lt;br /&gt;       =&gt;(lambda (x) (if x (cdr x) (loop)))))))&lt;br /&gt;;;;key-test&lt;br /&gt;;(clrscr)&lt;br /&gt;;(let loop ()&lt;br /&gt;; (let ((c (inkey))) &lt;br /&gt;;  (display (char-&gt;integer c)) &lt;br /&gt;;  (newline) &lt;br /&gt;;  (loop)))&lt;br /&gt;&lt;br /&gt;;;;=====(require &#39;view)=====&lt;br /&gt;(define (dispatch-&gt;callable host)&lt;br /&gt;  (define (object message . args)&lt;br /&gt;    (apply (host message) args))&lt;br /&gt;  object)&lt;br /&gt;&lt;br /&gt;;;;choose:a modal scene&lt;br /&gt;(define (ui-choose msg . items)&lt;br /&gt;  (define (show vec cur)&lt;br /&gt;    (define cur (modulo cur (vector-length vec)))&lt;br /&gt;    (clrscr)&lt;br /&gt;    (display msg)&lt;br /&gt;    (newline)&lt;br /&gt;    (do ((i 0 (+ i 1))) ((= i (vector-length vec)) 1)&lt;br /&gt;      (display (if (= i cur) &quot; * &quot; &quot;   &quot;))&lt;br /&gt;      (display (vector-ref vec i))&lt;br /&gt;      (newline))&lt;br /&gt;    (let ((k (wait-key)))&lt;br /&gt;      (case k&lt;br /&gt;        ((u) (show vec (- cur 1)))&lt;br /&gt;        ((d) (show vec (+ cur 1)))&lt;br /&gt;        ((a) (+ cur 1))&lt;br /&gt;        (else (show vec cur)))))&lt;br /&gt;  (show (list-&gt;vector items) 0))&lt;br /&gt;;(display (ui-choose &quot;where to go?&quot; &quot;walk&quot; &quot;eat&quot; &quot;sleep&quot;))&lt;br /&gt;&lt;br /&gt;;;;(int*int-&gt;())-&gt;(symbol-&gt;procedure)&lt;br /&gt;(define (make-movable call-with-this-new-position)&lt;br /&gt;  (define position (list 0 0))&lt;br /&gt;  (define (position-ref)&lt;br /&gt;    position)&lt;br /&gt;  (define (position-copy)&lt;br /&gt;    (append position))&lt;br /&gt;  (define (position-set! x y)&lt;br /&gt;    (set-car! position x)&lt;br /&gt;    (set-car! (cdr position) y))&lt;br /&gt;  (define (move dx dy)&lt;br /&gt;    (let ((new-x (+ dx (car position)))&lt;br /&gt;          (new-y (+ dy (cadr position))))&lt;br /&gt;      ;;tail-rec/cps&lt;br /&gt;      (call-with-this-new-position this new-x new-y)))&lt;br /&gt;  (define (dispatch message)&lt;br /&gt;    (case message&lt;br /&gt;      ((position-ref) position-ref)&lt;br /&gt;      ((position) position-copy)&lt;br /&gt;      ((position-set!) position-set!)&lt;br /&gt;      ((put) position-set!)&lt;br /&gt;      ((move) move)&lt;br /&gt;      (else (error message))))&lt;br /&gt;  (define this (dispatch-&gt;callable dispatch))&lt;br /&gt;  this)&lt;br /&gt;;;;ui-display-map&lt;br /&gt;(define (map-view-display width height call-with-char-position)&lt;br /&gt;  (do ((y 0 (+ y 1))) ((= y height))&lt;br /&gt;    (do ((x 0 (+ x 1))) ((= x width))&lt;br /&gt;      (let ((chr (call-with-char-position x y)))&lt;br /&gt;        (if (or (not chr) (null? chr))&lt;br /&gt;            (display &quot;.&quot;)&lt;br /&gt;            (display chr))))&lt;br /&gt;    (display &quot;\n&quot;)))&lt;br /&gt;;;;with-system-mune&lt;br /&gt;(define (input-and-move move)&lt;br /&gt;  (case (wait-key)&lt;br /&gt;    ((u) (move +0 -1))&lt;br /&gt;    ((d) (move +0 +1))&lt;br /&gt;    ((l) (move -1 +0))&lt;br /&gt;    ((r) (move +1 +0))))&lt;br /&gt;;;assoc-all&lt;br /&gt;(define (assoc-all obj alist) &lt;br /&gt;  (let ((f (filter (lambda (x) (equal? (car x) obj)) alist)))&lt;br /&gt;    (if (null? f) #f f)))&lt;br /&gt;;;make-pos-list&lt;br /&gt;(define (pos-list-of-strs map-data)&lt;br /&gt;  &#39;(demo-data&lt;br /&gt;    (&quot;##....###&quot; &lt;br /&gt;     &quot;#.$.....#&quot;&lt;br /&gt;     &quot;#.....@.#&quot;&lt;br /&gt;     &quot;#.$..####&quot;))&lt;br /&gt;  (let loop ((x 0) (y 0) (w 0) (h 0)(it map-data) (ret &#39;()))&lt;br /&gt;    (cond&lt;br /&gt;      ((null? it)&lt;br /&gt;       (cons (list w h) ret));return this&lt;br /&gt;      ((= x (string-length (car it))) &lt;br /&gt;       (loop 0 (+ y 1) (max x w) (+ h 1) (cdr it) ret))&lt;br /&gt;      ((equal? (string-ref (car it) x) #\.) &lt;br /&gt;       (loop (+ x 1) y w h it ret))&lt;br /&gt;      (else&lt;br /&gt;       (loop (+ x 1) y w h it &lt;br /&gt;             (cons (list (list x y) (string-ref (car it) x)) ret))))))&lt;br /&gt;;;;pos-list&lt;br /&gt;(define (make-pos-list string-list-data)&lt;br /&gt;  (define _ (pos-list-of-strs string-list-data))&lt;br /&gt;  (define (dispatch message)&lt;br /&gt;    (case message&lt;br /&gt;      ((width) &lt;br /&gt;       (lambda () (caar _)))&lt;br /&gt;      ((height) &lt;br /&gt;       (lambda () (cadar _)))&lt;br /&gt;      ((data-ref)&lt;br /&gt;       (lambda ()(cdr _)))&lt;br /&gt;      (else (error message))))&lt;br /&gt;  (dispatch-&gt;callable dispatch))&lt;br /&gt;;;;=====(require &#39;view2)=====&lt;br /&gt;&lt;br /&gt;;;;=====(require &#39;data)=====&lt;br /&gt;(define (make-state)&lt;br /&gt;  (define alist-data (list))&lt;br /&gt;  (define (dispatch message)&lt;br /&gt;    (case message&lt;br /&gt;      ((get) &lt;br /&gt;       (lambda (key)&lt;br /&gt;         (cond ((assoc key alist-data)=&gt;(lambda (x) (cdr x)))(else #f))))&lt;br /&gt;      ((put)&lt;br /&gt;       (lambda (key value)&lt;br /&gt;         (let ((ptr (assoc key alist-data)))&lt;br /&gt;           (if ptr (set-cdr! ptr value)&lt;br /&gt;               (set! alist-data (cons (cons key value) alist-data))))))&lt;br /&gt;      ((save) &lt;br /&gt;       (lambda (file)&lt;br /&gt;         (call-with-output-file file&lt;br /&gt;           (lambda (port)&lt;br /&gt;             (write alist-data port)))))&lt;br /&gt;      ((load) &lt;br /&gt;       (lambda (file) &lt;br /&gt;         (call-with-input-file file&lt;br /&gt;           (lambda (port)&lt;br /&gt;             (let ((sexp (read port)))&lt;br /&gt;               (if (eof-object? sexp)&lt;br /&gt;                   (set! alist-data (list))&lt;br /&gt;                   (set! alist-data sexp)))))))&lt;br /&gt;      (else (error message))))&lt;br /&gt;  dispatch)&lt;br /&gt;;;;=====(require &#39;deprecate)=====&lt;br /&gt;&lt;br /&gt;;;;=====(require &#39;main)=====&lt;br /&gt;;;;make-map-modelA&lt;br /&gt;&lt;br /&gt;;;;one map&lt;br /&gt;(define (show-map-scene5)&lt;br /&gt;  (define (map-event p x y)&lt;br /&gt;    (cond&lt;br /&gt;      ((assoc (list x y) (filter (lambda (x) (eqv? #\$ (cadr x))) map-objs))&lt;br /&gt;       (clrscr)&lt;br /&gt;       (display &quot;hello world&quot;)&lt;br /&gt;       (inkey))&lt;br /&gt;      ((assoc (list x y) map-objs)&lt;br /&gt;       =&gt;(lambda (x) &#39;()))&lt;br /&gt;      (else (p &#39;put x y)))&lt;br /&gt;    (map-loop))&lt;br /&gt;  (define p (make-movable map-event))&lt;br /&gt;  (define budr1 (make-pos-list &lt;br /&gt;                 &#39;(&quot;......................&quot;&lt;br /&gt;                   &quot;.......#.......#......&quot;&lt;br /&gt;                   &quot;..........#......$....&quot;&lt;br /&gt;                   &quot;.....$................&quot;&lt;br /&gt;                   &quot;.............#........&quot;&lt;br /&gt;                   &quot;......#...............&quot;&lt;br /&gt;                   &quot;...............#......&quot;&lt;br /&gt;                   &quot;........#.....#.......&quot;)))&lt;br /&gt;  (define map-objs&lt;br /&gt;    (cons &lt;br /&gt;     (list (p &#39;position-ref) &quot;@&quot;)&lt;br /&gt;     (budr1 &#39;data-ref)));map this&lt;br /&gt;  (define (map-char-of-pos x y);map-show     make this simpler&lt;br /&gt;    (let ((lst (assoc-all (list x y) map-objs)));map-objs&lt;br /&gt;      (if (not lst) &quot;.&quot; (cadr (car lst)))))&lt;br /&gt;  (define (map-loop)&lt;br /&gt;    (clrscr)&lt;br /&gt;    (display &quot;[map]\n&quot;)&lt;br /&gt;    (map-view-display (budr1 &#39;width) (budr1 &#39;height) map-char-of-pos)&lt;br /&gt;    (input-and-move (curry p &#39;move)))&lt;br /&gt;  (map-loop))&lt;br /&gt;(show-map-scene5)&lt;br /&gt;&lt;br /&gt;(exit)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;参考代码：&lt;br /&gt;http://www.zincland.com/powder/&lt;br /&gt;http://roguebasin.roguelikedevelopment.org&lt;br /&gt;http://users.freebasic-portal.de/rdc/programs.html&lt;br /&gt;http://marijnhaverbeke.nl/dunwich/&lt;br /&gt;http://www.cs.cmu.edu/Groups/AI/lang/scheme/code/fun/advent.scm&lt;br /&gt;&lt;br /&gt;等之后有空的时间来安排一个剧本来写完整吧，最近不会继续打理这个了。&lt;br /&gt;上面说的东西是在自娱自乐，能够用来开心一下就目的达成。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/3572860452812642743/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/3572860452812642743' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3572860452812642743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3572860452812642743'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/10/asciigame-part-i.html' title='【怀旧向】关于ASCII风格Game的简单尝试 Part-I'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-3761603142144028491</id><published>2011-09-05T01:43:00.002+08:00</published><updated>2011-09-08T21:54:42.585+08:00</updated><title type='text'>【挖一挖】关于文化娱乐方面的 Part-A</title><content type='html'>* 【挖一挖】&lt;br /&gt;来写一些有印象的文化娱乐类的东西吧。&lt;br /&gt;&lt;br /&gt;* Mario&lt;br /&gt;偏向SFC的Super Mario World，玩法比之前丰富了，手感一如既往优秀。不同的关卡间有不同的主题和风格（话说有几个外传关卡变化得很牵强，但是SMW就感觉有亮点和贴切）顺便说下个人是非常不喜欢Zelda系列，每次攻击的时候感觉浑身不自在。&lt;br /&gt;&lt;br /&gt;* FFTA&lt;br /&gt;顺便把整个FF系列也在这里说了，首先抱怨下对FF战斗系统的不满，就是始终不适应（我知道100%逃跑是故意的）。另一个不满就是不停地跑存档点有时候会感觉到单调和无聊了，整个游戏玩法的亮点不断（对玩法和设定上亮点的期待和满足是件很有乐趣的感觉，不然就是重复刷关了）不过流程的整体感觉得有些分散了。估计是由于制作人的不同，系列中不同的风格有很强的辨识感的，所以这里在集中说下FF5和FF6吧。FF5的感觉是和伙伴一起在世界上闯关冒险的意思，一路上培养职业并利用能力的特性和属性来类似于动作游戏闯关一般去迷宫或城堡（路很简单，但是要注意敌人出现的种类和方式）里找Boss（FF向来100%逃跑率，并支持低等级去打Boss）。战斗是动态的，杀起血来也很快，如果所准备的战斗配备和战术安排不当的话，不会死撑太长时间（有时第一趟就是去送死的）。并且练级只是和副职业有关，主职业是可以自由转职的，这让战斗可以关注于当前的战斗本身。整个游戏过程被Boss划分为一个个区域，每个部分都是一个单独的关卡，强制流程使得战斗和情节都有节奏的进行着并在不同的关卡里面展示出不同的模式和玩法。有难度的同时，具有了乐趣和挑战性。不过FF5里面情节是串联作用了，紧凑有趣而不在于带入感什么的。至于FF6的战斗个人就觉得玩不来，而情节模式和表现方式方面则代表了随后的几款FF。FF6里情节是按照区域来展开的，每个区域里面有完整的流程，并有侧重的内容和一个大的目标。这样并不一定是走路Boss的模式了，而有可能有一些子任务或者阶段。跑路方面FF6比FF5麻烦一些，感觉像拖时间。由于情节是按照区域和类似于章节的形式来组织的，所以在表现的方式上相比之前要丰富了。战斗上面的亮点在于装备技能然后用熟练度记住技能，不过战斗本身我是觉得拼技能（这比等级重要）了，战斗上面每个职业（人物是固定职业）有不同的操作方式（不过其目的是代入感，但是对发挥战术有麻烦），有些地雷很拖慢节奏。情节上的一个亮点是刻画群像，利用人物间的经历相互补充、影响、团结，使得故事的展开显示出了立体感，并有了暗示核战争之类的意思。不过就是从比较开场和整个游戏过程，个人还是偏爱于FF5的叙事节奏和动作过关的感觉。至于后来的从FF7开始，有了CG动画，这是一种用镜头运用（焦点和位置）和场景调度构成的新的表达方式。特别是在FF8中丰富的镜头语言来增加画面的表现力。后来的FFX算是人物刻画和氛围渲染上塑造的更强烈的一作了，整个故事是一个旅途，但是哪怕是仅仅走路和不断穿插的强制时间，都在这种强烈的氛围之下变得有所含义。然后上面还有很强力的音乐没有说到，这个可以单独拿出来说，可惜这里不说了，总之就是很贴合和表现场景和人物。而且虽然上面说了好些牢骚，还是觉得FF的特性太显著和有亮点了，不同于大多数RPG侧重的冒险那一方面的感觉。&lt;br /&gt;那啥标题是FFTA，话说那是因为觉得包括KH:CoM和FFCC的情节走上另一种套路，并且显得更为成熟一些。（例如FFTA是说主角和他们的伙伴们在生活中各有各不顺心的地方，然后在幻想世界里通过彼此的交锋，又以新的心态开始真正的生活。）在这几个游戏中，情节的表现是侧重于玩家知道什么和主角和其他角色们知道什么。情节是通过角色们的互动表现出来的，而不需要在这个进展的流程中让设定好的事件本身有如何的发展。角色被置于魔法科技的世界之中，让角色的身份、角色的经历、角色的性格成为了情节存在的方式，通过角色间信息和态度的发展和一个相当明显的强制人物线来推动情节的进行，和对某个或若干个关键词的表现里。让战斗成为交代人物关系和控制情节节凑的方式，在带入感方面比以往的FF要更加强烈一些，试图通过玩家控制角色的活动方式来影响玩家对整个情节的认识和情绪的渲染积蓄和迸发。主题方面侧重于了真实、记忆、梦想、愿望，这些属于个人方面的，而在先前的主题上如和平、友情、亲情、爱情、抗争、命运（还有水晶、多世界和故事年表中的环，以及女主必然公主，主角必然对其有好感）有所淡化。顺便说下FFT的几个相关作品的战斗模式很有亮点，注重节奏的同时，又控制住了节奏使得适合发挥策略。&lt;br /&gt;说到水晶，FF1里有说，这是魔法的来源，FF6之后也会以魔石（前者是天然的，这个是合成的）的形态出现。在主题上，水晶代表目标、力量和欲望。&lt;br /&gt;更多见www.ffsky.com那里的一些专题和讨论吧。&lt;br /&gt;&lt;br /&gt;* Breath of Fire II&lt;br /&gt;正好和FF互补，满足下个人喜好的另一面。章节式情节，每段有侧重的角色和地图。地雷用自动战斗，并注重地图机关的策略和Boss战的判断。亮点是路人NPC的对话也成为了交代情节的一部分，可以补充事件背景，可以来体现人物间的态度。整个故事情节和交予玩家的行动选择亦是用来体现此的。游戏中事件不是属于地图，而是某时刻在地图上发生，这样有了参与到人物任务事件的感觉，并且连续发生的一段情节也不会让事件点显得突兀，使得角色的行动不是为了触发情节而是成为了情节的一部分。&lt;br /&gt;&lt;br /&gt;* 特鲁尼克大冒险&lt;br /&gt;战斗很有亮点，系统也很丰富（魔法，地图属性，伙伴、宠物...），不多说了。顺便说下GBA上有几个战斗不错的游戏，战略类如鬼武者幽游白书公主同盟，还有几个即时控制多兵力一起玩的，还有在即使的行动中融入RPG的感觉的（例如思考数值上的行为寻则什么的）。&lt;br /&gt;&lt;br /&gt;* Pokemon&lt;br /&gt;战斗就是走过场，不过真的很有代入感。在那个时间里去各自认识了更多的人并获得了PM和徽章。&lt;br /&gt;&lt;br /&gt;* 吾国吾民&lt;br /&gt;林语堂的文字是很喜欢的，不过目前这个小说金华烟云还没看过，它是设定在一个立场摇摆的特殊年代。从一些短篇的散文中，一直可以觉得林的文字中对生活场景的描写充满着的情感的，十分具有杀伤力。说到小说的话，我这里有淡化情节而去关注到文字和写法的想法，因为情节可以仅看作故事设定的一个附属物。文字显得比鲁迅（写作入门用）要贴近读者些。《京华烟云》的电视剧渲染出来了面朝朦胧的未来去寻求的气氛。&lt;br /&gt;&lt;br /&gt;* 五星饭店(?)&lt;br /&gt;高中时候考到的电视剧，侦破、恋爱、成长多种要素被结合到了一起。不过让我印象最为深刻的是该电视剧的叙事方式，有一些段落着重关键的场景铺成大量的对话（类似于独白，因为是个人主导的）然后跳跃掉连接的行动的过程，也也一些段落没有对话完全依靠风景和镜头运动来体现时间轴的变动并体现出人物那时候的想法。情节是采取意外经历然后等级清零的处理，主题是关于真实与去做什么的事情，信息的细节的悬念穿梭全剧。&lt;br /&gt;&lt;br /&gt;* 情书 &lt;br /&gt;是岩井俊二的小说和电影，这里说的是小说，平实的叙述推动着一幕幕的场景的发展。故事由藤井树的意外作为开端，以渡边博子和同名女生藤井树各种的生活和来往的信件作为发展，信件里回忆起了死去的藤井树的学生生活。在回想之中让一段逝去的经历变得清晰，变得真相和情感一直在那里，却一直没有旁人来察觉。人们在行动中探索者未来，同时也在明白着现在的由来。过去发生的事情并没有改变，而只是过去不可能一层事件的表象，当一个发生的事件阻隔在现在和过去的时候，一切的所为都被固定在一个有限的范围之中，去打开思绪外的一片世界。话说自己对看起来像是水面一样反射着表象却由于故事的发展充满了运动的态势的文字完全没有免疫力。&lt;br /&gt;&lt;br /&gt;* 东方快车谋杀案&lt;br /&gt;一直想能够看完阿加莎·克里斯蒂的全部作品，每个小说之间有着一致的写法但又每次阅读都能感到惊喜。小说的文本由对话和动作构成，并把内容按章节风格，文本的进行中透过所给的视角的信息不断的引导着读者的关注点，将故事以平稳的叙述化作眼前的一个舞台。读者透过这样的一个戏剧化（冲突和发展，发现真相的过程）的展示面，通过一个充满压力（凶杀案，已经发生的和将可能发生的）的时间和空间里面，去仔细的观察和打量每个人物。线索和行动在故事中进行着，人物间在互动同时也在展现着自身。有时候有动机的不止是一个人，他们都是整个故事背景中的一个视角，代表着一种可能性，是故事中的一个因素而只是没有往这方面发展。但是正是由于各种的可能性，使得这些小说有了更宽广的感觉。故事进行越往后，可能性在发生着收束，同时在放眼于远方的时候视线又忽视眼前灰色的角落，直到真相揭开视角的迷雾才最终散去。此刻恍然大悟，并将可能性组成一个清晰广阔的整体了。目前看过的印象中的还有《无人生还》《底牌》《怪屋》……&lt;br /&gt;&lt;br /&gt;* 电视人·萤&lt;br /&gt;论村上春树的国内出版物中，挪威的森林会较容易的接触到。不过这里是说的是两本短篇小说集，因为这里想要着重展示的其作品中把生活以异常的形态体现出真实的写法。这里举个有些距离的例子，比如轻小说文学少女中学姐经常吃书页有时会让主角写三题然后还吃出甘甜和苦涩来。吃书可以看出人物对文字的一种态度，可以看作是仅仅形容一种程度。但是故事不是把吃书这一行为停留在抽象的意象当中，而是具体地写，作为故事中发生的一件事性来写，当作了故事中理当发生的一件事情来写，以本来仅仅是意象层面的东西变成了一种存在着的真实。将意象具体化，并有由于意象来源于真实，当幻想的意象被放置于一个身边的世界中的时候，起初的突兀感便会转化为对其中真实成分的认同感。意象与真实成为了故事存在的一个支柱，与现代人的时代背景在一起，成为笼罩起整个小说的氛围。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 警世通言&lt;br /&gt;三言的第二本，明朝话本小说，故事题材各异，背景都是中国古代。小说的主题有点强加给人的意味，显得纸片化。不过确实是那时候的生活的展示，比较一些历史小说读起来觉得较贴近人些。并且每篇小说是以故事作为一个载体，传递着其中的主旨愿望和偏好。文字叙述也平易近人，写法上有现实有仙化的。&lt;br /&gt;&lt;br /&gt;* 芥川龙之介&lt;br /&gt;不得不说其短篇小说十分有魅力，大多都是十分压抑的，有让人喘气的压迫感。不要被《竹林中》迷惑了，以为是整个风格的代表。这篇仅仅是扑朔迷离，而不是更常见的对人物心态中的隐藏的一面的冲刷出色彩。虽然说灰色的文字常读不大好，不过他的每一篇小说风格各异的背景设定总能带给人创造力的感觉。故事并不是要发生什么事情，而是可以使得背景设定被展开为立体的存在。不论是真实或是神话，或者是发生来哪里，故事的背景都蕴含着那个世界中冲突的要素将要发展的一个全貌。&lt;br /&gt;&lt;br /&gt;* Wikipedia&lt;br /&gt;作为查阅资料的线索是十分有用的，有词条、词条的关联，以及词条所处的若然分类索引。可以用来建立对已有作品的整体概念，在构建设定的时候也可以作为查阅的资料和初始点。&lt;br /&gt;&lt;br /&gt;* Lucky☆Star&lt;br /&gt;目前自己觉得最耐看的一个漫画/动画，大段大段脑残（被指莫名其妙）的吐槽体现生活中发生过却没有注意到的细节。原作是关于学生的ACG生活的四格欢乐型漫画，每话内的话题是有连续关联的，并体现了不同人物的性格。&lt;br /&gt;&lt;br /&gt;* 寒蝉鸣泣之时&lt;br /&gt;暂且指TV版，游戏版还没动。先来说下类似的动画（后出）的原著（比寒蝉早）。《魍魉之匣》强调的是意外，案件本身没有复杂的手法，但是将同一个背景（二战之后）之下相干和不相干的事情串联在一起，显得扑朔迷离又意味深长。《尸鬼》给吸血鬼故事增加了人的犹豫，当吸血鬼依然能保留生者的思维的时候，它与人类双方的死活就存在态度情感和选择。然后话题回到寒蝉上，推理和多周目是亮点，解释着不同的可能性，同时也有着不会改变的和发生进步的一方面。对话是推动人物之间相了解相关心并团结的突破口，当人物的对话相互敞开的时候，正是胜利的期待放在面前的时候。&lt;br /&gt;&lt;br /&gt;* 云之彼端，约束的地方&lt;br /&gt;新海诚的作品中个人偏爱的一部，有不少第一人称的旁白，设定很抽象概括的感觉。情节方面前作星之声更能明显的体现出用设定来作为情感表达的依托这样的模式，不过这作显得更成熟些，作画和音乐都有明显的作者印记。&lt;br /&gt;&lt;br /&gt;* 寂静岭&lt;br /&gt;这里着重指1代以及电影版，顺便也指整个游戏系列的共同之处。故事的主题即事件的起因，这是故事最后揭开的内容，正是主角继续未来所需要正视的阴影。主角的经历过程，不仅是自己当前的，也是对往事的浮现和建立联系的过程，用探索场景来发现存在的故事。恐怖的来源有往事的幻象和外界宗教组织的压力。游戏玩起来有些累人，电影感觉代表了此类游戏的情节风格了。&lt;br /&gt;同类型游戏零混合了现代都市和传统仪式，情节设定上觉得很有味道，情节展开有一步步回到历史上的某个关键时刻的感觉。&lt;br /&gt;&lt;br /&gt;* 天堂电影院&lt;br /&gt;长镜头很多，用回忆来美化回忆。有关于老者对主角成长的关注，关于Love的遗憾的悠长的曲调。&lt;br /&gt;&lt;br /&gt;* Narcissu&lt;br /&gt;某短篇GalGame，无选项可自动播放，其文字的情感与氛围相当显著。属于和别人在一个同时自己又弥散于两个人的空间里的那种感觉。同类型的有2和120元冬（其他几个季节的不喜欢）。文字有主角自己表达和故事情节发展的对话，看似随意的交融在一起，和声般在秋风里寻求着暖意。&lt;br /&gt;&lt;br /&gt;* Kanon，Air&lt;br /&gt;个人更偏向于Kanon，不过对着两者不是觉得喜欢，而是认可优秀。冬季和夏季的小镇给人的存在感十分强烈，情节中发生在不同地点背景图让人熟悉的这个地方，并了解了这里发生过的事情。形式上是好感度分支进人物线交代的人物的现状，然后在人物线上主角试图去了解人物帮助人物，最终解开了隐藏的心结。选项的设置使得玩家的操作和主角的情绪置于一致（开朗或内敛）然后真心去推人物线。泣系的风格让日常的情节有轻松和欢笑，而当回忆和现实两条线索交织在一起的时候，就释放了人物被能够表达出来的情感。&lt;br /&gt;&lt;br /&gt;* School days&lt;br /&gt;分支设定很神奇，包含两种情感偏向的曲折发展，内容以对话推动故事。用动画和限时选项（把未选算在内）来表现故事，发生着故事各种可能性。在主角的选择中，角色不是等待攻略，而是主动在情节中用行动和言语来影响主角的判断，让六话的情节在角色的互动之中推动着。这种三角形的恋爱故事，通过每一周目的玩家倾向（居然每个角色在情节安排上有引导主角改变倾向的主动行为），也算有带入感吧（像真实之泪那种也是故意纠结于感情方面的故事）。&lt;br /&gt;&lt;br /&gt;* 动漫类&lt;br /&gt;这个写起来就有些乱了，所以这里就不展开写了。鬼泣，豹头王，舞hime，妖精旋律...什么的就归类于此吧（有原作的这里不算在内）。&lt;br /&gt;&lt;br /&gt;* South Park ， The Simpsons ， Futurama&lt;br /&gt;美国动画中的代表，一话一个故事（偶尔有莫名其妙的话），情节紧凑展开让人关注。通常是根据现实中的事情来建立所表达的内容，把事件的争议置于公开来增进各方观点间的交流和改进。&lt;br /&gt;&lt;br /&gt;* 逆转裁判 2&lt;br /&gt;和地图事件型不同的是，体现出了与人物在言语上的对抗，并且有效的控制住了情节进展的节奏。有RPG的战斗感，道具和信息便是武器，在一个言语回合中判断着突破点。此外在地图事件中也体现出了时间的要素，使得每个角色在过程中都是不断行动。情节上说主线有一条人物的态度作为线索的，同时让回忆和未来清晰。GBA上的其他侦探类和它有模式上的差异，柯南侧重限时问答，One是行动决策，Q侦探是触发对话中的关键词。&lt;br /&gt;&lt;br /&gt;* 妹妹公主&lt;br /&gt;指两个TV动画以及GBA上游戏，以个发生的小故事来表达纯粹地想在一起的心愿，选项表示主角的行动和对角色的了解和态度。&lt;br /&gt;&lt;br /&gt;* GalGame&lt;br /&gt;算是一大类型，最近比较适合（节奏相协调的意思）这个，热衷于多周目全结局，以及选项和情节的配合。&lt;br /&gt;&lt;br /&gt;* 补充&lt;br /&gt;想到了一些（或许仅仅是碰巧想到了而已），然后就选择了一些来简介了一下。反映下个人的口味，顺便也算作是推广向文字吧。字数不多内容简略，且有自言自语不知所云的倾向。&lt;br /&gt;话说很喜欢一系列小说和游戏中有相似和相异存在，在较平稳地对期待感的满足时有总是在期待有特别的东西出现。有时故事老套一些没有关系，但是要在意是如何把故事叙述和表现出来的，甚至利用设定来淡化情节线本身。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/3761603142144028491/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/3761603142144028491' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3761603142144028491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3761603142144028491'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/09/part.html' title='【挖一挖】关于文化娱乐方面的 Part-A'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-5247093717925420538</id><published>2011-08-28T20:45:00.011+08:00</published><updated>2011-09-05T01:45:41.510+08:00</updated><title type='text'>【挖一挖】关于PE50的存档</title><content type='html'>* ProjectEuler&lt;br /&gt;&lt;br /&gt;在projecteuler.net，很多小的程序题，可以用来练习键盘指法。限制比较宽松，只要不是很过分，暴力过关也没有关系。&lt;br /&gt;虽说要尽量多用用数学知识来求解吧，不过拿出图灵完备的机器来辅助过关话，其实能算是很正当的方式呦。&lt;br /&gt;高德納学派的可以用ASM，习惯传统方式可以用C++，天书般的J，函数式的Haskell，各种数学计算系统，或者偷懒用用Python，这些都是可以的做法。&lt;br /&gt;既然我这里纯粹是出于娱乐目的的过关而已，就以Python2为主要工具了，也恰巧手头可以使用。&lt;br /&gt;&lt;br /&gt;下面的内容算是流程的记录，这里粘贴在一个页面里而已。当初是正确的得到结果，并且性能可以说得过去，在这里就不再做什么改进了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;话说 Level 1 的内容实在十分基础了，没什么好说的了，下面闪入正文吧。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 1&lt;br /&gt;&lt;br /&gt;print sum(i for i in xrange(1000) if (i%3==0) or (i%5==0))&lt;br /&gt;&lt;br /&gt;这题的较好的做法是用等差数列求和，注意不把项记录重复了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 2&lt;br /&gt;&lt;br /&gt;(let loop ((s 0) (a 1) (b 2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (&amp;gt; b 4000000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (if (even? b) (+ s b) s) b (+ a b))))&lt;br /&gt;&lt;br /&gt;这道题的优化方法是利用数列满足：奇偶奇奇偶奇奇偶奇...来计算。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 3&lt;br /&gt;&lt;br /&gt;(let loop ((x 600851475143) (i 2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (&amp;gt; i (sqrt x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (zero? (remainder x i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (/ x i) i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop x (+ i 1)))))&lt;br /&gt;&lt;br /&gt;偷懒可以用Maxima的factor函数，或者手写用正整数数列不断去除它，最后留下来的就是结果。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 4&lt;br /&gt;&lt;br /&gt;(let loop ((r 0) (i 100) (j 100))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(cond&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((= i 1000) r)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((= j 1000) (loop r (+ i 1) (+ i 1)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let* ((p (* i j))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(s (string-&amp;gt;list (number-&amp;gt;string p))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (if (and (equal? s (reverse s)) (&amp;gt; p r)) p r) i (+ j 1))))))&lt;br /&gt;&lt;br /&gt;纯暴力，考虑了乘法交换积不变。不过这里回文判断实现得大不好，貌似可以推导出什么数学式子。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 5&lt;br /&gt;&lt;br /&gt;(do((i 1 (+ i 1)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(s 1 (lcm s i)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;((&amp;gt; i 20) s))&lt;br /&gt;&lt;br /&gt;最小公倍数的算法貌似是欧几里德发明的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 6&lt;br /&gt;&lt;br /&gt;print sum(i for i in range(101))**2-sum(i**2 for i in range(101))&lt;br /&gt;&lt;br /&gt;又暴力了，不过数列求和有那啥啥公式来着，不知道那些数学软件优化了没。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 7&lt;br /&gt;&lt;br /&gt;(define (prime? x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let loop ((i 2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((&amp;gt; (* i i) x) #t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((zero? (remainder x i)) #f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (loop (+ 1 i))))))&lt;br /&gt;(let loop ((i 2) (n 0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (prime? i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (= n 10000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (+ i 1) (+ n 1)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (+ i 1) n)))&lt;br /&gt;&lt;br /&gt;判断质数，后面会遇到更加丰富的用法的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 8&lt;br /&gt;&lt;br /&gt;import operator&lt;br /&gt;s= ...&lt;br /&gt;print max(reduce(operator.mul,map(int,s[i:i+5])) for i in xrange(len(s)-4))&lt;br /&gt;&lt;br /&gt;又是暴力...题目字面的意思...不说什么了...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 9&lt;br /&gt;&lt;br /&gt;a, b, c = 200, 375, 425&lt;br /&gt;&lt;br /&gt;我才不告诉人家我是慢慢试出来的呢...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 10&lt;br /&gt;&lt;br /&gt;m = 2000000&lt;br /&gt;s = [True] * m&lt;br /&gt;s[0] = False&lt;br /&gt;s[1] = False&lt;br /&gt;for i in xrange(2,m):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not s[i]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while True :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = i * j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s[k] = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j+=1&lt;br /&gt;print sum(i for i,v in enumerate(s) if v)&lt;br /&gt;&lt;br /&gt;传说中的划杠杠法，终于没有出现尾递归...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 11&lt;br /&gt;&lt;br /&gt;from operator import mul&lt;br /&gt;x = [&lt;br /&gt;...&lt;br /&gt;]&lt;br /&gt;def s(r1,r2,d):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return max(reduce(mul,[x[i+d[0]*n][j+d[1]*n] for n in range(4)]) for i in r1 for j in r2)&lt;br /&gt;print max(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s(xrange(0,20-3),xrange(0,20-0),(+1,+0)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s(xrange(0,20-0),xrange(0,20-3),(+0,+1)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s(xrange(0,20-3),xrange(0,20-3),(+1,+1)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s(xrange(0,20-3),xrange(0+3,20),(+1,-1)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&lt;br /&gt;字符串数据源直接拿正则表达式处理了，然后是幸好没差点把尝试的情况和范围弄错掉。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 12&lt;br /&gt;&lt;br /&gt;(define (factor x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let loop ((x x) (i 2) (n 1) (r &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (&amp;gt; i (sqrt x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cons x r)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (zero? (remainder x i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (/ x i) i (+ n 1) (cons i r))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop x (+ i 1) n r)))))&lt;br /&gt;(define (factor-exp x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let ((x (factor x)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let loop ((a (cdr x))(b &#39;())(c (car x))(d 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (null? a)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cons d b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (not (= (car a) c))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (cdr a) (cons d b) (car a) 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (cdr a) b c (+ d 1)))))))&lt;br /&gt;(define (factor-num x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;;(assert (&amp;gt; x 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(apply * (map (lambda (x) (+ x 1)) (factor-exp x))))&lt;br /&gt;(let loop ((s 0)(i 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (&amp;gt; (factor-num s) 500)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (+ s i) (+ i 1))))&lt;br /&gt;&lt;br /&gt;这题暴力的话效率实在不够，只好手疼地用排列组合的知识来优化一下了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 13&lt;br /&gt;&lt;br /&gt;x=[&lt;br /&gt;...&lt;br /&gt;]&lt;br /&gt;print str(sum(x))[:10]&lt;br /&gt;&lt;br /&gt;性能居然够，那我就不手疼了，不然从左往右算？根据100个n位数的和的位数肯定小于(n+3)来着...Java也有自带类似的库的说。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 14&lt;br /&gt;&lt;br /&gt;m = 1000000&lt;br /&gt;c = {}&lt;br /&gt;c[1]=1&lt;br /&gt;def n(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x in c:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return c[x] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x%2==0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx = x/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nx = 3*x+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v = n(nx)+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c[nx] = v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return v&lt;br /&gt;mx=0&lt;br /&gt;mv=1&lt;br /&gt;for i in xrange(1,m):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = n(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if t&amp;gt;mx:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mx, mv = t, i&lt;br /&gt;print mv&lt;br /&gt;&lt;br /&gt;代码写丑了我会直接说出来吗...这题超过边界不记忆的话估计性能也够了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 15&lt;br /&gt;&lt;br /&gt;load(functs);&lt;br /&gt;combination(20+20,20);&lt;br /&gt;&lt;br /&gt;这貌似是学排列组合的例题，那么就数学软件Maxima应对吧。&lt;br /&gt;或者从左上角一步一步往右下角慢慢迭代推过去也是可以的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 16&lt;br /&gt;&lt;br /&gt;print sum(map(int,str(2**1000)))&lt;br /&gt;&lt;br /&gt;依然高精度，性能没有问题就不优化了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 17&lt;br /&gt;&lt;br /&gt;(define (en n)&lt;br /&gt;&amp;nbsp;&amp;nbsp;;(assert (&amp;lt;= 1 n 1000))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(cond&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((zero? n) &amp;quot;&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((= n 1000) &amp;quot;onethousand&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((zero? (remainder n 100))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(string-append (en (quotient n 100)) &amp;quot;hundred&amp;quot;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt; 100 n 1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(string-append (en (quotient n 100)) &amp;quot;hundredand&amp;quot; (en (remainder n 100))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt; 19 n 100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(string-append (vector-ref #(&amp;quot;ten&amp;quot; &amp;quot;twenty&amp;quot; &amp;quot;thirty&amp;quot; &amp;quot;forty&amp;quot; &amp;quot;fifty&amp;quot; &amp;quot;sixty&amp;quot; &amp;quot;seventy&amp;quot; &amp;quot;eighty&amp;quot; &amp;quot;ninety&amp;quot;) (- (quotient n 10) 1)) (en (remainder n 10))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt; n 20)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(vector-ref #(&amp;quot;one&amp;quot; &amp;quot;two&amp;quot; &amp;quot;three&amp;quot; &amp;quot;four&amp;quot; &amp;quot;five&amp;quot; &amp;quot;six&amp;quot; &amp;quot;seven&amp;quot; &amp;quot;eight&amp;quot; &amp;quot;nine&amp;quot; &amp;quot;ten&amp;quot; &amp;quot;eleven&amp;quot; &amp;quot;twelve&amp;quot; &amp;quot;thirteen&amp;quot; &amp;quot;fourteen&amp;quot; &amp;quot;fifteen&amp;quot;  &amp;quot;sixteen&amp;quot; &amp;quot;seventeen&amp;quot; &amp;quot;eighteen&amp;quot;  &amp;quot;nineteen&amp;quot;) (- n 1)))))&lt;br /&gt;(do ((i 1 (+ i 1))(s 0 (+ s (string-length (en i)) )))((= i 1001) s))&lt;br /&gt;&lt;br /&gt;我这里zero?的处理不大合代码的逻辑，只是在题目的范围内还不会影响到结果。不过这题其实扳手指算一个总数出来也就可以了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 18&lt;br /&gt;&lt;br /&gt;x = [&lt;br /&gt;...&lt;br /&gt;]&lt;br /&gt;m = [[0]*i for i in range(1,len(x)+1)]&lt;br /&gt;m[0][0]=x[0][0]&lt;br /&gt;for i in range(len(x)-1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in range(i+1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print i, j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = m[i][j]+x[i+1][j]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if m[i+1][j] &amp;lt; t:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m[i+1][j] = t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m[i+1][j+1] = m[i][j]+x[i+1][j+1]&lt;br /&gt;print max(m[len(m)-1])&lt;br /&gt;&lt;br /&gt;传统的DP题终于出现了呵，这里是手工用正则表达式获得数据后按照套路来处理。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 19&lt;br /&gt;&lt;br /&gt;def getDaysOfMouth(yyyy,mm):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_daysOfMouth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;def isLeap(y):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return y%4==0 and y%400!=0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 29 if mm==1 and isLeap(yyyy) else _daysOfMouth[mm]&lt;br /&gt;daysAfter = 0&lt;br /&gt;daysOfSunday = 0&lt;br /&gt;mod = sum(getDaysOfMouth(1990,m) for m in range(12)) % 7&lt;br /&gt;for y in range(1901,2001):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for m in range(12):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if daysAfter%7==6 - mod :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daysOfSunday += 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;daysAfter += getDaysOfMouth(y,m)&lt;br /&gt;print daysOfSunday &lt;br /&gt;&lt;br /&gt;数字中用来好多魔法，千万小心别出Bug，这算法是代替手工操作的，需要小心和测试。话说一些语言的标准库里可是有Date和Calendar，而后者中能获取到星期相关的信息的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 20&lt;br /&gt;&lt;br /&gt;from math import factorial&lt;br /&gt;print sum(map(int,str(factorial(100))))&lt;br /&gt;&lt;br /&gt;高精度计算，拆位处可不涉及字符串，不过解释语言内置方法实现的比自己写的会效率好一些。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 21&lt;br /&gt;&lt;br /&gt;c={}&lt;br /&gt;def d(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x in c:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return c[x]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d = sum(i for i in xrange(1,x) if x%i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c[x] = d&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return d&lt;br /&gt;s = 0&lt;br /&gt;for i in range(1,10000):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = d(a)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if d(b)==a and a!=b:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s += a&lt;br /&gt;print s&lt;br /&gt;&lt;br /&gt;前面某题做过求因数的优化了，这题暴力的话勉强够了。从实际命中的情况看，缓存用定长10000的数组对这题其实效率更好。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 22&lt;br /&gt;&lt;br /&gt;f = open(&amp;quot;names.txt&amp;quot;,&amp;quot;r&amp;quot;)&lt;br /&gt;l = f.readline()&lt;br /&gt;c = l.split(&amp;quot;,&amp;quot;)&lt;br /&gt;c.sort()&lt;br /&gt;def s(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sum(ord(i)-ord(&#39;A&#39;)+1 for i in x[1:-1])&lt;br /&gt;print sum(s(v)*i for i,v in enumerate(c,start=1))&lt;br /&gt;&lt;br /&gt;第六行的里把引号过滤掉就目的达到，话说这次终于在IO方面没法省事直接内嵌数据了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 23&lt;br /&gt;&lt;br /&gt;m = 28123&lt;br /&gt;def d(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return sum(i for i in xrange(1,x) if x%i==0)&lt;br /&gt;a = {}&lt;br /&gt;for i in xrange(1,m):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if d(i) &amp;gt; i:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a[i] = True&lt;br /&gt;def c(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return any(True for i in xrange(1,x) if i in a and x-i in a)&lt;br /&gt;print sum(i for i in xrange(1,m+1) if not c(i))&lt;br /&gt;&lt;br /&gt;虽然结果对，但是像目前这样不优化的肯定超时。用Py2.7的特性可以把生产字典写为单行，可以省掉5~7th行。&lt;br /&gt;另外用列表类型要注意Py的下标为负数也能取到元素，别弄错了。列表的话就写作“... a = [None]*m ... if a[i] and a[x-i] ... ”。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 24&lt;br /&gt;&lt;br /&gt;from itertools import permutations,islice&lt;br /&gt;print &amp;quot;&amp;quot;.join(map(str,[i for i in islice(permutations(range(10)),999999,1000000)][0]))&lt;br /&gt;&lt;br /&gt;某种意义的开挂，不过Py2的itertools代码明显不如Py3美观。优化的方法是位数从左到右计算可能的个数，排列的情况其实只用阶乘，然后手工调试出结果即可。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 25&lt;br /&gt;&lt;br /&gt;(let loop ((a 1) (b 1) (n 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (= (string-length (number-&amp;gt;string a)) 1000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop b (+ a b) (+ n 1))))&lt;br /&gt;&lt;br /&gt;在Scheme里用尾递归表示迭代是相当好用的，有named-let和do两个宏可用。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 26&lt;br /&gt;&lt;br /&gt;from itertools import count&lt;br /&gt;def c(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = {}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in count(0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = r%x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if t==0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif t in c:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return i-c[r%x]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c[t] = i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r*=10&lt;br /&gt;m, v = 0, 0&lt;br /&gt;for i in range(1,1000):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t = c(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if t&amp;gt;v:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m ,v = i ,t&lt;br /&gt;print m&lt;br /&gt;&lt;br /&gt;这里是模拟手工操作，不过貌似有数学推导式来着。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 27&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from itertools import *&lt;br /&gt;c = {}&lt;br /&gt;def p(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x in c:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return c[x]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p = (x==2 or&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(x&amp;gt;2 and x%2!=0 and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;all(x%i!=0 for i in xrange(3,int(sqrt(x))+1,2))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c[x] = p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return p&lt;br /&gt;def q(n,a,b):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return n**2+a*n+b&lt;br /&gt;m, v = (), 0&lt;br /&gt;for a in xrange(-999,1000):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for b in xrange(-999,1000):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for x in count(0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not p(q(x,a,b)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x-1&amp;gt;v:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m,v=(a,b),x-1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break  &lt;br /&gt;print m[0]*m[1]&lt;br /&gt;&lt;br /&gt;怎么就没有带参数的max函数呢，不然派生一个Comparable类型出来更加累赘啊。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 28&lt;br /&gt;&lt;br /&gt;size = 1001&lt;br /&gt;def delta(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (x+2)**2-x**2&lt;br /&gt;s,d = 1,1&lt;br /&gt;for i in xrange(1,size,2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d += delta(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s += d&lt;br /&gt;print s*4-sum(range(2,size,2))*(1+2+3)-4+1&lt;br /&gt;&lt;br /&gt;先算了右上角，然后扩展到四个角。其中用到的递推式（4~7th中的d）貌似可以化简。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 29&lt;br /&gt;&lt;br /&gt;print len(set(a**b for a in xrange(2,101) for b in xrange(2,101)))&lt;br /&gt;&lt;br /&gt;唉，又暴力了，居然性能还行，那就不用优化了。不用大数运算的话，其实重复项也只是底数呈指数关系的项。注意指数如果展开的话，不能用浮点数运算。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 30&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from operator import pow&lt;br /&gt;from itertools import *&lt;br /&gt;w = 0&lt;br /&gt;for i in count(1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if 9**5*i &amp;lt; 10**i:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;w = i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;def t():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for digits in product(range(10),repeat=w):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = reduce(lambda x,y:x*10+y,digits)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if m!=0 and m!=1 and m==sum(i**5 for i in digits):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield m&lt;br /&gt;print sum(t())&lt;br /&gt;&lt;br /&gt;当位数达到一定大小后，和的最大值就已经满足不了位数了。由于 多项式函数==o(指数函数) ，从而可以求出全部解。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 31&lt;br /&gt;&lt;br /&gt;from itertools import *&lt;br /&gt;r = 200&lt;br /&gt;p = [1,2,5,10,20,50,100,200]&lt;br /&gt;n = 0&lt;br /&gt;def t(s,pc):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if pc&amp;gt;=len(p):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in count(0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l = s+i*p[pc]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if l == r:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;global n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n+=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if l &amp;gt;= r:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t(l,pc+1)&lt;br /&gt;t(0,0)&lt;br /&gt;print n&lt;br /&gt;&lt;br /&gt;这次代码真的写丑了，不过运行效果良好。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 32&lt;br /&gt;&lt;br /&gt;from itertools import *&lt;br /&gt;digits2int = lambda ds: reduce(lambda h,l:10*h+l,ds)&lt;br /&gt;def enum():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in permutations(range(1,10)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in range(1,9):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for k in range(j+1,9):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not (j-1)+(k-j-1)+1 &amp;lt;= k  &amp;lt; (j-1)+(k-j-1)+3:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a,b,c = map(digits2int,(i[0:j],i[j:k],i[k:9]))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if a*b==c:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;yield c&lt;br /&gt;print sum(set(enum()))&lt;br /&gt;&lt;br /&gt;目前性能不行，如果把permutations展开写的话，可能可以免去一些方向的尝试。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 33&lt;br /&gt;&lt;br /&gt;from functools import *&lt;br /&gt;from itertools import *&lt;br /&gt;from operator import *&lt;br /&gt;from fractions import *&lt;br /&gt;print apply(Fraction,reduce(partial(map,mul),((10*a+b,10*b+c) for a,b,c in product(range(1,10), repeat=3) if a&amp;lt;c and (10*a+b)*c==(10*b+c)*a))).denominator&lt;br /&gt;&lt;br /&gt;好吧我承认这题很简单，但是我一开始愣是没明白题目要做什么。约分可以请欧几里德来算得最大公约数做除数，其他没什么好说的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 34&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;print sum(x for x in xrange(3,10**6) if sum(map(factorial,map(int,str(x))))==x)&lt;br /&gt;&lt;br /&gt;以每一位都是9的情况和函数间的高阶关系来考虑上限，然后暴力。上限的位数是最大使得“factorial(9)*i&amp;gt;=10**i-1”成立的正整数。顺带说些Py带的若干函数是C实现的，性能比手工写要好很多。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 35&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from itertools import *&lt;br /&gt;m = 10**6&lt;br /&gt;s = [False,True] * (m/2)&lt;br /&gt;s[0:3] = False, False, True&lt;br /&gt;for i in xrange(3,m,2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not s[i]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while True :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = i * j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s[k] = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j+=1&lt;br /&gt;def primep(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return s[x]&lt;br /&gt;def rotations(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = str(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return [s[i:len(s)]+s[0:i] for i in range(len(s))]&lt;br /&gt;def cpp(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return all(map(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lambda t:primep(int(&amp;quot;&amp;quot;.join(t))),rotations(x)))&lt;br /&gt;print len([True for i,v in enumerate(s) if v and cpp(i)])&lt;br /&gt;&lt;br /&gt;一开始的时候每没意识到要优化，后来就好多了。有点等价代码的草稿，被我擦掉了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 36&lt;br /&gt;&lt;br /&gt;pp = lambda x:(lambda s:s==s[::-1])(str(x))&lt;br /&gt;d2b = lambda x:&amp;quot;{:b}&amp;quot;.format(x)&lt;br /&gt;print sum(i for i in xrange(1,10**6) if pp(i) and pp(d2b(i)))&lt;br /&gt;&lt;br /&gt;按照题目的意思来就可以了，没有遇到很糟糕的性能。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 37&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from itertools import *&lt;br /&gt;from functools import *&lt;br /&gt;m = 10**6&lt;br /&gt;s = [False,True] * (m/2)&lt;br /&gt;s[0:3] = False, False, True&lt;br /&gt;for i in xrange(3,m,2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not s[i]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while True :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = i * j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s[k] = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j+=1&lt;br /&gt;primep = lambda x:s[x]&lt;br /&gt;truncate = lambda x:(lambda s:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imap(partial(map,int),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((s[:i+1],s[i:]) for i in range(len(s)))))(str(x))&lt;br /&gt;tpp = lambda x:all(primep(a) and primep(b) for a,b in truncate(x))&lt;br /&gt;t = [i for i in xrange(10,m) if tpp(i)]&lt;br /&gt;print len(t)&lt;br /&gt;print sum(t)&lt;br /&gt;&lt;br /&gt;题目里说十一个，所以就算了这么一些，得到了answer。代码中用到了惰性求值，不然性能会很糟糕，避免了列表被完全展开。虽然没有编译时优化惰性求值有多余的开销，不过不必要的计算才是这里最影响性能的东西。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 38&lt;br /&gt;&lt;br /&gt;from itertools import *&lt;br /&gt;from functools import *&lt;br /&gt;def t(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;int-&amp;gt;int&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in count(start=1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s += str(x*i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#39;0&#39; in s:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if 9==len(s)==len(set(s)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return int(s)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;elif 9&amp;lt;=len(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0&lt;br /&gt;print max(t(reduce(lambda a,b:a*10+b,j,9))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in range(0,4) for j in permutations(range(1,9),i))&lt;br /&gt;&lt;br /&gt;需要尝试位数小于5的数，并注意没有零出现。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 39&lt;br /&gt;&lt;br /&gt;print(reduce((lambda f,s:f if f[1]&amp;gt;s[1] else s),((m,len([a for a in xrange(1,m/3) for b in xrange(a,(m-a)/2) for c in (m-a-b,) if b-a&amp;lt;c&amp;lt;a+b and a**2+b**2==c**2])) for m in xrange(1001)))[0])&lt;br /&gt;&lt;br /&gt;性能啊性能啊&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 40&lt;br /&gt;&lt;br /&gt;from operator import *&lt;br /&gt;from itertools import *&lt;br /&gt;from functools import *&lt;br /&gt;print reduce(mul,(int(v) for i,v in islice(enumerate(chain.from_iterable(imap(str,count()))),1000001) if i in (1,10,100,1000,10000,100000,1000000)))&lt;br /&gt;&lt;br /&gt;边迭代边判断即可。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 41&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from itertools import *&lt;br /&gt;primep = lambda x:(x==2 or (x&amp;gt;2 and x%2!=0 and all(x%i!=0 for i in xrange(3,int(sqrt(x))+1,2))))&lt;br /&gt;print max(k for i in range(1,10) for j in permutations(range(1,i+1),i) for k in (reduce(lambda x,y:10*x+y,j,0),) if primep(k))&lt;br /&gt;&lt;br /&gt;就是题目字面的意思。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 42&lt;br /&gt;&lt;br /&gt;c = (open(&amp;quot;words.txt&amp;quot;,&amp;quot;r&amp;quot;).readline()[1:-1]).split(&#39;&amp;quot;,&amp;quot;&#39;)&lt;br /&gt;v = lambda x:sum(ord(i)-ord(&#39;A&#39;)+1 for i in x)&lt;br /&gt;t = lambda n:(n*(n+1))/2&lt;br /&gt;ts = [1]&lt;br /&gt;def tp(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while ts[-1]&amp;lt;x:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ts.append(t(len(ts)+1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return x in ts&lt;br /&gt;print len([i for i in c if tp(v(i))])&lt;br /&gt;&lt;br /&gt;还有明显的优化空间，不过没感觉到性能瓶颈。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 43&lt;br /&gt;&lt;br /&gt;from itertools import *&lt;br /&gt;digits2int = lambda it:reduce(lambda a,b:10*a+b,it,0)&lt;br /&gt;satisfy = lambda x:all(imap(lambda a,b:a%b==0,(digits2int(x[j:j+3]) for j in xrange(1,8)),(2,3,5,7,11,13,17)))&lt;br /&gt;print sum(digits2int(i) for i in permutations(range(10)) if satisfy(i))&lt;br /&gt;&lt;br /&gt;来多说说一些关于permutations函数的话题吧这里，因为最近用得较多了。话说STL里面也有同样作用的函数提供，而自己实现的话可以简单地利用树的遍历。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 44&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;#from bisect import *&lt;br /&gt;from itertools import *&lt;br /&gt;p = lambda n:n*(3*n-1)/2&lt;br /&gt;#ps = [p(1)]&lt;br /&gt;#def pp(x):&lt;br /&gt;#    while ps[-1]&amp;lt;x:ps.append(p(len(ps)+1))&lt;br /&gt;#    return (lambda i:i&amp;lt;len(ps) and ps[i]==x)(bisect_left(ps,x))&lt;br /&gt;pp = lambda x:((1+sqrt(1+24*x))/6)%1==0&lt;br /&gt;print list(islice((p(i)-p(j) for i in count(1) for j in xrange(1,i) if (lambda x,y:pp(x+y) and pp(x-y))(p(i),p(j))),1))[0]&lt;br /&gt;&lt;br /&gt;注释掉的代码是被重写了的，用了一元二次方程的求根公式（结合函数图形看，其实这里用错了，还没来及修改）。不用bin-search用hash-set貌似也行。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 45&lt;br /&gt;&lt;br /&gt;(let loop ((i 286) (j 166) (k 144))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let ((t (* i (+ i 1) 1/2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(p (* j (- (* 3 j) 1) 1/2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(h (* k (- (* 2 k) 1))))        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((= t p h) t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt;= t (min p h)) (loop (+ i 1) j k))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt;= p (min t h)) (loop i (+ j 1) k))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((&amp;lt;= h (min t p)) (loop i j (+ k 1)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else #f))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;话说好久没用Scheme来写写了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 46&lt;br /&gt;&lt;br /&gt;from math import *&lt;br /&gt;from itertools import *&lt;br /&gt;oddp = lambda x:x%2!=0&lt;br /&gt;primep = lambda x:(x==2 or (x&amp;gt;2 and x%2!=0 and all(x%i!=0 for i in xrange(3,int(sqrt(x))+1,2))))&lt;br /&gt;conjecturep = lambda x:any(i for i in xrange(2,x) if primep(i) and sqrt((x-i)*.5)%1==0)&lt;br /&gt;failp = lambda x:oddp(x) and not primep(x) and not conjecturep(x)&lt;br /&gt;for i in count(4):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if failp(i):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;#from functools import *&lt;br /&gt;#from operator import *&lt;br /&gt;#print list(islice(ifilter(failp,count(4)),1))[0]&lt;br /&gt;&lt;br /&gt;直接算吧，然后直接答案取走。这里注释掉的是最后几行另一种运行很慢的写法。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 47&lt;br /&gt;&lt;br /&gt;(define (factor x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let loop ((x x) (i 2) (r &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (&amp;gt; i (sqrt x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cons x r)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (zero? (remainder x i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop (/ x i) i (cons i r))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(loop x (+ i 1) r)))))&lt;br /&gt;(define (unique-sroted-list x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (list-not-starts-with xs x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((null? xs) &#39;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((eq? (car xs) x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list-not-starts-with (cdr xs) x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else xs)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (null? x) &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cons (car x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(unique-sroted-list &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list-not-starts-with (cdr x) (car x))))))&lt;br /&gt;(define (number-of-distinct-primes x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(length (unique-sroted-list (factor x))))&lt;br /&gt;(do ((n 1 (+ n 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(a 0 (number-of-distinct-primes n))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(b 0 (if (= a 4) (+ b 1) 0)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;((= b 4)(- n 4 2)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;现在越来越觉得Scheme代码想撮面团拧麻花的样子。理解清楚题意才是最重要的，然后运用对应的知识即可。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 48&lt;br /&gt;&lt;br /&gt;last_ten_digits = lambda x:str(x) if x&amp;lt;10**11 else str(x)[-10:]&lt;br /&gt;print last_ten_digits(sum(int(last_ten_digits(i**i)) for i in xrange(1,1001)))&lt;br /&gt;&lt;br /&gt;求指数过程中只保留10位即可，可以获得更好的性能。以Python的性能还是算了，内置函数和手写落差太大，还是不修改了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 49&lt;br /&gt;&lt;br /&gt;from math import sqrt&lt;br /&gt;print (lambda c:(lambda p:[&#39;&#39;.join(map(str,(i,j,k))) for a in xrange(len(c)) for b in xrange(a+1,len(c)) for i,j,k in [(c[a],c[b],2*c[b]-c[a])] if k&amp;gt;j and k in p and sorted(str(i))==sorted(str(j))==sorted(str(k))])(set(c)))(filter(lambda x:(x==2 or (x&amp;gt;2 and x%2!=0 and all(x%i!=0 for i in xrange(3,int(sqrt(x))+1,2)))),range(1000,10000)))&lt;br /&gt;&lt;br /&gt;把for语句压缩为单行代码后的产物，“import”那行不算数。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Problem 50&lt;br /&gt;&lt;br /&gt;m = 10**6&lt;br /&gt;def prime(m):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = [False,True] * (m/2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s[0:3] = False, False, True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i in xrange(3,m,2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if not s[i]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while True :&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = i * j&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if k &amp;gt;= m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s[k] = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j+=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;primep = lambda x:s[x]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;primes = tuple(i for i in xrange(m) if primep(i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return primep,primes&lt;br /&gt;primep, primes = prime(m)&lt;br /&gt;mr = 0&lt;br /&gt;r = 0&lt;br /&gt;for i in xrange(len(primes)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;su = sum(primes[i:i+22])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for j in xrange(i+22,len(primes)):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lp = j-i+1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;su += primes[j]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if su&amp;gt;=m:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if primep(su):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if lp&amp;gt;mr:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mr,r = lp,su&lt;br /&gt;print r&lt;br /&gt;&lt;br /&gt;一开始不专心弄复杂题目意思了，造成了不必要的浪费，本来是很简单的问题。这次未用函数式风格，话说控制不好状态的变化很容易出错的说。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Level 1&lt;br /&gt;&lt;br /&gt;前50题就是这些了，这是些算全部题目的 Level One 部分。&lt;br /&gt;撒花，撒花。&lt;br /&gt;接下来朝着别的目标前进吧，就先暂且做这几道题作为练手和娱乐了。&lt;br /&gt;&lt;br /&gt;其实吧PE的前50道题目还是比较浅显的，因为涉及到的数据结构和数学上的知识点不是很多。&lt;br /&gt;题目差不多都是根据题目的意思直接翻译为代码，把程序语言作为一个强大的计算器来使用。&lt;br /&gt;所以在这前50道题里，更关注的是对机算工具的使用，而不是问题本身的经验积累。&lt;br /&gt;那么其中有什么积极的价值呢，我想，或多或少总是有的吧，我只能这么说了。&lt;br /&gt;上面的代码太偷懒了，不知道这种懒惰时候会让自己对正常向的使用态度有副作用呢。&lt;br /&gt;好害怕...&lt;br /&gt;其他的就不多说了，收工。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;此外Problem 8试了试common lisp，不过代码没写漂亮，所以上面整理时被我略去了。&lt;br /&gt;&amp;lt;blockquote&amp;gt;(defparameter s ...)&lt;br /&gt;(reduce #&#39;max (loop for i from 1 to (- (length s) 5) collect (reduce #&#39;* (map &#39;list #&#39;(lambda (x) (parse-integer (string x))) (subseq s i (+ i 5))))))&amp;lt;/blockquote&amp;gt;&lt;br /&gt;&lt;br /&gt;如果想临时试试代码的话可以用用codepad.org或者ideone.com。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;最初在uushare发贴说一天一题，然后在QQ空间上整理出了上文，然后又把纯文字版备份于此（可惜格式图片都丢失了）。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/5247093717925420538/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/5247093717925420538' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/5247093717925420538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/5247093717925420538'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/08/pe50.html' title='【挖一挖】关于PE50的存档'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-2031923888519872409</id><published>2011-08-27T16:35:00.007+08:00</published><updated>2011-08-27T18:14:12.683+08:00</updated><title type='text'>【挖一挖】WQX和单文件小游戏</title><content type='html'>作为可看作是集合了电子辞典，编程计算器，个人信息助理以及互动多媒体终端的这样一个东西，上面看起来还是有些有趣的东西的。还曾有一个写了一半的文字来记录以下从中能够想到的用法。&lt;br /&gt;&lt;br /&gt;出发点是下面两个链接，然后来转一些片段：&lt;br /&gt;http://www.emsky.net/bbs&lt;br /&gt;http://javatar.iteye.com/category/7525&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RPG引擎原理讲解！ 作者：杨芹勍[Coolsoft(R)] &lt;br /&gt;------------------------------------------------------------------------------------------------------ &lt;br /&gt;当我在发布“动物园历险记”之前，我在许多文曲星网站都发了游戏的剧情、内容和规模预告的帖子。可想而知，当你在没有玩这个游戏的时候肯定也不会相信GVBasic能处理那么复杂的剧情。和大家一样，那些回帖的人都说不可能有那么强的引擎能撑得住。但是当游戏发布时……这主要是归功于我花了一个星期才研究出来的“对象处理思想”。这个思想的用途是处理RPG剧情的前后关系。首先试用在《逃离校园》上，然后是《医院惊魂》，最后才与《动物园历险记》玩美地结合。如果想知道这个思想的具体函意，请往下看。 &lt;br /&gt;这个思想的灵感主要是来源于PC上许多编程软件的“面象对象”的思想。它可以把一个窗体、一个控件、一段代码等都看成是一个对象，每个对象都有自己的属性、事件和方法。一个对象可以激活另外一个对象，同时也可以终止一个对象。同样，文曲星屏幕上任何一个图形都可以看成是一个对象，这就是所谓的“对象处理思想”。当然我们并不是把屏幕上每个图形都看成是一个对象，而是处理一些和剧情有关的图形，那些图形所包含的信息就是我们要处理的剧情。我们可以把信息保存在数据文件里面，然后在主程序里面处理它们，这样就节省掉很多主程序的字节。 &lt;br /&gt;1、剧情信息格式 &lt;br /&gt;大家在地图安装文件“ZOOSC.BAS”里面是不是发现许多形如“ABTBCMBSA”这种奇怪的字符串？这就是地图上面的对象所包含的信息。下面让我们来详细分析一下这些信息所保存的格式： &lt;br /&gt;首先，我们令A等于1，B等于2……Z等于26等等（用ASCII码表示就是CHR$(T+64)，T=1,2,3……），为什么要那么做呢？是因为由于RPG包含的元素很多，如果这些元素大于或等于10的话处理起来会很麻烦，且保存起来很不方便。等一下你就会理解啦！ &lt;br /&gt;然后来看一下剧情信息包含的元素和保存的格式： &lt;br /&gt;屏幕X坐标 屏幕Y坐标 条件 条件值 字幕 处理1 处理值1 处理2 处理值2 &lt;br /&gt;一共有9个元素，每个元素占位一个字节。 &lt;br /&gt;“屏幕Y坐标”就是屏幕上的1～5行，“X坐标”与我们平常习惯的不同，它算的是汉字的相对坐标，如果在屏幕上有一行字“一二三四”，那么“三”的实际X坐标是5，相对坐标是3。 &lt;br /&gt;“条件”就是你要实现这个剧情需要的条件识别符，如用“L”代表等级、“S”代表道具。“条件值”就是条件所对应的值，如多少等级、什么道具。如“SA”表示条件为必须要有第一个道具（“A”代表“1”！）剧情才能继续。 &lt;br /&gt;“字幕”就是你完成某个条件以后屏幕上弹出的对话字幕。通常RPG有很多人物对话，由于“字幕”这个元素只占一格，如果用1、2、3来表示那么只能有9条对话。那怎么行啊？所以我们可以用A、B、C～~代替。“~”的ASCII码值为126，那么从“A”～“~”中间有64个空位，比9大多啦！现在你可以理解为什么用这些东西代替了吧！ &lt;br /&gt;“处理”和“条件”大同小异，只不过“处理”是得到什么东西而不是条件那样需要什么东西罢了。 &lt;br /&gt;注意：在这些元素中不是每个元素都会用到，如果不用的元素请用“@”代替，因为“@”代替“0”。 &lt;br /&gt;下面让我们来看看一些常规的“条件”和“处理”分别对应的识别码。 &lt;br /&gt;条件： &lt;br /&gt;H：有某道具； &lt;br /&gt;L：达到多少等级； &lt;br /&gt;T：几点钟； &lt;br /&gt;Z：需要某特殊剧情； &lt;br /&gt;N：不需要某特殊剧情。 &lt;br /&gt;处理： &lt;br /&gt;C：跳转地图； &lt;br /&gt;M：遇到某敌人； &lt;br /&gt;S：得到某道具； &lt;br /&gt;Z：处理某特殊剧情。 &lt;br /&gt;什么叫特殊剧情呢？特殊剧情就是指不改变玩家状态（道具、时间、等级），而只改变游戏进度的剧情。如在动物园历险记中，一开始有个小孩，你必须请教他才能钻狗洞进动物园。而你请教那个小孩，没有改变你任何状态，它只会给一个特殊变量附值，表明已经问过了。然后到狗洞前信息会引导程序去判断这个特殊变量的值，看看你是否问过小孩。如果小孩对应的处理信息为ZA，那么狗洞对应的条件信息为ZA。如果你想搞一个问过小孩就不能进狗洞，那么狗洞对应的条件信息应改为NA。 &lt;br /&gt;大家在玩动物园的时候肯定会有进某所房子或出某所房子的时候。这就是跳转语句起的作用。每一个跳转值都对应一个跳转字符串，这个等一下再说。 &lt;br /&gt;下面我们来进行举例分析： &lt;br /&gt;在屏幕的第一行、第三格有一个图形，碰到它会遇到一号敌人，会出现第二个对话，打赢了得到第三个道具，怎么表示？很简单：CA@@BMASC。注意，由于没有条件，条件那两栏用@填充。 &lt;br /&gt;如果有某种道具时显示一段字幕，没有时显示另外一段字幕时怎么表示？这时，我们应该把符合条件的字幕放在“处理值2”栏目里面，把不符合条件的字幕放在“字幕”栏目里面。打个比方，在屏幕上第四行、第五格有一个图案，碰它需要有第二个道具，如果有则显示第二段对话，且得到三号道具，没有则显示第三段对话：DESBCSC@B。注意，如果使用了这种信息的格式就不能使用处理元素2。 &lt;br /&gt;如果一幅地图里面有多个图形关系到剧情，那么可以把这些信息连起来，如“AB@@CCM@@CD@@DSA@@”，表示在地二行第一格和第四行的第三格都有剧情信息。注意，每一幅地图中所包含剧情信息的图形不能超过7个，否则引擎程序会出错！ &lt;br /&gt;2、跳转信息格式： &lt;br /&gt;好了，了解了剧情信息格式之后，让我们来了解一下前面提到的“跳转地图”的含意。动物园一共有9*10幅地图。底下两行存放的是室内的地图，上面则存放的是外景地图： &lt;br /&gt;──门─│┌─植─ &lt;br /&gt;─猴└─停│┌┬虎 &lt;br /&gt;┌┴─熊│└饲└┐ &lt;br /&gt;│游┌─水┐─出┘ &lt;br /&gt;└┤│鸟─┤┌─┐ &lt;br /&gt;鳄│卖┬─│└┐厕 &lt;br /&gt;│桥─┤象┴┐入│ &lt;br /&gt;医──饭──办─┘ &lt;br /&gt;＊＊＊＊＊＊＊＊＊ &lt;br /&gt;＊＊＊＊＊＊＊＊＊ &lt;br /&gt;同样，我们把整个地图看成是一个大集合，每一幅地图看成是一个元素。比如说，把“门”这幅地图看成是一个元素，它在大地图里的第二行的第三格，一行一行地数，每一行有九格，那么它在集合里为第十二个元素，再取元素号+32的ASCII码值（注：这里有别于前面的+64，因为RPG地图很多，127-64幅地图远远不够），再加上需要跳转到的那幅地图的屏幕X、Y轴坐标就可以啦！如“ABC”代表第33幅（“A”对应65号ASCII码，65-32=33）地图屏幕上第三行的第二格。由于RPG的跳转信息很多，所以我们可以在安装程序中拿一个字符串一个接一个地保存跳转信息，把第一个用“A”代替……如：“ACDBEFJIC”为跳转信息字符串，那么第二个跳转信息为“BEF”，在剧情信息中可以用处理值“CB”来实现。 &lt;br /&gt;实例请叁看ZOOSC.BAS中第140～150行。 &lt;br /&gt;3、地图的制作与显示： &lt;br /&gt;不止十个网友问我：为什么动物园的地图显示得那么快？而且还是在助手里面。答案是我在安装时就生成好了地图保存到随机文件中，玩的时候马上读出来整屏显示，浪费了安装时间而节约了游戏时间。看看ZOOSC.BAS的第170行到180行，这里保存了所有地图要用到的图形的总集合，把地一个图形命名为“A”……再在底下的数据中写下“ABSEHD...”之类的50（文曲星每一屏只能显示50个图形）个字节就可以了。如何让地图数据和剧情信息相结合呢？？那么你就在地图数据上后面加一个“,”号，在加上剧情信息就可以了。如： &lt;br /&gt;DATA &quot;ASCDVDFEFGGGGBVVVFFFCCDAAAAACDFVGGDAAAAABBBFFAASAQ&quot;,&quot;AB@@CSA@@&quot; &lt;br /&gt;注意，如果一幅地图上没有一个图形和剧情有关，那么请用“@”代替剧情信息，引擎程序会自动识别，千万不能空着！ &lt;br /&gt;由于我们是把地图先生成好再用随机文件形式写进文件（详见ZOOSC.BAS的第250行到第300行），所以在主程序中我们可以用随机文件的形式打开，令其长度为100，然后100个字地读取数据，在用余兄的批量法显示到屏幕上。由于NC系列和PC2ka系列不支持批量法，你可以用以下方法显示地图： &lt;br /&gt;假定MP$为从地图文件读取的长度为100的字符串变量。 &lt;br /&gt;LOCATE 1,1:PRINT LEFT$(MP$,99); &lt;br /&gt;POKE 803,ASC(MID$(MP$,100)) &lt;br /&gt;PRINT ; &lt;br /&gt;万事大吉！这个方法对所有机型都试用，只不过速度比批量法稍微慢一点。 &lt;br /&gt;4、人物对话保存方法： &lt;br /&gt;在安装程序ZOOSA.BAS和ZOOSB.BAS中，大多数保存的都是人物对话，人物对话可以用DATA来保存和READ读取，详见ZOOSA.BAS。如果想实现两个人的对话，请在第一个人的话后加上一个“*”号，然后再加上第二个人的话。这样，引擎会在显示玩第一句话时停着，再显示下一句话。如果你觉得如果对话写不满的话，你可以重新写一段对话，然后在上一句对话的末尾加上这一句对话的索引号（A、B、C……），引擎会分析并且跳到这段对话来。 &lt;br /&gt;5、游戏引擎详解： &lt;br /&gt;激动人心的时刻到了！大家打好前面关于数据剧情方面的基础后，引擎方面就不成问题了！如果你想用我这个引擎发布RPG，你只要写数据文件，只改一点点引擎就可以做出很个性化的RPG，大家看好了！ &lt;br /&gt;在这里，我要以最稳定的“动物园历险记”的引擎ZOO.BAS做为叁考，请大家准备好。 &lt;br /&gt;打开ZOO.BAS，跳到第9510行，我们先看看变量的含义。 &lt;br /&gt;S$～屏幕内容字符串，用批送法声明； &lt;br /&gt;MS$～剧情信息分析变量，用于玩家碰屏幕上的图形时存放当前图形所包含的剧情，长度为7，不包括X、Y坐标； &lt;br /&gt;NG$()～游戏介绍字符串组，用于新游戏时介绍游戏起因； &lt;br /&gt;WD$()～道具名称字符串组； &lt;br /&gt;WI$()～道具图标字符串组； &lt;br /&gt;DD$()～敌人名称字符串组； &lt;br /&gt;DI$()～敌人图标字符串组； &lt;br /&gt;S$()～人物对话（就是前面说的字幕）字符串组； &lt;br /&gt;FN$()～剧情信息字符串组，引擎开始时会读取数据文件放到此字符串组中； &lt;br /&gt;DD()～敌人生死状态数组，0代表生，1代表死； &lt;br /&gt;MT()～玩家道具状态数组，0代表未找到，1代表未使用，2代表已使用； &lt;br /&gt;MZ()～游戏特殊剧情处理数组，前面讲过的，如果符合条件就把这个数组里的某个变量存为1，然后由程序来读取该变量是否为1； &lt;br /&gt;MX：玩家在屏幕上的相对X坐标； &lt;br /&gt;MY：玩家在屏幕上的Y坐标； &lt;br /&gt;MP：玩家所在地图为地图集合里的哪一幅地图； &lt;br /&gt;MLV：玩家等级； &lt;br /&gt;MEX：玩家经验值； &lt;br /&gt;MB：玩家血量。 &lt;br /&gt;…… &lt;br /&gt;重要的处理代码对应的行号： &lt;br /&gt;20：按键响应子程序； &lt;br /&gt;150：人物对话（字幕）显示子程序； &lt;br /&gt;400：道具列表及道具的选择和使用子程序； &lt;br /&gt;2500：遇敌战斗和升级的子程序； &lt;br /&gt;4600：游戏通关画面及评论代码； &lt;br /&gt;5000：游戏开始标志； &lt;br /&gt;5110～5240：玩家移动控制代码； &lt;br /&gt;5230：随机遇敌代码； &lt;br /&gt;5250～5320：剧情信分离代码，它可以把玩家人物碰到的图形的剧情信息分离出来，由于玩家碰时以确定了XY坐标，所以分离出的信息不含XY坐标元素； &lt;br /&gt;5330～5720：剧情信息分析代码，用于分析我们前面提到的具有相同格式的RPG剧情信息； &lt;br /&gt;5840：地图的读取以及显示代码； &lt;br /&gt;5880：系统菜单选项代码。 &lt;br /&gt;好了，下面就让我们来分析一下这些代码中的重要的代码。这可能会让你很晕，但是，为了做出好玩的RPG，晕一些也无所谓了:P。 &lt;br /&gt;先来看一下剧情分离代码，从5250行开始。先了解一下原理。由于每一幅地图对应相应的剧情信息（包括“@”空信息）保存在数据文件里，进入引擎一开始会读取它，且每一幅地图的剧情信息用FN$()这个字符串组来保存，由于每一幅地图对应相应的FN$，所以很容易可知道玩家所在地图的FN$，再加以分析就可以了。引擎不是玩家每走一步都判断一次，这样会慢得让你发晕（像天之剑一样），而是如果玩家碰到了障碍物时才读取相应的信息判断。那么如何从该地图的剧情信息中分离出该障碍物所对应的剧情呢？前面我们讲过剧情信息保存的格式，为9个字节，一个连一个地组成该地图包括的剧情。这样，我们可以先读取FN$()前面两个XY的值，看看与玩家所在XY坐标是否相符，如果不相符则跳过这个剧情信息再读取下一个信息的XY，直到相符为止。如果读玩了整段信息还没有找到与玩家XY相同的坐标，BEEP，表示玩家所碰到的图形与剧情无关。 &lt;br /&gt;下面来看看代码： &lt;br /&gt;5250 FOR T=1 TO LEN(FN$(MP)) STEP 9 &lt;br /&gt;5260 IF ASC(MID$(FN$(MP),T))-64&lt;&gt;TX THEN 5280 &lt;br /&gt;5270 IF ASC(MID$(FN$(MP),T+1))-64=TY THEN LSET MS$=MID$(FN$(MP),T+2,7):5300 &lt;br /&gt;5280 NEXT &lt;br /&gt;5290 GOTO 5170 &lt;br /&gt;5300 TJD=ASC(LEFT$(MS$,1)):TJ=ASC(MID$(MS$,2))-64:SH=ASC(MID$(MS$,3))-64 &lt;br /&gt;5310 CLD1=ASC(MID$(MS$,4,1)):CL1=ASC(MID$(MS$,5))-64 &lt;br /&gt;5320 CLD2=ASC(MID$(MS$,6,1)):CL2=ASC(MID$(MS$,7))-64 &lt;br /&gt;5210～5220行为判断信息中的XY值与玩家所碰的XY是否相等，等的话给临时信息字符串MS$赋除了XY信息之外的其它7个字节信息值，注意这里要用到“LSET”。原因是你用常规方法给一个字符串重新赋值后，GVB会重新分配缓冲区保存且不清除原来的值，多次之后会影响到其它固定的变量的缓冲区，导致其它变量的变化。就像“逃离校园”和“医院惊魂”那样玩久了会出乱码一样。而用LSET可以不移动缓充区直接在原来的缓冲区写。 &lt;br /&gt;下面来介绍一下5300行到5320行变量的意思： &lt;br /&gt;TJD～条件标识对应的ASC数值； &lt;br /&gt;TJ～条件值； &lt;br /&gt;SH～字幕值； &lt;br /&gt;CLD1～第一个处理标识对应的ASC值； &lt;br /&gt;CL1～第一个处理值…… &lt;br /&gt;注意：在动物园的测试版中，标识符用字符串变量代替，在正式版改为用数变量代替，原因以经讲过了，就是为了防止缓冲区溢出。 &lt;br /&gt;从5330行开始就是剧情分析代码了： &lt;br /&gt;5300：分析特殊剧情条件； &lt;br /&gt;5370：分析等级条件； &lt;br /&gt;5375：分析需要某道具的条件； &lt;br /&gt;5420：分析时间条件（如在动物园中不到时间不能进水族馆）； &lt;br /&gt;5430：分析没有某特殊剧情的条件…… &lt;br /&gt;只要你把标识值变成对应的ASCII码，你就可以知道是什麽意思啦！ &lt;br /&gt;那麽进小卖部、芝麻开门怎麽写呢？你只要先把这些代码写入引擎，在用特殊的标识符写进剧情就可以了。如5520～5560行。&lt;br /&gt;从5590～5650行为跳转地图的处理代码，注意读取跳转地图信息时为3个字3个字地读出来（5600行），在加以分析。 &lt;br /&gt;让我们再来看看引擎刚开始所需要读取的东西，看9500～9640行。 &lt;br /&gt;9530：声明批送法和向缓冲区申请7个字节的剧情分离变量MS$； &lt;br /&gt;9540～9545：声明变量； &lt;br /&gt;9550～9630：读取游戏相关信息，道具图标、道具名字、敌人图标、敌人名字、游戏介绍、人物对话、地头蛇对话、芝麻开门、剧情信息、跳转地图信息。 &lt;br /&gt;读取这些东西按照先後顺序附与标识值，如一号道具的图标为WI$(1)。 &lt;br /&gt;9640行为用随机方式打开地图文件，因为一个屏幕可以放下100个字符，所以可以令它的读取长度为100，然後100个字100个字地读取任何地图显示到屏幕上，这就是随机文件的好处。这个文件不要关闭，便於可以在程序里面随时读取。 &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;RPG“伏魔剑”源程序 &lt;br /&gt;0 : &lt;br /&gt;1 GRAPH &lt;br /&gt;2 DIM WZ(5,21),DM$(4,19):X(6)=3:Y(6)=19 &lt;br /&gt;6 MO=100 :GOSUB 4101: GOTO 30 &lt;br /&gt;10 IF T$=&quot;b&quot; THEN T=1:19 &lt;br /&gt;11 IF T$=&quot;n&quot; THEN T=2:19 &lt;br /&gt;12 IF T$=&quot;m&quot; THEN T=3:19 &lt;br /&gt;13 IF T$=&quot;g&quot; THEN T=4:19 &lt;br /&gt;14 IF T$=&quot;h&quot; THEN T=5:19 &lt;br /&gt;15 IF T$=&quot;j&quot; THEN T=6:19 &lt;br /&gt;16 T=10 &lt;br /&gt;19 RETURN &lt;br /&gt;30 LOCATE 1,1:PRINT &quot; 《伏魔英雄传》&quot;,&quot; 超经典RPG互动游戏&quot;,&quot; V1.2增强版&quot; &lt;br /&gt;40 LOCATE 4,4:PRINT &quot; 正在读取数据&quot;; &lt;br /&gt;50 BOX 40,70,120,73,0,2 &lt;br /&gt;54 OPEN &quot;FMYXZDATA&quot; FOR INPUT AS #1 &lt;br /&gt;55 INPUT #1,NDFL$: FOR A=1 TO 10:INPUT #1,AE$(A):B=0.808*A+41:LINE B,70,B,73:NEXT &lt;br /&gt;56 FOR A=1 TO 6:INPUT #1,YPM$(A):C=0.808*A+B:LINE C,70,C,73:NEXT :INPUT #1,YDTX$ &lt;br /&gt;58 FOR A=1 TO 2:INPUT #1,MAP$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;60 FOR A=1 TO 4:INPUT #1,CD$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;70 FOR A=1 TO 9:INPUT #1,HG$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;80 FOR A=1 TO 7:INPUT #1,ZP$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;90 FOR A=1 TO 9:INPUT #1,DR$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;100 FOR A=1 TO 5:INPUT #1,MZ$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;110 FOR A=1 TO 5:INPUT #1,GZ$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;120 FOR A=1 TO 6:INPUT #1,WG$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;130 FOR A=1 TO 6:INPUT #1,YP$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;140 FOR A=1 TO 4:INPUT #1,MF$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;150 FOR A=-1 TO 1 STEP 2: FOR AA=1 TO 9 STEP 2 &lt;br /&gt;151 INPUT #1,DM$((2.5+A)+A*0.5,AA*2+A) &lt;br /&gt;152 B=0.808*A+C:LINE B,70,B,73:NEXT :NEXT &lt;br /&gt;160 FOR A=1 TO 5:INPUT #1,AAA$(A):C=0.808*A+B:LINE C,70,C,73:NEXT &lt;br /&gt;165 FOR A=1 TO 10:INPUT #1,RW$(A):INPUT #1,NA$(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;185 FOR A=1 TO 6:INPUT #1,YP(A):C=0.808*A+B:LINE C,70,C,73:INPUT #1,GX(A):NEXT &lt;br /&gt;186 FOR A=1 TO 4:INPUT #1,MF(A):INPUT #1,XG(A):B=0.808*A+C:LINE B,70,B,73:NEXT &lt;br /&gt;189 INPUT #1,AA &lt;br /&gt;190 INPUT #1,BB &lt;br /&gt;191 FOR A=1 TO 4:INPUT #1,BE$(A):NEXT &lt;br /&gt;200 CLOSE #1 &lt;br /&gt;210 CLS:PRINT AAA$(1); &lt;br /&gt;220 T$=INKEY$:A=0:GOSUB 10 &lt;br /&gt;225 IF T=1 THEN GOSUB 9175 &lt;br /&gt;230 ON T GOTO 300,9110,9800:BEEP: GOTO 220 &lt;br /&gt;300 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ; &lt;br /&gt;305 LOCATE 1,9:PRINT RW$(2);: FOR I=1 TO 3000:NEXT &lt;br /&gt;310 FOR I=2 TO 4:LOCATE I-1,9:PRINT &quot;※&quot;;:LOCATE I,9:PRINT RW$(2); &lt;br /&gt;315 FOR J=1 TO 2000:NEXT :NEXT : FOR I=1 TO 1000:NEXT &lt;br /&gt;320 CLS:PRINT CD$(1);:T$=INKEY$ &lt;br /&gt;325 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ;:LOCATE 4,9:PRINT RW$(2); &lt;br /&gt;330 FOR I=0 TO 80:LINE 0,I,160,I,2: FOR J=1 TO 100:NEXT :NEXT &lt;br /&gt;335 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ;:BOX 0,0,160,80,1,2 &lt;br /&gt;340 FOR I=0 TO 80:LINE 0,I,160,I,2: FOR J=1 TO 100:NEXT :NEXT &lt;br /&gt;345 FOR I=1 TO 1000:NEXT &lt;br /&gt;350 FOR I=2 TO 4:CLS:PRINT CD$(I);:T$=INKEY$:NEXT &lt;br /&gt;355 FOR I=1 TO 1000:NEXT &lt;br /&gt;360 CLS:PRINT MAP$(2);:POKE 803,BB:PRINT ;: FOR I=1 TO 1000:NEXT &lt;br /&gt;365 LOCATE 5,11:PRINT RW$(3);: FOR I=1 TO 2000:NEXT &lt;br /&gt;370 LOCATE 5,11:PRINT &quot; &quot;;:LOCATE 4,11:PRINT RW$(3); &lt;br /&gt;380 FOR J=1 TO 2000:NEXT &lt;br /&gt;381 LOCATE 4,11:PRINT &quot; &quot;;:LOCATE 3,11:PRINT RW$(3);: FOR I=1 TO 2000:NEXT &lt;br /&gt;385 FOR I=1 TO 3:CLS:PRINT HG$(I);:T$=INKEY$:NEXT &lt;br /&gt;390 CLS:PRINT MAP$(2);:POKE 803,BB:PRINT ; &lt;br /&gt;395 LOCATE 3,11:PRINT RW$(3);: FOR I=1 TO 2000:NEXT &lt;br /&gt;400 LOCATE 4,11:PRINT RW$(3);:LOCATE 3,11:PRINT &quot; &quot;;: FOR I=1 TO 2000:NEXT &lt;br /&gt;405 LOCATE 4,13:PRINT RW$(3);:LOCATE 4,11:PRINT &quot; &quot;;: FOR I=1 TO 2000:NEXT &lt;br /&gt;410 LOCATE 5,11:PRINT RW$(1);: FOR I=1 TO 2000:NEXT &lt;br /&gt;415 LOCATE 4,11:PRINT RW$(1);:LOCATE 5,11:PRINT &quot; &quot;; &lt;br /&gt;420 FOR J=1 TO 2000:NEXT &lt;br /&gt;421 LOCATE 3,11:PRINT RW$(1);:LOCATE 4,11:PRINT &quot; &quot;; &lt;br /&gt;422 FOR J=1 TO 2000:NEXT &lt;br /&gt;425 FOR I=4 TO 9:CLS:PRINT HG$(I);:T$=INKEY$:NEXT &lt;br /&gt;500 X=3:Y=11:Q=Q+1:B=1 &lt;br /&gt;505 GET #1,1 &lt;br /&gt;506 CLS:PRINT MAP$;:LOCATE X,Y:PRINT RW$(1); &lt;br /&gt;507 LOCATE 5,1:PRINT DM$(X,Y);&quot; &quot;; &lt;br /&gt;510 T=ASC(INKEY$):IF (T&gt;19 AND T&lt;24) OR (T=13 OR T=113) THEN 515 ELSE BEEP:510 &lt;br /&gt;515 IF T=20 THEN X=X-1:IF X&lt;1 THEN BEEP:X=1:505 &lt;br /&gt;520 IF T=21 THEN X=X+1:IF X&gt;4 THEN BEEP:X=4:505 &lt;br /&gt;525 IF T=22 THEN Y=Y+2:IF Y&gt;19 THEN BEEP:Y=19:505 &lt;br /&gt;530 IF T=23 THEN Y=Y-2:IF Y&lt;1 THEN BEEP:Y=1:505 &lt;br /&gt;535 IF T=113 THEN GOSUB 9300: GOTO 505 &lt;br /&gt;536 IF T&gt;13 THEN 505 &lt;br /&gt;540 IF X=4 THEN 570 &lt;br /&gt;541 IF X=2 OR X=3 THEN BEEP:505 &lt;br /&gt;545 IF Y=1 THEN 600 &lt;br /&gt;550 IF Y=5 THEN 700 &lt;br /&gt;555 IF Y=9 THEN 800 &lt;br /&gt;560 IF Y=13 THEN 4500 &lt;br /&gt;561 IF Y=17 THEN 590 &lt;br /&gt;565 BEEP: GOTO 505 &lt;br /&gt;570 IF ((Y=3)+(Y=7)+(Y=15)+(Y=19)) THEN 590 &lt;br /&gt;575 IF Y=11 THEN 576 ELSE 580 &lt;br /&gt;576 IF A=0 THEN 2000 ELSE IF A=1 THEN 5000 &lt;br /&gt;580 BEEP: GOTO 505 &lt;br /&gt;590 CLS:PRINT &quot;请问你找谁？&quot;;:T$=INKEY$: GOTO 505 &lt;br /&gt;600 G=1 &lt;br /&gt;601 C=17:D=16:PP=1 &lt;br /&gt;602 CLS:PRINT &quot;********&quot;;DM$(X,Y);:LOCATE 1,13:PRINT &quot;********&quot;;YDTX$; &lt;br /&gt;606 LOCATE 5,3:PRINT &quot;× × &quot;; &lt;br /&gt;611 LOCATE 5,1:PRINT YPM$(PP);&quot;×&quot;;YPS(PP); &lt;br /&gt;612 LOCATE 5,13:PRINT MO;:BOX C,D,C+48,D+15,1,2:E=C:F=D &lt;br /&gt;620 T=ASC(INKEY$):IF (T&lt;24 AND T&gt;19) OR T=13 OR T=27 THEN 625 ELSE BEEP:620 &lt;br /&gt;625 IF T=20 THEN D=D-16:PP=PP-1:IF D&lt;16 THEN D=48:PP=PP+3 &lt;br /&gt;630 IF T=21 THEN D=D+16:PP=PP+1:IF D&gt;48 THEN D=16:PP=PP-3 &lt;br /&gt;635 IF T=23 THEN C=C-80:PP=PP-3:IF C&lt;17 THEN C=97:PP=PP+6 &lt;br /&gt;640 IF T=22 THEN C=C+80:PP=PP+3:IF C&gt;97 THEN C=17:PP=PP-6 &lt;br /&gt;645 IF T=27 THEN 505 &lt;br /&gt;647 IF T&gt;13 THEN 678 &lt;br /&gt;650 IF G=2 THEN 4550 &lt;br /&gt;655 IF MO&lt;YP(PP) THEN BEEP:LOCATE 5,1:PRINT AAA$(3);:T$=INKEY$:606 &lt;br /&gt;665 MO=MO-YP(PP):YPS(PP)=YPS(PP)+1 &lt;br /&gt;675 IF YPS(1)+YPS(2)+YPS(3)+YPS(4)+YPS(5)+YPS(6)&gt;50 THEN YPS(PP)=YPS(PP)-1:MO=MO+YP(PP):680 &lt;br /&gt;678 BOX E,F,E+48,F+15,1,2: GOTO 606 &lt;br /&gt;680 LOCATE 5,1:PRINT &quot;携带的物品太多了！&quot;;:T$=INKEY$: GOTO 606 &lt;br /&gt;700 CLS:PRINT &quot;********客栈********&quot;;AAA$(2); &lt;br /&gt;710 T$=INKEY$ &lt;br /&gt;720 IF T$=&quot;n&quot; THEN 505 ELSE IF T$&lt;&gt;&quot;y&quot; THEN BEEP:710 &lt;br /&gt;730 IF MO&lt;200 THEN CLS:PRINT &quot;对不起！你没那么多钱啊！我们这不赊账！再见！&quot;:731 ELSE 735 &lt;br /&gt;731 T$=INKEY$: GOTO 505 &lt;br /&gt;735 FOR II=-1 TO 0: FOR I=0 TO 80: FOR J=1 TO 100:NEXT :LINE 0,I,160,I,(-2)*II:NEXT :NEXT &lt;br /&gt;740 MO=MO-200:MP=MPP:HP=HPP:CLS:PRINT &quot;欢迎下次再来！&quot;:T$=INKEY$: GOTO 505 &lt;br /&gt;800 IF Q&gt;5 THEN QT=QT+1:IF QT&gt;3 THEN QT=3 &lt;br /&gt;801 IF QT=3 THEN CLS:PRINT ZP$(7):T$=INKEY$:505 &lt;br /&gt;805 IF Q=5 AND QT=2 THEN CLS:PRINT ZP$(6);:T$=INKEY$:QT=3:505 &lt;br /&gt;820 CLS:PRINT ZP$(Q);:T$=INKEY$: GOTO 505 &lt;br /&gt;1100 G=G+7:H=H+7 &lt;br /&gt;1120 FOR J=1 TO 0 STEP -1: FOR JJ=0 TO 7:BOX G-JJ,H-JJ,G+JJ,H+JJ,1,J &lt;br /&gt;1130 FOR JJJ=1 TO 150:NEXT :NEXT :NEXT &lt;br /&gt;1135 RETURN &lt;br /&gt;1200 BOX 144,32,159,47:LOCATE 5,1:PRINT NB$(6);KP(6);&quot;/&quot;;KPP(6);: FOR I=1 TO 2500 &lt;br /&gt;1205 NEXT :IF Q=10 THEN 1206 ELSE 1210 &lt;br /&gt;1206 I=RND(1):IF I&gt;0.4 THEN 1240 &lt;br /&gt;1207 I=ABS(X(1)-X(6)):J=ABS(Y(1)-Y(6)):IF I=0 AND J=2 THEN 1245 &lt;br /&gt;1208 IF I=1 AND J=0 THEN 1245 ELSE 2019 &lt;br /&gt;1210 IF Y(1)=15 AND X(1)=3 THEN 1240 &lt;br /&gt;1211 IF Y(1)=17 THEN 1220 &lt;br /&gt;1212 IF Y(1)=19 THEN 1230 &lt;br /&gt;1213 GOTO 2019 &lt;br /&gt;1220 IF X(1)=2 OR X(1)=4 THEN 1240 &lt;br /&gt;1221 IF X(1)=3 THEN 1245 &lt;br /&gt;1222 GOTO 2019 &lt;br /&gt;1230 IF X(1)&lt;&gt;1 THEN 1245 &lt;br /&gt;1235 IF X(1)&gt;14 THEN 1240 &lt;br /&gt;1240 ON Q GOTO 1500,1600,1500,1600,1500,1600,1500,1600,1500,1700 &lt;br /&gt;1241 GG=Q*86+INT(RND(1)*(10-Q)*8): GOTO 2940 &lt;br /&gt;1245 GG=Q*69+INT(RND(1)*(10-Q)*3): GOTO 8400 &lt;br /&gt;1500 II=0:H=X(1)*16-8:G=Y(1)*8-3 &lt;br /&gt;1510 FOR I=20 TO 160 STEP 2:II=II+0.2:ELLIPSE I,31,II,II*2 &lt;br /&gt;1520 FOR J=1 TO 50:NEXT :NEXT &lt;br /&gt;1524 FOR I=-1 TO 0: FOR J=0 TO 7:CIRCLE G+4,H,J,1,-1*I: FOR II=1 TO 50:NEXT :NEXT :NEXT &lt;br /&gt;1530 GOSUB 9995: GOTO 1241 &lt;br /&gt;1600 FOR II=20 TO 120:I=0.23*II:J=0.08*II &lt;br /&gt;1610 DRAW II,35-I:DRAW II,33-J:DRAW II,29+J:DRAW II,27+I &lt;br /&gt;1620 FOR JJ=1 TO 5:NEXT :NEXT &lt;br /&gt;1630 FOR II=1 TO 0 STEP -1: FOR I=0 TO 7 &lt;br /&gt;1640 CIRCLE 120,8,I,1,II:CIRCLE 120,24,I,1,II:CIRCLE 120,40,I,1,II:CIRCLE 120,56,I,1,II &lt;br /&gt;1650 CIRCLE 136,8,I,1,II:CIRCLE 136,24,I,1,II:CIRCLE 136,40,I,1,II:CIRCLE 136,56,I,1,II &lt;br /&gt;1660 CIRCLE 152,8,I,1,II:CIRCLE 152,24,I,1,II:CIRCLE 152,40,I,1,II:CIRCLE 152,56,I,1,II &lt;br /&gt;1680 NEXT :NEXT :GOSUB 9995: GOTO 1241 &lt;br /&gt;1700 FOR I=144 TO 80 STEP -1:DRAW I,I*0.625-50:FOR II=1 TO 50 :NEXT:NEXT &lt;br /&gt;1702 FOR II=0 TO 60:LINE 76,II,84,II:FOR I=1 TO 50:NEXT:NEXT &lt;br /&gt;1705 FOR II=80 TO 160:LINE II,52,II,60:LINE 160-II,52,160-II,60:NEXT &lt;br /&gt;1710 FOR II=56 TO 6 STEP -16:FOR J=1 TO 0 STEP -1:FOR JJ=0 TO 7:FOR I= 8 TO 160 STEP 16 &lt;br /&gt;1715 CIRCLE I,II,JJ,1,J:NEXT:NEXT:NEXT:GOSUB 9995:NEXT &lt;br /&gt;1720 GOSUB 9995:GOTO 1241 &lt;br /&gt;1999 IF Q=10 THEN KP(6)=40000:KPP(6)=KP(6):2001 ELSE 2001 &lt;br /&gt;2000 X(1)=1:Y(1)=1:R=R+1:RR=0:NPC$(1)=RW$(1):KP(6)=Q*2678:KPP(6)=KP(6): GOTO 1999 &lt;br /&gt;2001 FOR I=2 TO 5:KP(I)=Q*50+R*10:J=INT(RND(1)*7)+4:NPC$(I)=RW$(J):NB$(I)=NA$(J):X(I)=I-1 &lt;br /&gt;2002 KPP(I)=KP(I):Y(I)=INT(RND(1)*10)*2+1:IF Y(I)=Y(1) AND X(I)=X(1) THEN 2002 &lt;br /&gt;2003 IF R=INT(R/5)*5 AND Y(I)=Y(6) AND X(I)=X(6) THEN 2002 &lt;br /&gt;2004 NEXT :GJL=Q*14+R*4:VW=4:WV=4:S=0 &lt;br /&gt;2005 GET #1,R+1:B=0:IF R=20 THEN A=1 &lt;br /&gt;2009 IF R&lt;&gt;INT(R/5)*5 THEN 2019 &lt;br /&gt;2010 NB$(6)=AE$(Q):IF R&lt;50 THEN 2015 &lt;br /&gt;2011 IF RR=1 THEN 2019 ELSE FOR I=1 TO 5:CLS:PRINT MZ$(I);:T$=INKEY$:NEXT :RR=0: GOTO 2019 &lt;br /&gt;2015 IF RR=0 THEN CLS:PRINT DR$(Q):T$=INKEY$:RR=1 &lt;br /&gt;2019 GOSUB 9995:IF VW=0 THEN RR=1:2001 &lt;br /&gt;2020 IF KP(6)&gt;0 THEN 2025 ELSE CLS:PRINT AE$(Q);&quot;被击败。&quot; &lt;br /&gt;2021 IF Q&lt;5 THEN PRINT &quot;得到&quot;;AE$(Q):LOCATE 2,9:PRINT &quot;灵珠&quot;;BE$(Q);: GOTO 2023 &lt;br /&gt;2022 IF R=50 THEN T$=INKEY$: GOTO 5100 &lt;br /&gt;2023 T$=INKEY$: GOTO 500 &lt;br /&gt;2025 FOR I=1 TO 4: FOR J=1 TO 19 STEP 2:WZ(I,J)=0:NEXT :NEXT &lt;br /&gt;2028 FOR I=2 TO 5:IF KP(I)=0 THEN 2029 ELSE WZ(X(I),Y(I))=I &lt;br /&gt;2029 NEXT :IF R=INT(R/5)*5 THEN WZ(3,19)=6 &lt;br /&gt;2041 S=S+1:IF S=6 AND R=INT(R/5)*5 THEN 1200 &lt;br /&gt;2042 IF S=1 THEN 3000 ELSE IF S&gt;5 THEN S=0:2041 ELSE IF KP(S)=0 THEN 2041 &lt;br /&gt;2043 GG=GJL: GOTO 2051 &lt;br /&gt;2050 GOTO 2019 &lt;br /&gt;2051 GOSUB 9994 &lt;br /&gt;2052 LOCATE 5,1:PRINT NB$(S);KP(S);&quot;/&quot;;KPP(S);&quot; &quot;;:C=Y(S)*8-8:D=X(S)*16-16 &lt;br /&gt;2053 BOX C,D,C+15,D+15:IF X(S)&gt;X(1) AND Y(S)&gt;Y(1) THEN 2100 &lt;br /&gt;2055 IF X(S)&gt;X(1) AND Y(S)=Y(1) THEN 2200 &lt;br /&gt;2060 IF X(S)&gt;X(1) AND Y(S)&lt;Y(1) THEN 2300 &lt;br /&gt;2065 IF X(S)=X(1) AND Y(S)&gt;Y(1) THEN 2400 &lt;br /&gt;2070 IF X(S)=X(1) AND Y(S)&lt;Y(1) THEN 2500 &lt;br /&gt;2075 IF X(S)&lt;X(1) AND Y(S)&gt;Y(1) THEN 2600 &lt;br /&gt;2080 IF X(S)&lt;X(1) AND Y(S)=Y(1) THEN 2700 &lt;br /&gt;2085 IF X(S)&lt;X(1) AND Y(S)&lt;Y(1) THEN 2800 &lt;br /&gt;2100 E=ABS(X(1)-X(S)):F=ABS(Y(1)-Y(S))/2 &lt;br /&gt;2110 IF E+F&gt;3 THEN 2150 &lt;br /&gt;2120 IF E=1 AND F=2 THEN GOSUB 7000: GOTO 8800 &lt;br /&gt;2130 IF E=1 AND F=1 THEN GOSUB 7050: GOTO 8800 &lt;br /&gt;2140 IF E=2 AND F=1 THEN GOSUB 7100: GOTO 8800 &lt;br /&gt;2150 IF E=1 THEN GOSUB 7600: GOTO 2050 &lt;br /&gt;2160 IF E&gt;1 THEN GOSUB 7650: GOTO 2050 &lt;br /&gt;2200 E=ABS(X(1)-X(S)) &lt;br /&gt;2220 IF E=1 THEN 8800 &lt;br /&gt;2230 IF E=2 THEN GOSUB 8000: GOTO 8800 &lt;br /&gt;2240 IF E=3 THEN GOSUB 8050: GOTO 8800 &lt;br /&gt;2300 E=ABS(X(1)-X(S)):F=ABS(Y(1)-Y(S))/2 &lt;br /&gt;2310 IF E+F&gt;3 THEN 2350 &lt;br /&gt;2320 IF E=1 AND F=2 THEN GOSUB 7150: GOTO 8800 &lt;br /&gt;2330 IF E=1 AND F=1 THEN GOSUB 7200: GOTO 8800 &lt;br /&gt;2340 IF E=2 AND F=1 THEN GOSUB 7250: GOTO 8800 &lt;br /&gt;2350 IF E=1 THEN GOSUB 7700: GOTO 2050 &lt;br /&gt;2360 IF E&gt;1 THEN GOSUB 7750: GOTO 2050 &lt;br /&gt;2400 F=ABS(Y(1)-Y(S))/2:E=0 &lt;br /&gt;2420 IF F=1 THEN E=1:8800 &lt;br /&gt;2430 IF F=2 THEN GOSUB 8100: GOTO 8800 &lt;br /&gt;2440 IF F=3 THEN GOSUB 8150: GOTO 8800 &lt;br /&gt;2450 GOSUB 8600: GOTO 2050 &lt;br /&gt;2500 F=ABS(Y(1)-Y(S))/2:E=0 &lt;br /&gt;2520 IF F=1 THEN E=1:8800 &lt;br /&gt;2530 IF F=2 THEN GOSUB 8200: GOTO 8800 &lt;br /&gt;2540 IF F=3 THEN GOSUB 8250: GOTO 8800 &lt;br /&gt;2550 GOSUB 8500: GOTO 2050 &lt;br /&gt;2600 E=ABS(X(1)-X(S)):F=ABS(Y(1)-Y(S))/2 &lt;br /&gt;2610 IF E+F&gt;3 THEN 2650 &lt;br /&gt;2620 IF E=1 AND F=2 THEN GOSUB 7300: GOTO 8800 &lt;br /&gt;2630 IF E=1 AND F=1 THEN GOSUB 7350: GOTO 8800 &lt;br /&gt;2640 IF E=2 AND F=1 THEN GOSUB 7400: GOTO 8800 &lt;br /&gt;2650 IF E=1 THEN GOSUB 7800: GOTO 2050 &lt;br /&gt;2660 IF E&gt;1 THEN GOSUB 7850: GOTO 2050 &lt;br /&gt;2700 E=ABS(X(1)-X(S)):F=ABS(Y(1)-Y(S))/2 &lt;br /&gt;2720 IF E=1 THEN 8800 &lt;br /&gt;2730 IF E=2 THEN GOSUB 8300: GOTO 8800 &lt;br /&gt;2740 IF E=3 THEN GOSUB 8350: GOTO 8800 &lt;br /&gt;2800 E=ABS(X(1)-X(S)):F=ABS(Y(1)-Y(S))/2 &lt;br /&gt;2810 IF E+F&gt;3 THEN 2850 &lt;br /&gt;2820 IF E=1 AND F=2 THEN GOSUB 7450: GOTO 8800 &lt;br /&gt;2830 IF E=1 AND F=1 THEN GOSUB 7500: GOTO 8800 &lt;br /&gt;2840 IF E=2 AND F=1 THEN GOSUB 7550: GOTO 8800 &lt;br /&gt;2850 IF E=1 THEN GOSUB 7900: GOTO 2050 &lt;br /&gt;2860 IF E&gt;1 THEN GOSUB 7950: GOTO 2050 &lt;br /&gt;2900 X(S)=X(S)-1:GOSUB 9995: FOR JJ=1 TO 1000:NEXT :RETURN &lt;br /&gt;2910 X(S)=X(S)+1:GOSUB 9995: FOR JJ=1 TO 1000:NEXT :RETURN &lt;br /&gt;2920 Y(S)=Y(S)-2:GOSUB 9995: FOR JJ=1 TO 1000:NEXT :RETURN &lt;br /&gt;2930 Y(S)=Y(S)+2:GOSUB 9995: FOR JJ=1 TO 1000:NEXT :RETURN &lt;br /&gt;2940 GOSUB 9995:HPPP=GG+INT(RND(1)*DJ/2):HP=HP-HPPP:IF HP&gt;0 THEN 2950 ELSE 2960 &lt;br /&gt;2950 GOSUB 9994:LOCATE 5,1:PRINT &quot;你的体力下降了&quot;;HPPP;: FOR I=1 TO 1500:NEXT : GOTO 2025 &lt;br /&gt;2960 CLS:LOCATE 2,5:PRINT &quot;你的体力不支，&quot;,&quot; 昏了过去……&quot; &lt;br /&gt;2970 FOR I=0 TO 80:LINE 0,I,160,I,2: FOR J=0 TO 100:NEXT :NEXT &lt;br /&gt;2980 T$=INKEY$:CLOSE #1:POKE 199,155 &lt;br /&gt;3000 W=0:V=0 &lt;br /&gt;3005 GOSUB 9994 &lt;br /&gt;3006 LOCATE 5,1:PRINT NA$(1);&quot;HP:&quot;;HP;&quot;/&quot;;HPP; &lt;br /&gt;3010 T=ASC(INKEY$):IF (T&gt;19 AND T&lt;24) OR (T=13 OR T=113) THEN 3020 ELSE BEEP:3010 &lt;br /&gt;3020 IF T=13 THEN T=24 &lt;br /&gt;3025 IF T=113 THEN T=25 &lt;br /&gt;3030 ON T-19 GOTO 3100,3200,3400,3300,3600,3040 &lt;br /&gt;3040 GOSUB 9900: GOSUB 9995:GOTO 3006 &lt;br /&gt;3100 X(S)=X(S)-1:W=W-1:IF X(S)=0 THEN BEEP:X(S)=1:W=W+1 &lt;br /&gt;3102 IF ABS(W)+ABS(V)&gt;3 OR WZ(X(S),Y(S))&gt;0 THEN X(S)=X(S)+1:W=W+1:BEEP:3010 &lt;br /&gt;3110 GOSUB 9995: GOTO 3010 &lt;br /&gt;3200 X(S)=X(S)+1:W=W+1:IF X(S)=5 THEN BEEP:X(S)=4:W=W-1 &lt;br /&gt;3210 IF ABS(W)+ABS(V)&gt;3 OR WZ(X(S),Y(S))&gt;0 THEN X(S)=X(S)-1:W=W-1:BEEP:3010 &lt;br /&gt;3220 IF X(S)=4 AND Y(S)=19 AND R&lt;&gt;INT(R/5)*5 THEN RR=0:2000 &lt;br /&gt;3226 GOSUB 9995: GOTO 3010 &lt;br /&gt;3300 Y(S)=Y(S)-2:V=V-1:IF Y(S)&lt;1 THEN BEEP:Y(S)=1:V=V+1 &lt;br /&gt;3310 IF ABS(W)+ABS(V)&gt;3 OR WZ(X(S),Y(S))&gt;0 THEN Y(S)=Y(S)+2:V=V+1:BEEP:3010 &lt;br /&gt;3326 GOSUB 9995: GOTO 3010 &lt;br /&gt;3400 Y(S)=Y(S)+2:V=V+1:IF Y(S)&gt;19 THEN BEEP:Y(S)=19:V=V-1 &lt;br /&gt;3410 IF ABS(W)+ABS(V)&gt;3 OR WZ(X(S),Y(S))&gt;0 THEN Y(S)=Y(S)-2:V=V-1:BEEP:3010 &lt;br /&gt;3425 IF X(S)=4 AND Y(S)=19 AND R&lt;&gt;INT(R/5)*5 THEN RR=0:2000 &lt;br /&gt;3426 GOSUB 9995: GOTO 3010 &lt;br /&gt;3500 GOSUB 9400: GOTO 3005 &lt;br /&gt;3600 GOSUB 9994:LOCATE 5,1:PRINT &quot;①攻 ②法 ③物 ④防&quot;; &lt;br /&gt;3610 T$=INKEY$:IF T$=CHR$(27) THEN 3005 &lt;br /&gt;3611 GOSUB 10:ON T GOTO 3670,3900,3660,3620:BEEP: GOTO 3610 &lt;br /&gt;3620 U=0: GOTO 2019 &lt;br /&gt;3660 GOSUB 9400:GOSUB 9995:IF T$=&quot;Y&quot; THEN 2019 ELSE 3600 &lt;br /&gt;3670 PP=1=5 &lt;br /&gt;3700 IF X(1)-1=0 THEN 3702 &lt;br /&gt;3701 IF WZ(X(1)-1,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)-1,Y(1)) &lt;br /&gt;3702 IF X(1)+1=5 THEN 3704 &lt;br /&gt;3703 IF WZ(X(1)+1,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)+1,Y(1)) &lt;br /&gt;3704 IF Y(1)-2&lt;0 THEN 3706 &lt;br /&gt;3705 IF WZ(X(1),Y(1)-2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)-2) &lt;br /&gt;3706 IF Y(1)+2=21 THEN 3708 &lt;br /&gt;3707 IF WZ(X(1),Y(1)+2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)+2) &lt;br /&gt;3708 K=1 &lt;br /&gt;3709 IF PP=2 AND MP&lt;MF(1) THEN BEEP:LOCATE 5,1:PRINT NDFL$;:T$=INKEY$: GOTO 3600 &lt;br /&gt;3712 IF U&gt;0 THEN 3714 &lt;br /&gt;3713 BEEP:LOCATE 5,1:PRINT &quot;目标不在范围内！ &quot;;:T$=INKEY$: GOTO 3600 &lt;br /&gt;3714 GOSUB 9994:LOCATE 5,1:PRINT NB$(UU(K)); &lt;br /&gt;3715 PRINT KP(UU(K));&quot;/&quot;;KPP(UU(K));:G=Y(UU(K))*8-8 &lt;br /&gt;3716 H=X(UU(K))*16-16:BOX G,H,G+15,H+15 &lt;br /&gt;3717 T=ASC(INKEY$):IF (T&gt;19 AND T&lt;24) OR (T=27 OR T=13) THEN 3719 ELSE BEEP:3717 &lt;br /&gt;3719 IF T=27 THEN U=0:3600 &lt;br /&gt;3720 IF U=0 THEN 3712 &lt;br /&gt;3725 IF T&lt;&gt;13 THEN 3735 &lt;br /&gt;3726 IF T=13 THEN ON PP GOTO 3730,6001 &lt;br /&gt;3730 IF T=13 THEN GOSUB 1100:GGLL=GGL &lt;br /&gt;3731 KP=KP(UU(K)):KPPP=GGLL+INT(RND(1)*DJ) &lt;br /&gt;3732 KP(UU(K))=KP(UU(K))-KPPP:IF KP(UU(K))&gt;0 THEN 3733 ELSE 3790 &lt;br /&gt;3733 GOSUB 9995:GOSUB 9994:LOCATE 5,1:PRINT NPC$(UU(K));&quot;体力下降了&quot;;KPPP;:T$=INKEY$: GOTO 3820&lt;br /&gt;3735 K=K+1:BOX G,H,G+15,H+15,0,2:IF K&gt;U THEN K=1 &lt;br /&gt;3740 ON P GOTO 3714,3714,6536,6940,3714 &lt;br /&gt;3790 WV=VW &lt;br /&gt;3791 KP(UU(K))=0:JP=KPP(UU(K))+INT(RND(1)*DJ):JY=JY+JP:WZ(X(UU(K)),Y(UU(K)))=0:VW=VW-1 &lt;br /&gt;3792 I=INT(RND(1)*200):IF I&gt;49 THEN MO=MO+INT(KPP(UU(K))/7)+INT(RND(1)*(DJ/2)):PC$=&quot;金币&quot; &lt;br /&gt;3795 IF I=49 THEN YPS(3)=YPS(3)+1:PC$=YP$(3) &lt;br /&gt;3797 IF I=48 THEN YPS(6)=YPS(6)+1:PC$=YP$(6) &lt;br /&gt;3801 IF I&lt;48 AND I&gt;26 THEN YPS(4)=YPS(4)+1:PC$=YP$(4) &lt;br /&gt;3802 IF I&lt;27 AND I&gt;5 THEN YPS(1)=YPS(1)+1:PC$=YP$(1) &lt;br /&gt;3803 IF I&lt;6 AND I&gt;2 THEN YPS(2)=YPS(2)+1:PC$=YP$(2) &lt;br /&gt;3805 IF I&lt;3 THEN YP(5)=YP(5)+1:PC$=YP$(5) &lt;br /&gt;3806 IF UU(K)&lt;6 THEN 3808 ELSE LOCATE 5,1:PRINT NB$(6);:LOCATE 5,9:PRINT &quot;被打败了！&quot;; &lt;br /&gt;3807 T$=INKEY$:LOCATE 5,1: GOTO 3809 &lt;br /&gt;3808 GOSUB 9995:LOCATE 5,1:PRINT NB$(UU(K));&quot;被打败了！&quot;;:T$=INKEY$:LOCATE 5,1 &lt;br /&gt;3809 PRINT &quot;得到&quot;;PC$;&quot; &quot;;:T$=INKEY$:LOCATE 5,1:PRINT &quot;获得经验值&quot;;JP; &lt;br /&gt;3810 T$=INKEY$:IF JY&gt;=JYZ THEN GOSUB 4100 &lt;br /&gt;3820 IF P=3 THEN 6536 ELSE IF P=4 THEN 6940 ELSE 3620 &lt;br /&gt;3900 P=1:GOSUB 9994 &lt;br /&gt;3910 LOCATE 5,1:PRINT MF$(P);&quot; &quot;; &lt;br /&gt;3920 T=ASC(INKEY$):IF T=20 OR T=21 OR T=13 OR T=27 THEN 3921 ELSE 3920 &lt;br /&gt;3921 IF T=21 THEN P=P+1:IF P&gt;4 THEN BEEP:P=4:3920 &lt;br /&gt;3922 IF T=20 THEN P=P-1:IF P&lt;1 THEN BEEP:P=1:3920 &lt;br /&gt;3923 IF T=27 THEN GOSUB 9995: GOTO 3600 &lt;br /&gt;3924 IF T&lt;&gt;13 THEN 3910 &lt;br /&gt;3925 ON P GOTO 6000,6400,6400,6900 &lt;br /&gt;4100 I=HPP:J=MPP:G=GGL:GOSUB 4101:GOTO 4110 &lt;br /&gt;4101 DJ=DJ+1:JYZ=DJ*300-200:HPP=DJ*38+50-DJ*4:MPP=DJ*19+(40-DJ*6):GGL=DJ*21+(40-DJ*9) &lt;br /&gt;4105 HP=HPP:MP=MPP:RETURN &lt;br /&gt;4110 LOCATE 5,1:PRINT &quot;你升级了！&quot;;DJ;&quot;级 &quot;;:T$=INKEY$:JY=0:GOSUB 9994 &lt;br /&gt;4111 LOCATE 5,1:PRINT &quot;体力＋&quot;;HPP-I;:T$=INKEY$:GOSUB 9994 &lt;br /&gt;4112 LOCATE 5,1:PRINT &quot;法力＋&quot;;MPP-J;:T$=INKEY$:GOSUB 9994 &lt;br /&gt;4113 LOCATE 5,1:PRINT &quot;攻击力＋&quot;;GGL-G;:T$=INKEY$ &lt;br /&gt;4115 RETURN &lt;br /&gt;4500 G=2: GOTO 601 &lt;br /&gt;4550 IF YPS(PP)&lt;=0 THEN BEEP: GOTO 620 &lt;br /&gt;4560 YPS(PP)=YPS(PP)-1:MO=MO+INT(YP(PP)/2): GOTO 606 &lt;br /&gt;5000 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ; &lt;br /&gt;5002 LOCATE 1,3:PRINT &quot;※※※※※※※&quot;;:LOCATE 3,1:PRINT RW$(1); &lt;br /&gt;5004 LOCATE 2,19:PRINT RW$(2);:LOCATE 3,19:PRINT &quot;&quot;;: FOR I=1 TO 5000:NEXT &lt;br /&gt;5006 FOR I=1 TO 2:CLS:PRINT GZ$(I);:T$=INKEY$:NEXT &lt;br /&gt;5008 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ; &lt;br /&gt;5010 LOCATE 1,3:PRINT &quot;※※※※※※※&quot;;:LOCATE 3,1:PRINT RW$(1); &lt;br /&gt;5011 LOCATE 3,19:PRINT &quot;&quot;;:LOCATE 2,19:PRINT RW$(2); &lt;br /&gt;5012 LOCATE 3,3:PRINT &quot;&quot;;:LOCATE 4,3:PRINT &quot;&quot;;: FOR I=1 TO 2000:NEXT &lt;br /&gt;5014 FOR I=3 TO 13 STEP 2 &lt;br /&gt;5016 LOCATE 3,I:PRINT &quot;※&quot;;:LOCATE 4,I:PRINT &quot;※&quot;; &lt;br /&gt;5020 FOR J=1 TO 2000:NEXT :NEXT &lt;br /&gt;5022 LOCATE 3,15:PRINT &quot;※※※&quot;;:LOCATE 4,15:PRINT &quot;※※※&quot;;: FOR I=1 TO 5000 &lt;br /&gt;5024 NEXT : FOR I=3 TO 9 STEP 2:II=20-I &lt;br /&gt;5026 LOCATE 3,I-2:PRINT &quot;※&quot;; &lt;br /&gt;5028 LOCATE 2,II:PRINT &quot;※&quot;; &lt;br /&gt;5030 FOR J=1 TO 2000:NEXT :NEXT :LOCATE 3,9:PRINT &quot;※&quot;; &lt;br /&gt;5031 LOCATE 2,9:PRINT RW$(1): FOR I=1 TO 5000:NEXT &lt;br /&gt;5032 FOR I=3 TO 5:CLS:PRINT GZ$(I):T$=INKEY$:NEXT &lt;br /&gt;5034 CLS:PRINT MAP$(2);:POKE 803,BB:PRINT ; &lt;br /&gt;5036 FOR I=5 TO 2 STEP -1: FOR J=1 TO 2000:NEXT :II=I+1:IF II&gt;5 THEN II=5 &lt;br /&gt;5038 LOCATE II,11:PRINT &quot; &quot;;:LOCATE I,11:PRINT RW$(3);:NEXT &lt;br /&gt;5040 CLS:PRINT WG$(1);:T$=INKEY$ &lt;br /&gt;5042 CLS:PRINT MAP$(2);:POKE 803,BB:PRINT ;:LOCATE 3,11:PRINT RW$(3); &lt;br /&gt;5044 FOR I=1 TO 3: FOR J=1 TO 2000:NEXT &lt;br /&gt;5046 ON I GOTO 5048,5050,5052 &lt;br /&gt;5048 LOCATE 3,11:PRINT RW$(3): GOTO 5054 &lt;br /&gt;5050 LOCATE 4,11:PRINT RW$(3);:LOCATE 3,11:PRINT &quot; &quot;;: GOTO 5054 &lt;br /&gt;5052 LOCATE 4,13:PRINT RW$(3);:LOCATE 4,11:PRINT &quot; &quot;; &lt;br /&gt;5054 NEXT :LOCATE 5,11:PRINT RW$(2);: FOR I=1 TO 2000:NEXT &lt;br /&gt;5055 LOCATE 4,11:PRINT RW$(2);:LOCATE 5,11:PRINT RW$(1);: FOR I=1 TO 2000:NEXT &lt;br /&gt;5056 LOCATE 3,11:PRINT RW$(2);:LOCATE 4,11:PRINT RW$(1):LOCATE 5,11:PRINT &quot; &quot;; &lt;br /&gt;5058 FOR I=1 TO 2000:NEXT &lt;br /&gt;5060 FOR I=2 TO 6:CLS:PRINT WG$(I);:T$=INKEY$:NEXT &lt;br /&gt;5062 A=0:X=3:Y=11:QT=2 : GOTO 505 &lt;br /&gt;5100 CLS:PRINT MAP$(1);:POKE 803,AA:PRINT ; &lt;br /&gt;5102 LOCATE 1,3:PRINT &quot;※※※※※※※&quot;; &lt;br /&gt;5104 LOCATE 4,1:PRINT RW$(2);:LOCATE 4,19:PRINT RW$(1);: FOR I=1 TO 2000:NEXT &lt;br /&gt;5106 FOR I=3 TO 9 STEP 2:II=20-I &lt;br /&gt;5108 LOCATE 4,I-2:PRINT &quot;※&quot;;:LOCATE 4,II:PRINT &quot;※&quot;; &lt;br /&gt;5110 FOR J=1 TO 2000:NEXT :NEXT &lt;br /&gt;5112 FOR I=1 TO 10:CIRCLE 79+I,48-I*3,I,1:CIRCLE 81-I,48-I*3,I,1 &lt;br /&gt;5114 FOR J=1 TO 400:NEXT :NEXT :T$=INKEY$:LOCATE 3,8:PRINT &quot;全剧终&quot;:T$=INKEY$ &lt;br /&gt;5116 FOR I=0 TO 80:LINE I,0,I,80:LINE 160-I,0,160-I,80:NEXT : FOR I=1 TO 2000:NEXT &lt;br /&gt;5118 GOTO 9800 &lt;br /&gt;6000 PP=2: GOTO 3700 &lt;br /&gt;6001 G=Y(UU(K))*8-5:H=X(UU(K))*16-8 &lt;br /&gt;6010 FOR I=0 TO 63:LINE G,I,G+8,I: FOR J=1 TO 50:NEXT :NEXT &lt;br /&gt;6020 FOR I=-1 TO 0: FOR J=0 TO 7:CIRCLE G+4,H,J,1,-1*I: FOR II=1 TO 50:NEXT :NEXT :NEXT &lt;br /&gt;6030 GGLL=XG(1):MP=MP-MF(1):GOSUB 9995: GOTO 3731 &lt;br /&gt;6100 G=Y(UU(K))*8:H=X(UU(K))*16-8: FOR I=7 TO 55 STEP 4 &lt;br /&gt;6110 CIRCLE G,I,8,0,1: FOR J=1 TO 150:NEXT :NEXT &lt;br /&gt;6115 FOR I=-1 TO 0: FOR J=0 TO 7:CIRCLE G,H,J,1,-1*I &lt;br /&gt;6120 FOR II=1 TO 100:NEXT :NEXT :NEXT &lt;br /&gt;6130 RETURN &lt;br /&gt;6200 G(1)=Y(UU(K))*8-2:H(1)=X(UU(K))*16-8 &lt;br /&gt;6210 G(2)=G(1)-16:H(2)=H(1):IF G(2)&lt;0 THEN G(2)=G(1) &lt;br /&gt;6220 G(3)=G(1):H(3)=H(1)-16:IF H(3)&lt;0 THEN H(3)=H(1) &lt;br /&gt;6230 G(4)=G(1):H(4)=H(1)+16:IF H(4)&gt;60 THEN H(4)=H(1) &lt;br /&gt;6240 G(5)=G(1)+16:H(5)=H(1):IF G(5)&gt;160 THEN G(5)=G(1) &lt;br /&gt;6250 FOR I=-1 TO 0: FOR J=0 TO 7: FOR II=1 TO 5 &lt;br /&gt;6255 CIRCLE G(II),H(II),J,1,-1*I:NEXT &lt;br /&gt;6260 FOR JJ=1 TO 20:NEXT :NEXT :NEXT &lt;br /&gt;6270 RETURN &lt;br /&gt;6300 GOTO 6900 &lt;br /&gt;6310 FOR III=1 TO 10:G=INT(RND(1)*120)+20:H=INT(RND(1)*24)+20:I=INT(RND(1)*10)+10 &lt;br /&gt;6315 FOR II=1 TO 0 STEP -1: FOR J=0 TO I:CIRCLE G,H,J,1,II &lt;br /&gt;6320 NEXT :NEXT :GOSUB 9995:NEXT :MP=MP-MF(4) &lt;br /&gt;6330 RETURN &lt;br /&gt;6400 U=0:K=1:IF MP&lt;MF(P) THEN BEEP:LOCATE 5,1:PRINT NDFL$;:T$=INKEY$:3600 &lt;br /&gt;6402 U=0:K=1:IF X(1)-2&lt;1 THEN 6405 &lt;br /&gt;6404 IF WZ(X(1)-2,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)-2,Y(1)) &lt;br /&gt;6405 IF X(1)-1=0 THEN 6416 &lt;br /&gt;6406 IF Y(1)-2&lt;0 THEN 6410 &lt;br /&gt;6408 IF WZ(X(1)-1,Y(1)-2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)-1,Y(1)-2) &lt;br /&gt;6410 IF WZ(X(1)-1,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)-1,Y(1)) &lt;br /&gt;6412 IF Y(1)+2&gt;19 THEN 6416 &lt;br /&gt;6414 IF WZ(X(1)-1,Y(1)+2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)-1,Y(1)+2) &lt;br /&gt;6416 IF Y(1)-4&lt;0 THEN 6420 &lt;br /&gt;6418 IF WZ(X(1),Y(1)-4)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)-4) &lt;br /&gt;6420 IF Y(1)-2&lt;0 THEN 6424 &lt;br /&gt;6422 IF WZ(X(1),Y(1)-2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)-2) &lt;br /&gt;6424 IF Y(1)+2&gt;19 THEN 6432 &lt;br /&gt;6426 IF WZ(X(1),Y(1)+2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)+2) &lt;br /&gt;6428 IF Y(1)+4&gt;19 THEN 6432 &lt;br /&gt;6430 IF WZ(X(1),Y(1)+4)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1),Y(1)+4) &lt;br /&gt;6432 IF X(1)+1&gt;4 THEN 6500 &lt;br /&gt;6434 IF Y(1)-2&lt;0 THEN 6438 &lt;br /&gt;6436 IF WZ(X(1)+1,Y(1)-2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)+1,Y(1)-2) &lt;br /&gt;6438 IF WZ(X(1)+1,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)+1,Y(1)) &lt;br /&gt;6440 IF Y(1)+2&gt;19 THEN 6444 &lt;br /&gt;6442 IF WZ(X(1)+1,Y(1)+2)&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)+1,Y(1)+2) &lt;br /&gt;6444 IF X(1)+2&gt;4 THEN 6500 &lt;br /&gt;6446 IF WZ(X(1)+2,Y(1))&lt;&gt;0 THEN U=U+1:UU(U)=WZ(X(1)+2,Y(1)) &lt;br /&gt;6500 IF K&gt;U THEN K=1:6506 ELSE IF U&gt;0 THEN 6506 &lt;br /&gt;6502 BEEP:LOCATE 5,1:PRINT &quot;目标不在范围内！&quot;;:T$=INKEY$: GOTO 3600 &lt;br /&gt;6506 GOSUB 9995:LOCATE 5,1:PRINT NB$(UU(K));KP(UU(K));&quot;/&quot;; &lt;br /&gt;6507 PRINT KPP(UU(K));:G=Y(UU(K))*8-8:H=X(UU(K))*16-16 &lt;br /&gt;6508 BOX G,H,G+15,H+15:IF P=2 THEN 6526 &lt;br /&gt;6510 IF X(UU(K))-1=0 THEN 6514 &lt;br /&gt;6512 BOX G,H-16,G+15,H-1 &lt;br /&gt;6514 IF X(UU(K))+1=5 THEN 6518 &lt;br /&gt;6516 BOX G,H+16,G+15,H+31 &lt;br /&gt;6518 IF Y(UU(K))-2&lt;0 THEN 6522 &lt;br /&gt;6520 BOX G-16,H,G-1,H+15 &lt;br /&gt;6522 IF Y(UU(K))+2&gt;19 THEN 6526 &lt;br /&gt;6524 BOX G+16,H,G+31,H+15 &lt;br /&gt;6526 T=ASC(INKEY$):IF (T&gt;19 AND T&lt;24) OR T=13 OR T=27 THEN 6528 ELSE BEEP:6526 &lt;br /&gt;6528 IF T=27 THEN U=0:3600 &lt;br /&gt;6530 IF T&lt;&gt;13 THEN K=K+1:6500 &lt;br /&gt;6534 IF T=13 AND P=2 THEN GOSUB 6100:GGLL=XG(2):MP=MP-MF(2): GOTO 3731 &lt;br /&gt;6535 IF T=13 AND P=3 THEN GOSUB 6200:GGLL=XG(3):M=0:N=UU(K):MP=MP-MF(3): GOTO 3731 &lt;br /&gt;6536 M=M+1:IF M&gt;4 THEN 3620 &lt;br /&gt;6537 FOR I=1 TO 4: FOR J=1 TO 19 STEP 2:WZ(I,J)=0:NEXT :NEXT &lt;br /&gt;6538 FOR I=2 TO 6:WZ(X(I),Y(I))=I &lt;br /&gt;6539 NEXT :ON M GOTO 6540,6544,6548,6552 &lt;br /&gt;6540 IF X(N)&gt;1 THEN IF WZ(X(N)-1,Y(N))&gt;1 THEN UU(K)=WZ(X(N)-1,Y(N)):3731 &lt;br /&gt;6542 GOTO 6536 &lt;br /&gt;6544 IF X(N)&lt;4 THEN IF WZ(X(N)+1,Y(N))&gt;1 THEN UU(K)=WZ(X(N)+1,Y(N)):3731 &lt;br /&gt;6546 GOTO 6536 &lt;br /&gt;6548 IF Y(N)&gt;1 THEN IF WZ(X(N),Y(N)-2)&gt;1 THEN UU(K)=WZ(X(N),Y(N)-2):3731 &lt;br /&gt;6550 GOTO 6536 &lt;br /&gt;6552 IF Y(N)&lt;19 THEN IF WZ(X(N),Y(N)+2)&gt;1 THEN UU(K)=WZ(X(N),Y(N)+2):3731 &lt;br /&gt;6554 GOTO 3620 &lt;br /&gt;6900 IF MP&lt;MF(4) THEN BEEP:LOCATE 5,1:PRINT NDFL$;:T$=INKEY$:3600 &lt;br /&gt;6910 GOSUB 6310:M=0 &lt;br /&gt;6915 M=M+1:IF KP(M)=0 THEN 6940 &lt;br /&gt;6920 IF M=6 AND R&lt;&gt;INT(R/5)*5 THEN 6940 &lt;br /&gt;6930 GGLL=XG(4):UU(K)=M: GOTO 3731 &lt;br /&gt;6940 IF M&lt;7 THEN 6915 ELSE 3620 &lt;br /&gt;7000 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7010 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2920:GOSUB 2900:RETURN &lt;br /&gt;7020 IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2920:E=0:RETURN &lt;br /&gt;7030 GOSUB 2900:E=0:RETURN &lt;br /&gt;7050 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2920:RETURN &lt;br /&gt;7060 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2900:RETURN &lt;br /&gt;7080 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2900:GOSUB 2900:E=0:RETURN &lt;br /&gt;7090 IF Y(1)&gt;1 THEN IF WZ(X(1)+1,Y(1)-2)=0 THEN GOSUB 2920:GOSUB 2920:E=0:RETURN &lt;br /&gt;7095 E=0:RETURN &lt;br /&gt;7100 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2920:GOSUB 2900:E=1:RETURN &lt;br /&gt;7110 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2900:GOSUB 2900:E=1:RETURN &lt;br /&gt;7120 IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2900:E=0:RETURN &lt;br /&gt;7130 GOSUB 2920:E=0:RETURN &lt;br /&gt;7150 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7160 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2930:GOSUB 2900:RETURN &lt;br /&gt;7170 IF WZ(X(1)+1,Y(1)-2)=0 THEN GOSUB 2930:E=0:RETURN &lt;br /&gt;7180 GOSUB 2900:E=0:RETURN &lt;br /&gt;7190 E=0:RETURN &lt;br /&gt;7200 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7210 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2900:RETURN &lt;br /&gt;7230 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-2)=0 THEN GOSUB 2900:GOSUB 2900:E=0:RETURN &lt;br /&gt;7240 IF Y(1)&lt;19 THEN IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2930:GOSUB 2930:E=0:RETURN &lt;br /&gt;7245 E=0:RETURN &lt;br /&gt;7250 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2930:GOSUB 2900:E=1:RETURN &lt;br /&gt;7260 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2900:GOSUB 2900:E=1:RETURN &lt;br /&gt;7270 IF WZ(X(1)+2,Y(1)+2)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7280 IF WZ(X(1)+1,Y(1)-2))=0 THEN GOSUB 2900:RETURN &lt;br /&gt;7300 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7310 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2910:GOSUB 2920:RETURN &lt;br /&gt;7320 IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2920:E=0:RETURN &lt;br /&gt;7330 GOSUB 2910:E=0:RETURN &lt;br /&gt;7350 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2920:RETURN &lt;br /&gt;7360 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7380 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2910:GOSUB 2910:E=0:RETURN &lt;br /&gt;7390 IF Y(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-2)=0 THEN GOSUB 2920:GOSUB 2920:E=0:RETURN &lt;br /&gt;7395 E=0:RETURN &lt;br /&gt;7400 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2920:GOSUB 2910:E=1:RETURN &lt;br /&gt;7410 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2910:GOSUB 2910:E=1:RETURN &lt;br /&gt;7420 IF WZ(X(1)-2,Y(1))=0 THEN GOSUB 2920:RETURN &lt;br /&gt;7430 IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7450 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7460 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2930:GOSUB 2910:RETURN &lt;br /&gt;7470 IF WZ(X(1)-1,Y(1)-2)=0 THEN GOSUB 2930:E=0:RETURN &lt;br /&gt;7480 IF WZ(X(1),Y(1)-4)=0 THEN GOSUB 2910:E=0:RETURN &lt;br /&gt;7490 E=0:RETURN &lt;br /&gt;7500 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7510 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7530 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)-2)=0 THEN GOSUB 2910:GOSUB 2910:E=0:RETURN &lt;br /&gt;7540 IF Y(1)&lt;19 THEN IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2930:GOSUB 2930:E=0:RETURN &lt;br /&gt;7545 E=0:RETURN &lt;br /&gt;7550 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2930:GOSUB 2910:E=1:RETURN &lt;br /&gt;7560 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2910:GOSUB 2910:E=1:RETURN &lt;br /&gt;7570 IF WZ(X(1)-2,Y(1))=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7580 IF WZ(X(1)-1,Y(1-2))=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7600 IF WZ(X(S),Y(S)-4)=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7610 IF WZ(X(S)-1,Y(S)-2)=0 THEN GOSUB 2920:GOSUB 2900:RETURN &lt;br /&gt;7620 IF WZ(X(S),Y(S)-2)=0 THEN GOSUB 2920:RETURN &lt;br /&gt;7630 GOSUB 2900:RETURN &lt;br /&gt;7650 IF WZ(X(S)-1,Y(S)-2)=0 THEN GOSUB 2920:GOSUB 2900:RETURN &lt;br /&gt;7660 IF Y(S)&gt;3 THEN IF WZ(X(S),Y(S)-4)=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7670 IF WZ(X(S)-2,Y(S))=0 THEN GOSUB 2900:GOSUB 2900:RETURN &lt;br /&gt;7680 I=RND(1):IF I&gt;0.5 THEN 7690 &lt;br /&gt;7685 GOSUB 2900:RETURN &lt;br /&gt;7690 GOSUB 2920:RETURN &lt;br /&gt;7700 IF WZ(X(S),Y(S)+4)=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7710 IF WZ(X(S)-1,Y(S)+2)=0 THEN GOSUB 2930:GOSUB 2900:RETURN &lt;br /&gt;7720 IF WZ(X(S),Y(S)+2)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7730 GOSUB 2900:RETURN &lt;br /&gt;7750 IF WZ(X(S)-1,Y(S)+2)=0 THEN GOSUB 2930:GOSUB 2900:RETURN &lt;br /&gt;7760 IF Y(S)&lt;17 THEN IF WZ(X(S),Y(S)+4)=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7770 IF WZ(X(S)-2,Y(S))=0 THEN GOSUB 2900:GOSUB 2900:RETURN &lt;br /&gt;7780 I=RND(1):IF I&gt;0.5 THEN 7790 &lt;br /&gt;7785 GOSUB 2930:RETURN &lt;br /&gt;7790 GOSUB 2900:RETURN &lt;br /&gt;7800 IF WZ(X(S),Y(S)-4)=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7810 IF WZ(X(S)+1,Y(S)-2)=0 THEN GOSUB 2920:GOSUB 2910:RETURN &lt;br /&gt;7820 IF WZ(X(S),Y(S)-2)=0 THEN GOSUB 2920:RETURN &lt;br /&gt;7830 IF WZ(X(S)+1,Y(S))=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7850 IF WZ(X(S)+1,Y(S)-2)=0 THEN GOSUB 2920:GOSUB 2910:RETURN &lt;br /&gt;7860 IF Y(S)&gt;3 THEN IF WZ(X(S),Y(S)-4)=0 THEN GOSUB 2920:GOSUB 2920:RETURN &lt;br /&gt;7870 IF WZ(X(S)+2,Y(S))=0 THEN GOSUB 2910:GOSUB 2910:RETURN &lt;br /&gt;7880 I=RND(1):IF I&gt;0.5 THEN 7890 &lt;br /&gt;7885 GOSUB 2910:RETURN &lt;br /&gt;7890 GOSUB 2920:RETURN &lt;br /&gt;7900 IF WZ(X(S),Y(S)+4)=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7910 IF WZ(X(S)+1,Y(S)+2)=0 THEN GOSUB 2930:GOSUB 2910:RETURN &lt;br /&gt;7920 IF WZ(X(S),Y(S)+2)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;7930 IF WZ(X(S)+1,Y(S))=0 THEN GOSUB 2910:RETURN &lt;br /&gt;7950 IF WZ(X(S)+1,Y(S)+2)=0 THEN GOSUB 2930:GOSUB 2910:RETURN &lt;br /&gt;7960 IF Y(S)&lt;17 THEN IF WZ(X(S),Y(S)+4)=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;7970 IF WZ(X(S)+2,Y(S))=0 THEN GOSUB 2910:GOSUB 2910:RETURN &lt;br /&gt;7980 I=RND(1):IF I&gt;0.5 THEN 7990 &lt;br /&gt;7985 GOSUB 2910:RETURN &lt;br /&gt;7990 GOSUB 2930:RETURN &lt;br /&gt;8000 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2900:E=1:RETURN &lt;br /&gt;8010 IF Y(1)&lt;19 THEN IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2900:GOSUB 2930:RETURN &lt;br /&gt;8020 IF Y(1)&gt;1 THEN IF WZ(X(1)+1,Y(1)-2)=0 THEN GOSUB 2900:GOSUB 2920:RETURN &lt;br /&gt;8030 IF Y(1)&lt;19 THEN IF WZ(X(1)+2,Y(1)+2)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;8040 IF Y(1)&gt;1 THEN IF WZ(X(1)+2,Y(1)-2)=0 THEN GOSUB 2920:RETURN &lt;br /&gt;8045 E=0:RETURN &lt;br /&gt;8050 IF WZ(X(1)+1,Y(1))=0 THEN GOSUB 2900:GOSUB 2900:E=1:RETURN &lt;br /&gt;8060 IF WZ(X(1)+2,Y(1))=0 THEN GOSUB 2900:RETURN &lt;br /&gt;8070 IF Y(1)&gt;1 THEN IF WZ(X(1)+2,Y(1)-2)=0 THEN GOSUB 2900:GOSUB 2920:RETURN &lt;br /&gt;8080 IF Y(1)&lt;19 THEN IF WZ(X(1)+2,Y(1)+2)=0 THEN GOSUB 2900:GOSUB 2930:RETURN &lt;br /&gt;8090 E=0:RETURN &lt;br /&gt;8100 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2920:E=1:RETURN &lt;br /&gt;8110 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2920:GOSUB 2900:E=0:RETURN &lt;br /&gt;8120 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)+2)=0 THEN GOSUB 2920:GOSUB 2910:E=0:RETURN &lt;br /&gt;8130 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)+4)=0 THEN GOSUB 2900:E=0:RETURN &lt;br /&gt;8140 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)+4)=0 THEN GOSUB 2910:E=0:RETURN &lt;br /&gt;8145 E=0:RETURN &lt;br /&gt;8150 IF WZ(X(1),Y(1)+2)=0 THEN GOSUB 2920:GOSUB 2920:E=1:RETURN &lt;br /&gt;8160 IF WZ(X(1),Y(1)+4)=0 THEN GOSUB 2920:E=0:RETURN &lt;br /&gt;8170 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)+4)=0 THEN GOSUB 2900:GOSUB 2920:RETURN &lt;br /&gt;8180 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)+4)=0 THEN GOSUB 2910:GOSUB 2920:RETURN &lt;br /&gt;8190 E=0:RETURN &lt;br /&gt;8200 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2930:E=1:RETURN &lt;br /&gt;8210 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)-2)=0 THEN GOSUB 2930:GOSUB 2910:RETURN &lt;br /&gt;8220 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-2)=0 THEN GOSUB 2930:GOSUB 2900:RETURN &lt;br /&gt;8230 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)-4)=0 THEN GOSUB 2910:E=0:RETURN &lt;br /&gt;8240 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-4)=0 THEN GOSUB 2900:E=0:RETURN &lt;br /&gt;8245 E=0:RETURN &lt;br /&gt;8250 IF WZ(X(1),Y(1)-2)=0 THEN GOSUB 2930:GOSUB 2930:E=1:RETURN &lt;br /&gt;8260 IF WZ(X(1),Y(1)-4)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;8270 IF X(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-4)=0 THEN GOSUB 2900:GOSUB 2930:RETURN &lt;br /&gt;8280 IF X(1)&lt;4 THEN IF WZ(X(1)+1,Y(1)-4)=0 THEN GOSUB 2910:GOSUB 2930:RETURN &lt;br /&gt;8290 E=0:RETURN &lt;br /&gt;8300 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2910:E=1:RETURN &lt;br /&gt;8310 IF Y(1)&gt;1 THEN IF WZ(X(1)-1,Y(1)-2)=0 THEN GOSUB 2910:GOSUB 2920:RETURN &lt;br /&gt;8320 IF Y(1)&lt;19 THEN IF WZ(X(1)-1,Y(1)+2)=0 THEN GOSUB 2910:GOSUB 2930:RETURN &lt;br /&gt;8330 IF Y(1)&gt;1 THEN IF WZ(X(1)-2,Y(1)-2)=0 THEN GOSUB 2920:RETURN &lt;br /&gt;8340 IF Y(1)&lt;19 THEN IF WZ(X(1)-2,Y(1)+2)=0 THEN GOSUB 2930:RETURN &lt;br /&gt;8345 E=0:RETURN &lt;br /&gt;8350 IF WZ(X(1)-1,Y(1))=0 THEN GOSUB 2910:GOSUB 2910:E=1:RETURN &lt;br /&gt;8360 IF WZ(X(1)-2,Y(1))=0 THEN GOSUB 2910:RETURN &lt;br /&gt;8370 IF Y(1)&gt;1 THEN IF WZ(X(1)-2,Y(1)-2)=0 THEN GOSUB 2910:GOSUB 2920:RETURN &lt;br /&gt;8380 IF Y(1)&lt;19 THEN IF WZ(X(1)-2,Y(1)+2)=0 THEN GOSUB 2910:GOSUB 2930:RETURN &lt;br /&gt;8390 E=0:RETURN &lt;br /&gt;8400 IF X(1)-X(S)=0 THEN 8450 &lt;br /&gt;8410 I=Y(1)*8:J=X(1)*16-16: FOR III=-1 TO 0 &lt;br /&gt;8415 FOR II=0 TO 7:LINE I+II,J,I+II,J+15,III^2:LINE I-II,J,I-II,J+15,III^2 &lt;br /&gt;8420 FOR JJ=1 TO 100:NEXT :NEXT :NEXT : GOTO 2940 &lt;br /&gt;8450 I=Y(1)*8-8:J=X(1)*16-8: FOR III=-1 TO 0 &lt;br /&gt;8455 FOR II=0 TO 7:LINE I,J+II,I+15,J+II,III*III:LINE I,J-II,I+15,J-II,III*III &lt;br /&gt;8470 FOR JJ=1 TO 100:NEXT :NEXT :NEXT : GOTO 2940 &lt;br /&gt;8500 IF WZ(X(S),Y(S)+4)=0 THEN GOSUB 2930:GOSUB 2930:RETURN &lt;br /&gt;8510 IF WZ(X(S),Y(S)+2)=0 THEN GOSUB 2930:RETURN ELSE RETURN &lt;br /&gt;8600 IF WZ(X(S),Y(S)-4)=0 THEN GOSUB 2920:GOSUB 2920:E=0:RETURN &lt;br /&gt;8610 IF WZ(X(S),Y(S)-2)=0 THEN GOSUB 2920:RETURN ELSE RETURN &lt;br /&gt;8800 IF E=1 THEN 8400 ELSE 2050 &lt;br /&gt;9000 CLS:PRINT &quot;①存档一&quot;,&quot;②存档二&quot;,&quot;③存档三&quot;,&quot;④存档四&quot;,&quot;⑤存档五&quot;; &lt;br /&gt;9011 T$=INKEY$:IF (T$=&quot;b&quot;)+(T$=&quot;n&quot;)+(T$=&quot;m&quot;)+(T$=&quot;g&quot;)+(T$=&quot;h&quot;) THEN 9012 ELSE BEEP:9011 &lt;br /&gt;9012 GOSUB 10:LOCATE T,9:PRINT &quot;保存中…&quot;; &lt;br /&gt;9013 CLOSE #1:OPEN &quot;DJFMJsave&quot;+STR$(T) FOR OUTPUTAS#1 &lt;br /&gt;9020 WRITE #1,A,B,X,Y,MO,DJ,HP,HPP,MP,MPP,JY,JYZ,GGL,Q,R,M(1),N(1),QT,W,V &lt;br /&gt;9040 FOR I=2 TO 6:WRITE #1,KP(I),KPP(I):NEXT &lt;br /&gt;9050 FOR I=1 TO 6:WRITE #1,YPS(I):NEXT &lt;br /&gt;9060 FOR I=1 TO 5:WRITE #1,X(I),Y(I),WZ(X(I),Y(I)):NEXT :CLOSE #1:GOSUB 9175:RETURN &lt;br /&gt;9110 CLS:PRINT &quot;①存档一&quot;,&quot;②存档二&quot;,&quot;③存档三&quot;,&quot;④存档四&quot;,&quot;⑤存档五&quot;; &lt;br /&gt;9111 T$=INKEY$:IF (T$=&quot;b&quot;)+(T$=&quot;n&quot;)+(T$=&quot;m&quot;)+(T$=&quot;g&quot;)+(T$=&quot;h&quot;) THEN 9112 ELSE BEEP:9111 &lt;br /&gt;9112 GOSUB 10:LOCATE T,9:PRINT &quot;载入中…&quot;; &lt;br /&gt;9113 OPEN &quot;DJFMJsave&quot;+STR$(T) FOR INPUT AS#1 &lt;br /&gt;9120 INPUT #1,A,B,X,Y,MO,DJ,HP,HPP,MP,MPP,JY,JYZ,GGL,Q,R,M(1),N(1),QT,W,V &lt;br /&gt;9140 FOR I=2 TO 6:INPUT #1,KP(I),KPP(I):NEXT &lt;br /&gt;9150 FOR I=1 TO 6:INPUT #1,YPS(I):NEXT &lt;br /&gt;9160 FOR I=1 TO 5:INPUT #1,X(I),Y(I),WZ(X(I),Y(I)):NEXT &lt;br /&gt;9170 CLOSE #1:GOSUB 9175: GOTO 9180 &lt;br /&gt;9175 OPEN &quot;FMYXZMAP&quot; FOR RANDOM AS #1 LEN=128:FIELD #1,128 AS MAP$:RETURN &lt;br /&gt;9180 RR=0:IF B=1 THEN 505 ELSE CLS:GOTO 2050 &lt;br /&gt;9200 CLS:PRINT &quot;本程序由薛顺健开发设计，本着要把游戏做得更好的原则，但我的时间和精&quot;; &lt;br /&gt;9210 PRINT &quot;力有限，还望各位用户见谅！&quot;;:T$=INKEY$: GOTO 9300 &lt;br /&gt;9300 GET #1,56:CLS:PRINT MAP$;:GOSUB 9994 &lt;br /&gt;9320 T$=INKEY$:GOSUB 10 &lt;br /&gt;9325 IF T&lt;1 OR T&gt;6 THEN 9320 &lt;br /&gt;9330 I=1:ON T GOTO 9350,9360,9390,9500,9200,9800 &lt;br /&gt;9340 BEEP: GOTO 9320 &lt;br /&gt;9350 RETURN &lt;br /&gt;9360 P=1:CLS:PRINT &quot;*****&quot;;NA$(1);&quot;的状态&quot;;&quot;*****&quot;;: GOTO 9370 &lt;br /&gt;9365 T=ASC(INKEY$):IF T=20 OR T=21 OR T=27 THEN 9366 ELSE BEEP:9365 &lt;br /&gt;9366 IF T=20 THEN P=P-1:IF P=0 THEN BEEP:P=1:9365 &lt;br /&gt;9367 IF T=21 THEN P=P+1:IF P=3 THEN BEEP:P=2:9365 &lt;br /&gt;9368 IF T=27 AND I=1 THEN 9300 ELSE IF T=27 AND I=0 THEN 9900 &lt;br /&gt;9369 ON P GOTO 9370,9380 &lt;br /&gt;9370 LOCATE 2,1:PRINT SPC (69); &lt;br /&gt;9371 LOCATE 2,1:PRINT &quot;等级：&quot;;DJ;&quot;级&quot;,&quot;经验：&quot;;JY;&quot;/&quot;;JYZ,&quot;体力：&quot;;HP;&quot;/&quot;;HPP; &lt;br /&gt;9375 GOTO 9365 &lt;br /&gt;9380 LOCATE 2,1:PRINT SPC (69); &lt;br /&gt;9381 LOCATE 2,1:PRINT &quot;法力：&quot;;MP;&quot;/&quot;;MPP,&quot;攻击力：&quot;;GGL,&quot;金钱：&quot;;MO; &lt;br /&gt;9385 GOTO 9365 &lt;br /&gt;9390 CLS:PRINT &quot;①存档&quot;,&quot;②读档&quot; &lt;br /&gt;9391 T$=INKEY$:IF T$=&quot;b&quot; OR T$=&quot;n&quot; OR ASC(T$)=27 THEN 9392 ELSE BEEP:9391 &lt;br /&gt;9392 GOSUB 10:IF T=1 THEN GOSUB 9000: GOTO 9300 &lt;br /&gt;9393 IF T=2 THEN CLOSE #1: GOTO 9110 &lt;br /&gt;9394 IF ASC(T$)=27 THEN 9300 &lt;br /&gt;9400 CLS:PRINT &quot;①&quot;;YP$(1);&quot;×&quot;;:LOCATE 1,11:PRINT &quot;④&quot;;YP$(4);&quot;×&quot;; &lt;br /&gt;9401 LOCATE 2,1:PRINT &quot;②&quot;;YP$(2);&quot;×&quot;;:LOCATE 2,11:PRINT &quot;⑤&quot;;YP$(5);&quot;×&quot;; &lt;br /&gt;9402 LOCATE 3,1:PRINT &quot;③&quot;;YP$(3);&quot;×&quot;;:LOCATE 3,11:PRINT &quot;⑥&quot;;YP$(6);&quot;×&quot;; &lt;br /&gt;9403 LOCATE 4,15:PRINT RW$(1); &lt;br /&gt;9410 LOCATE 1,9:PRINT YPS(1);:LOCATE 1,19:PRINT YPS(4); &lt;br /&gt;9411 LOCATE 2,9:PRINT YPS(2);:LOCATE 2,19:PRINT YPS(5); &lt;br /&gt;9412 LOCATE 3,9:PRINT YPS(3);:LOCATE 3,19:PRINT YPS(6); &lt;br /&gt;9415 T$=INKEY$:GOSUB 10 &lt;br /&gt;9416 IF T$=CHR$(27) THEN S=1:9490 &lt;br /&gt;9417 GXX(T)=GX(T):GXX(3)=HPP-HP:GXX(6)=MPP-MP &lt;br /&gt;9418 IF T&lt;4 AND HPP&lt;HP+GX(T) THEN GXX(T)=HPP-HP &lt;br /&gt;9419 IF T&gt;3 AND MPP&lt;MP+GX(T) THEN GXX(T)=MPP-MP &lt;br /&gt;9420 IF YPS(T)=0 THEN BEEP:9415 &lt;br /&gt;9421 IF T&gt;3 AND MP=MPP THEN LOCATE 5,1:PRINT AAA$(5);:BEEP:9415 &lt;br /&gt;9422 IF T&lt;4 AND HP=HPP THEN LOCATE 5,1:PRINT AAA$(4);:BEEP:9415 &lt;br /&gt;9430 IF T&gt;3 THEN PR$=&quot;法力＋&quot;:MP=MP+GXX(T) ELSE PR$=&quot;体力＋&quot;:HP=HP+GXX(T) &lt;br /&gt;9460 YPS(T)=YPS(T)-1: FOR II=1 TO 0 STEP -1: FOR I=0 TO 9:CIRCLE 120,56,I,1,II &lt;br /&gt;9470 FOR J=1 TO 100:NEXT :NEXT :NEXT :LOCATE 4,15:PRINT RW$(1); &lt;br /&gt;9480 LOCATE 5,1:PRINT PR$;GXX(T);:T$=INKEY$:T$=&quot;Y&quot; &lt;br /&gt;9490 GOSUB 9994:RETURN &lt;br /&gt;9500 GOSUB 9400: GOTO 9300 &lt;br /&gt;9800 CLS:PRINT &quot; 程序设计：薛顺健 E-mail:wqstar028@mai l.china.com&quot; &lt;br /&gt;9810 PRINT &quot; QQ:12068232 有空请和我联系！&quot;; &lt;br /&gt;9820 T$=INKEY$:BOX 0,0,160,80,1,2:FOR I=1 TO 2000:NEXT:FOR I=0 TO 80 &lt;br /&gt;9821 BOX I,I/2,160-I,80-I/2,0,0:FOR J=1 TO 50 :NEXT:NEXT &lt;br /&gt;9825 CLS:LOCATE 2,7:PRINT &quot;谢谢使用！&quot;:LOCATE 3,9:PRINT &quot;再见！&quot; &lt;br /&gt;9830 FOR I=1 TO 4000:NEXT:POKE 199,155 &lt;br /&gt;9900 GET #1,55:CLS:PRINT MAP$;:LOCATE 5,16:PRINT &quot; &quot;;:I=0 &lt;br /&gt;9910 T$=INKEY$:GOSUB 10:ON T GOTO 9920,9360,9930,9800:BEEP: GOTO 9910 &lt;br /&gt;9920 GOSUB 9994:RETURN &lt;br /&gt;9930 GOSUB 9000: GOTO 9900 &lt;br /&gt;9994 LOCATE 5,1:PRINT &quot; &quot;;:RETURN &lt;br /&gt;9995 GET #1,R+1 &lt;br /&gt;9996 LOCATE 1,1:PRINT MAP$;:LOCATE X(1),Y(1):PRINT RW$(1);: FOR J=2 TO 5:IF KP(J)=0 THEN 9998 &lt;br /&gt;9997 LOCATE X(J),Y(J):PRINT NPC$(J); &lt;br /&gt;9998 NEXT :IF R=INT(R/5)*5 THEN WZ(3,19)=6 &lt;br /&gt;9999 RETURN&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;说到RPG的话，BBK上有个完成度还行的&lt;br /&gt;http://kfxsmxd.5d6d.com/bbs.php&lt;br /&gt;&lt;br /&gt;想怀旧的话，还有古物Apple][，不过自己是没有经历到那么久远的事情。&lt;br /&gt;SuperCard和QBasic/VB6是什么已经没有人在意了。&lt;br /&gt;&lt;br /&gt;不过现在这年头，拿Scratch或者PyGame或者Processing都不算复杂的事情，还天生跨平台。&lt;br /&gt;&lt;br /&gt;不过多少这些也只是小群体的自娱自乐罢了。&lt;br /&gt;&lt;br /&gt;说到RPG的话，当行为和氛围一致的时候是最有感觉的。哪怕仅仅是路过一片风景，也有其中蕴含的情感。 一路上考虑人物的培养和行动的选择与策略以及人物之间内心和态度的发展。&lt;br /&gt;----&lt;br /&gt;好吧，我想到 FF7/10 和 sola 了，当然风格和类型是不限于此了。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/2031923888519872409/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/2031923888519872409' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2031923888519872409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2031923888519872409'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/08/wqx.html' title='【挖一挖】WQX和单文件小游戏'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-8514323822263038132</id><published>2011-08-27T15:58:00.005+08:00</published><updated>2011-08-27T16:34:34.350+08:00</updated><title type='text'>【挖一挖】levelup.cn的论坛ACG小说版的某些内容</title><content type='html'>去年的时候从bingj.com的页面存档里挖出来的，现转过来做纪念。&lt;br /&gt;挖取的目标是http://archive.bbs.levelup.cn/showforum-67-(\d+).aspx&lt;br /&gt;挖取的结果是http://www.uudisc.com/group/10240/topic/37165&lt;br /&gt;以下的便是当初挖取结果的内容，不过那里也快挂了。 &lt;br /&gt;话说levelup也出过此方面的杂志，也已经早早的挂了，仅还可以搜索到目录。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[轻小说]《月兔的银色方舟》作者：[日]鴨志田一   &lt;br /&gt;[轻小说]《白山同学与黑色手提袋》第一卷 作者：[日铃木铃   &lt;br /&gt;[轻小说]《攻壳机动队——宇宙生化人》作者：[日]远藤明范   &lt;br /&gt;[游戏小说]《水仙》全一卷 作者：[日]片冈とも   &lt;br /&gt;[轻小说]《がく×ぶる》（第一卷）作者：[日]本田 透   &lt;br /&gt;[杂书？]《征服世界有可能的吗》作者：[日]冈田斗司夫   &lt;br /&gt;[轻小说]《莱茵河的囚徒》作者：[日]田中芳树   &lt;br /&gt;雛形   &lt;br /&gt;[轻小说]《杀×爱》作者：风见周（0~4）   &lt;br /&gt;[轻小说]《魔女宅急便》作者：角野荣子（全）   &lt;br /&gt;[轻小说]《新本格魔法少女莉丝佳》作者：西尾维新（1~2）   &lt;br /&gt;[輕小說]《狼與辛香料》作者：[日]支仓冻沙 （13+短篇）12/17更新   &lt;br /&gt;[轻小说] 《文学少女》作者：野村美月 （1-8+短篇 完）12/17日更新   &lt;br /&gt;[轻小说]《仰望半月的夜空》作者：桥本纺 （1-8卷+2短篇完结）   &lt;br /&gt;[轻小说]《离别的钢琴奏鸣曲 1~2》作者：杉井光 12/9更新第2卷   &lt;br /&gt;[轻小说] 这本轻小说真厉害！2009年前10名作品集合！   &lt;br /&gt;[轻小说]《超人家族一家和乐!? 》作者：桥本和也 （1～4）12/9更新第4卷   &lt;br /&gt;[轻小说]《电波系彼女 三卷全》作者：片山宪太郎   &lt;br /&gt;[轻小说]《冰箱上的洞》作者：KOMUGI   &lt;br /&gt;[轻小说]《初恋魔法电击》作者：明日香正太（1-9完整版 未完）   &lt;br /&gt;[排行榜] 这本轻小说真厉害2010   &lt;br /&gt;[轻小说]《电波男》作者：本田透（适合宅人群= =）   &lt;br /&gt;求书~~~~知道三毛的进来哈   &lt;br /&gt;[轻小说]《魔法少女奈叶》作者：都筑真纪（全）   &lt;br /&gt;[日本小说]《人间失格》作者：太宰治   &lt;br /&gt;[遊戲劇本]《真月譚月姬》作者：[日]奈须きのこ （完整版）   &lt;br /&gt;[遊戲小說]《格蘭蒂亞》作者：[日]細江ひろみ     &lt;br /&gt;[轻小说]《圣魔之血长篇+短篇》 作者：吉田直在   &lt;br /&gt;[轻小说] 《便·当 味噌炖青花鱼290元》作者：朝浦（第1卷未完）   &lt;br /&gt;[輕小說]《百花缭乱》作者：すずきぁきら（2卷未）11/30更新   &lt;br /&gt;[轻小说]《影≒光 Shadow Light》作者：影名浅海 （1~5）   &lt;br /&gt;[游戏相关] 《潜龙谍影 - Metal Gear Solid 官方小说》 &lt;br /&gt;[轻小说]《银盘万花筒》作者：海原零 （1~9）   &lt;br /&gt;[推理侦探]《白夜行》作者：东野圭吾   &lt;br /&gt;[轻小说]《神样家族》作者：桑岛由一 （1~7）   &lt;br /&gt;[合集小说]乙一作品集[共32篇]   &lt;br /&gt;[轻小说]《风之圣痕》作者：山门敬宏（1~6+短篇）   &lt;br /&gt;[轻小说]《空罐少女！》作者：蓝上陆/铃平ひろ （1~4）   &lt;br /&gt;[轻小说]《骷髅恋人》作者： 平坂读（1~5）   &lt;br /&gt;[轻小说]《眼镜男与断头少女》作者： 藤原祐 （1~2）   &lt;br /&gt;[妖怪小说]《巷说百物语》作者：京极夏彦（1~4完结）   &lt;br /&gt;[国产轻小说]《長安幻夜》原作：面堂兄 漫画：韩露（漫友人气连载）   &lt;br /&gt;[輕小說]《虚轴少女ResinCastMilk》作者：[日]藤原佑（1-5）   &lt;br /&gt;[漫画改编]《黑血》 原案/漫画：赵佳   &lt;br /&gt;[輕小說]《触摸魔女》作者：[日]镜裕之   &lt;br /&gt;银河铁道之夜   &lt;br /&gt;哈里7：哈里波特与死圣   &lt;br /&gt;[遊戲相關]《Tales of Symphonia 拉塔特斯克的骑士 世界之愿》作者：[日]矢島さら   &lt;br /&gt;[輕小说] 《乃木坂春香的秘密》作者：[日]五十岚雄策（10卷）11/09更新   &lt;br /&gt;&lt;br /&gt;[輕小說]《IS》作者：[日]弓弦イズル   &lt;br /&gt;[轻小说]《电波女与青春男01》作者：入间人间   &lt;br /&gt;[轻小说]《奇诺之旅》作者：时雨泽惠一（1-12+外+PS2剧本）11/6更新   &lt;br /&gt;[动漫相关]《云之彼端约定之地》 原作：新海诚   &lt;br /&gt;[轻小说]《打工魔法师》作者：椎野美由贵 （1～8）10/25更新第8卷   &lt;br /&gt;给寺院拍照 照片出来后我惊呆了（恐怖）   &lt;br /&gt;[輕小說]《Campione!神不值得信奉》作者：[日]丈月城   &lt;br /&gt;[轻小说]《灼眼的夏娜 》作者：高桥弥七郎 10/21更新19卷   &lt;br /&gt;[轻小说]谷川流作品集（部分附插画），纳米盘   &lt;br /&gt;[推理小说]《魔术的耳语》作者：宫部美雪   &lt;br /&gt;[轻小说]《亲亲坏老爹》作者：野村美月（1-4卷）9/22更新   &lt;br /&gt;[畅销经典]《肖申克的救赎》作者：斯蒂芬·金   &lt;br /&gt;[轻小说]《听到涛声》作者：冰室冴子（1～2+番外篇）   &lt;br /&gt;[轻小说]《MAMA》作者：红玉ぃづき   &lt;br /&gt;[推理小说]《猎捕史奈克》作者：宫部美雪   &lt;br /&gt;[轻小说]《超妹大战》作者：古桥修之（1～2）   &lt;br /&gt;[动漫相关]《名侦探柯南 江神原的魔女》 作者：平良隆久   &lt;br /&gt;[推理小说]《火车》作者：宫部美雪   &lt;br /&gt;[轻小说]《幻影父亲》作者：深泽美潮   &lt;br /&gt;[輕小說]《Resin Cast Milk 虚轴少女的日常》作者：[日]藤原佑   &lt;br /&gt;[轻小说]《吊线木偶症候群》作者：乾久留美   &lt;br /&gt;[轻小说]《不適合少女的職業》作者：櫻庭一樹   &lt;br /&gt;[轻小说]《镇魂练习曲》作者：北泽大辅 （1～3）   &lt;br /&gt;[动漫相关]《L改变世界 洛杉矶BB连续杀人案件》作者：西尾维新   &lt;br /&gt;[动漫小说] 《反逆的鲁路修官方小说朱之轨迹》作者：岩佐守（完）   &lt;br /&gt;[动漫相关]《空中杀手》作者：森博嗣 （完）   &lt;br /&gt;[2009]这本轻小说最厉害TOP50！   &lt;br /&gt;[轻小说]《在暗夜中寻找羔羊》作者：穗史贺雅也 （1～3完结）   &lt;br /&gt;[輕小說]《我甜蜜的苦涩委内瑞拉》作者：[日]森田季节   &lt;br /&gt;[輕小說]《机巧魔神》作者：[日]三雲岳斗   &lt;br /&gt;[輕小說]《東京吸血鬼金融》作者：[日]真藤順丈   &lt;br /&gt;[輕小說]《闲狼作家是美少女妖怪？》作者：[日]杉井光   &lt;br /&gt;[輕小說]《梅格＆賽隆》作者：[日]时雨泽惠一   &lt;br /&gt;[轻小说]《盖棺论定！》作者：文冈あちら   &lt;br /&gt;[剧情小说]《流行之神》作者：不详   &lt;br /&gt;[轻小说]《凛子与昭介の故事&amp;Yaorozu》作者：土塀赋之 古户真智子   &lt;br /&gt;[轻小说]《此处前方是荒野》作者：水无神知宏   &lt;br /&gt;[轻小说]《串刺少女》作者：木村航 （1～3完结）   &lt;br /&gt;[輕小說]《幸运机会！》作者：[日]有泽真水   &lt;br /&gt;《精子战争》&lt;br /&gt;两本工具书：完全复仇手册，完全失踪手册   &lt;br /&gt;[推理小说]《他人事》作者：平山梦明   &lt;br /&gt;[遊戲相關]《命运传奇 命运传承者》作者：[日]矢島さら（上下全）9/19更新   &lt;br /&gt;[轻小说]《心灵侦探八云》作者：神永学 （1～2）   &lt;br /&gt;[惊悚小说]《ZOO》作者：[日]乙一   &lt;br /&gt;[轻小说]《疾走！青春期的帕拉贝伦》作者：深见真（1～2）   &lt;br /&gt;[推理小說]《狂骨之夢》作者：[日]京极夏彦（上下全）   &lt;br /&gt;[轻小说]《MM一族》作者：松野秋鸣（1-8未） 9/12更新   &lt;br /&gt;[轻小说]《9S》作者：[日]叶山透（1-9+Memories+SS，未完结）   &lt;br /&gt;[短篇轻小说]《辉石之花》作者：河屋 一   &lt;br /&gt;&lt;br /&gt;[轻小说]《七人武器店》（1-2）作者：[日]大乐绚太（未完结）   &lt;br /&gt;[轻小说]《魔法战士李维》作者：[日]水野良（未完结）   &lt;br /&gt;[轻小说]《春季限定草莓塔事件》作者：米泽穗信 &lt;br /&gt;[推理小说]《铁鼠之槛》作者：京极夏彦   &lt;br /&gt;[輕小說]《學生會的日常》作者：[日]葵せきな（1卷未）   &lt;br /&gt;[资料收集]英雄无敌生物背景考究   &lt;br /&gt;[輕小說]《佰物語》广播剧全对话翻譯. 作者：[日]西尾維新   &lt;br /&gt;[轻小说]《壳中少女》作者：冲方丁（全）   &lt;br /&gt;[科幻军事]《光晕》（1～4全）作者：[美] 埃里克·尼伦德&amp;威廉·C·迪茨 [中   &lt;br /&gt;[轻小说]《终焉的年代记》作者：川上稔（1-3上 未完） 8/24更新   &lt;br /&gt;《灵异知识普及资料》作者：不详   &lt;br /&gt;[轻小说]《在遙遠彼方的小千》作者：日日日（全一卷）   &lt;br /&gt;[轻小说]《拯救你的最初咒语》作者：须堂项（1~2未完）   &lt;br /&gt;[轻小说]《捨棄在八月的路上》作者：伊藤たかみ（全一卷）   &lt;br /&gt;[幻想小说]《妖藩记鬼剑众》作者：菊地秀行 &lt;br /&gt;[剧情小说]《最终幻想VI》 作者:不详   &lt;br /&gt;[官方小说]《怪物猎人2G魂之继承者1-5》 作者：冰上惠一   &lt;br /&gt;[轻小说]《神灯女仆1-4》作者：夏绿   &lt;br /&gt;[奇幻经典]被遗忘的国度系列（包含部分英文原著）更新《血脉+无星之夜》   &lt;br /&gt;[游戏相关]《秋之回忆1-3+从今以后》 作者:不详   &lt;br /&gt;[轻小说]《七姬物语1-4》作者：高野和   &lt;br /&gt;[轻小说]《狂恋声优宝贝》作者：木本雅彦   &lt;br /&gt;[轻小说]《彈珠汽水》作者：[日]鴻野貴光 （全一卷）   &lt;br /&gt;[輕小說]《小齒輪！》作者：[日]樋口司   &lt;br /&gt;[热门小说]《凉宫春日的忧郁》作者：谷川流&lt;br /&gt;【科幻】《光晕三部曲》 作者：[美] 埃里克·尼伦德 威廉·C·迪茨   &lt;br /&gt;[轻小说]《女帝·龍凰院麟音的初恋 第一卷》作者：[日]风见周   &lt;br /&gt;[动漫相关]《晴空之Air1-6》作者：不详   &lt;br /&gt;[轻小说]《学校的阶梯》作者：櫂末高彰 （1～9+短篇 未完）8/8更新   &lt;br /&gt;[剧情小说]《寄生前夜2》作者：不详   &lt;br /&gt;强烈推荐《战神&lt;br /&gt;[轻小说]《神样灵感少女+传说灵感少女》作者：松原真琴/小畑健（8/1更新完结）   &lt;br /&gt;城寨书房版规   &lt;br /&gt;电子书资源获取流程及阅读、排版工具   &lt;br /&gt;[轻小说]《抱歉咯?二之宫同学》作者：铃木大辅（1卷未）   &lt;br /&gt;求书求助专贴   &lt;br /&gt;[轻小说]《重回那天》作者：健速（全一卷）   &lt;br /&gt;[灵异小说]《怪谈新耳袋》 作者：木原浩胜、中山市朗   &lt;br /&gt;[轻小说]《请别忧伤了，二之宫君1-10全》作者：钤木大辅   &lt;br /&gt;[轻小说]《流星慢舞》作者：桥本纺   &lt;br /&gt;【奇幻】《被遗忘的国度》系列：伊尔明斯特之旅   &lt;br /&gt;[轻小说]《放学后的征服世界》作者：わかつきひかる   &lt;br /&gt;[短篇轻小说]《可疑的少女与危险的少年》作者：深见真   &lt;br /&gt;[轻小说]《新罗德斯岛战记》作者：【日】水野良（全）   &lt;br /&gt;[轻小说]《七都市物语 （全）》作者：田中芳树   &lt;br /&gt;[轻小说]《XXXHOLIC兰德尔特环的粉尘]》作者：西尾维新   &lt;br /&gt;[动漫相关]《L改变世界+外传》 作者:西尾维新   &lt;br /&gt;[轻小说]《Black Blood Brother》作者：あざの耕平（1-5+外） 7/7更新   &lt;br /&gt;[轻小说]《郭德堡变奏曲》作者：五代ゆぅ   &lt;br /&gt;[轻小说]《逃离学校！》作者：谷川流 &lt;br /&gt;&lt;br /&gt;[轻小说]《郭德堡变奏曲》作者：五代ゆぅ   &lt;br /&gt;[轻小说]《逃离学校！》作者：谷川流 &lt;br /&gt;[轻小说]《电击!!神盾5少女》作者：谷川 流 （1～2 全）   &lt;br /&gt;[轻小说]《铁拳灵感少女》作者：松原真琴/小畑健   &lt;br /&gt;[游戏相关]《潜龙谍影4官方小说 下》（已完结）作者：伊藤计划   &lt;br /&gt;[轻小说]《我的亲爱主人！？》作者：鹰野佑希（1-5完） 7/4更新   &lt;br /&gt;[轻小说]《斩鬼夜鸟子1-3》作者：树田省治   &lt;br /&gt;[轻小说]《单恋的麒麟1-2》 作者：志村一矢   &lt;br /&gt;[轻小说]《神曲奏界 異色協奏》作者：淺井ラボ、あざの耕平、神野奧那、三田誠   &lt;br /&gt;[轻小说]《欢迎来到NHK!》作者：滝本竜彦   &lt;br /&gt;[短篇小说]《月之雨物语》作者：古茶（全）   &lt;br /&gt;[轻小说]《云霄飞车》作者：山田悠介（全）   &lt;br /&gt;[轻小说]《某一天，炸弹从天而降》作者：古桥秀之 （全）   &lt;br /&gt;[游戏小说]《最终幻想Ⅶ~On the way to a smile》（ 那那岐篇 神罗篇 尤菲篇）   &lt;br /&gt;[轻小说]《罗德岛战记+罗德岛传说+新罗德斯岛战记》 作者：水野良   &lt;br /&gt;[轻小说]《替身伯爵系列 1》作者：清家未森   &lt;br /&gt;[轻小说]《天空之钟 响彻惑星》作者：渡濑草一郎（1-9）   &lt;br /&gt;皆杀的田中芳树！二十枚入~   &lt;br /&gt;[轻小说]《晴空之下，突然……（全）》作者：田中芳树   &lt;br /&gt;[轻小说]《自卫队三部曲第一部 盐之街》作者：有川浩   &lt;br /&gt;[恐怖小说]《第十三种人格的恐怖》作者：贵志祐介   &lt;br /&gt;[轻小说]《虚轴少女1-5 Resin Cast Milk》作者：藤原祐   &lt;br /&gt;[轻小说]《虫之歌》作者：岩井恭平（9卷+BUG系列+外传）   &lt;br /&gt;[轻小说]《我的爱马很凶恶》作者：新井辉   &lt;br /&gt;[轻小说]《Bad！Daddy 亲亲坏老爹1-3》作者：不詳   &lt;br /&gt;[畅销小说]《天竺热风录》作者：田中芳树（波澜壮阔的盛唐再现）   &lt;br /&gt;[轻小说]《三月.七日》作者：森桥ビソゴ （1～2 全）   &lt;br /&gt;[轻小说]《本格推理委员会》作者：日向正道 （全）   &lt;br /&gt;[动漫相关]《闪光的哈萨维》 作者:不详   &lt;br /&gt;[轻小说]《绯弹的亚里亚1～3》作者：赤松中学   &lt;br /&gt;[轻小说]《战斗司书与虚言者的宴会 》作者：山形石雄   &lt;br /&gt;[日本科幻]《寄生前夜》作者：濑名秀明   &lt;br /&gt;[游戏剧本]《最终幻想X-2外传 你所吹响的口哨》作者：ベニー松山   &lt;br /&gt;阴阳师第①-⑧卷全集》作者：[日]梦枕貘 TXT   &lt;br /&gt;[短篇轻小说]《夏天，真纪子与MD-WalkMan的故事》作者：紅玉いづき   &lt;br /&gt;[轻小说]《幽灵恋人1～4》作者：平坂 读 &lt;br /&gt;[轻小说]《一切终将远去》作者：山本文绪 &lt;br /&gt;[轻小说]《幽灵少女与科学少年1～2》作者：飞田甲   &lt;br /&gt;[轻小说]《烟囟町的赤魔与绝望少年 1 》作者：ゆうきりん   &lt;br /&gt;[推理小说]《“犀川&amp;萌绘”系列》作者：森博嗣 （1～2未完）   &lt;br /&gt;[轻小说]《虎跃龙笑 狮王争霸！》作者：嬉野秋彦 （1～2未完）   &lt;br /&gt;[推理小说]《姑获鸟之夏》作者：京极夏彦&lt;br /&gt;[轻小说]《消极的快乐、电锯的边缘》作者：泷本龙彦 （全）   &lt;br /&gt;[轻小说]《快打城市 slum online》作者：樱坂洋 &lt;br /&gt;[轻小说]《ALL YOU NEED IS KILL》作者：樱坂 洋 &lt;br /&gt;[轻小说]《青叶君与宇宙人1~3》作者：松野秋鸣 &lt;br /&gt;[轻小说]《加速世界 第一卷》作者：不詳   &lt;br /&gt;[轻小说]《吉永家的石像怪1-11》作者：田口仙年堂   &lt;br /&gt;[轻小说]《无头骑士异闻录 DuRaRaRa！！1-2》作者：成田良悟   &lt;br /&gt;[流行小说]药师寺凉子怪奇事件簿（1~7卷） 作者：田中芳树   &lt;br /&gt;&lt;br /&gt;[轻小说]《莉莉亚＆特雷兹》作者： 时雨泽惠一 （全）   &lt;br /&gt;[游戏相关]《寂静岭》 作者：山下定   &lt;br /&gt;[动漫相关]《战斗妖精·雪风》 作者：神林长平   &lt;br /&gt;[輕小說]《抽签勇者1-8》 作者:清水文化   &lt;br /&gt;[动漫相关]《今日起是魔王17-20》 作者:乔林 知   &lt;br /&gt;[轻小说]《DoubleDown—以小博大的勘缲郎》作者：西尾维新（全）   &lt;br /&gt;[轻小说]《艾莉森》作者： 时雨泽惠一 （全）   &lt;br /&gt;[轻小说]《自卫队三部曲第二部 空之中》作者：有川浩（全）   &lt;br /&gt;[轻小说]《淑女骑士团 Lady General》作者：千田诚行（未完）   &lt;br /&gt;[动漫相关]《君吻》作者：日暮茶坊 （未完）   &lt;br /&gt;[架空都市]《波罗的海复仇记 （全）》作者：田中芳树   &lt;br /&gt;[架空都市]《梦幻都市（全）》作者：田中芳树   &lt;br /&gt;[轻小说]《黑龙潭异闻 短篇集（全）》作者：田中芳树   &lt;br /&gt;[历史傳记]《海嘯》作者：田中芳树   &lt;br /&gt;[轻小说]《狂乱家族日记》作者：日日日   &lt;br /&gt;[轻小说]《钢铁白兔骑士团》作者：舞阪洸 （1-6卷未完）5/31日更新   &lt;br /&gt;[日系耽美]《三千世界鸦杀1-13+番外前传+090601更新丧神之碑》 作者：津守时生   &lt;br /&gt;[轻小说]《复仇之虎（全）》作者：田中芳树   &lt;br /&gt;[轻小说]《风翔万里 （全）》作者：田中芳树   &lt;br /&gt;[轻小说]《绞缬城绮谭（全）》作者：田中芳树   &lt;br /&gt;[轻小说]《灼热的龙骑兵（3本全）》作者：田中芳树   &lt;br /&gt;[轻小说] 《圣诞节的恐怖分子》作者：佐藤友哉（全一卷）   &lt;br /&gt;[轻小说]《神的记事本》作者：杉井光（1-3卷未完）   &lt;br /&gt;[历史傳记]《奔流》作者：田中芳树   &lt;br /&gt;[历史傳记]《红尘》作者：田中芳树   &lt;br /&gt;[動漫相关]《星之声》作者：新海诚   &lt;br /&gt;[影视相关]《变形金刚电影版 前傳 昨日幽靈 》作者：不詳   &lt;br /&gt;[轻小说]《我的狐仙女友1-4》 作者：西野胜海   &lt;br /&gt;[剧情小说]《潜龙谍影4爱国者之枪》作者：不详   &lt;br /&gt;[轻小说]《你我崩坏的世界》作者：西尾纬新   &lt;br /&gt;[轻小说]《DDD》作者：奈须きのこ（1-2卷未完）   &lt;br /&gt;[轻小说]《侵略少女与谎言庭院》作者：清水マリコ（1卷全）   &lt;br /&gt;[轻小说]《公主+天国》作者：風見周（第1卷未完）   &lt;br /&gt;[推理小说] 《秋叶原@DEEP》作者：石田衣良 （全）   &lt;br /&gt;[动漫相关]《PHANTOM OF INFERNO 无间地狱》作者：虚渊玄   &lt;br /&gt;[轻小说]《战斗司书 1-7》作者：山形石雄   &lt;br /&gt;[轻小说]《碧阳学园学生会议事錄1-3+外傳》作者：葵せきな   &lt;br /&gt;[轻小说]《伊里野的天空 UFO的夏天》作者：秋山瑞人（1-4+短篇 全）   &lt;br /&gt;[动漫小说] 《魍魉之匣》 作者：京极夏彦（全）   &lt;br /&gt;[轻小说]《黑猫1-2》作者：大崎知仁   &lt;br /&gt;[轻小说]《我的世界守护者》作者：谷川流   &lt;br /&gt;[轻小说]《轻小说的快乐写法》作者：本田透   &lt;br /&gt;[轻小说]《学院人体练金术 一卷全》作者：筱崎一夜   &lt;br /&gt;[官方小说]《女神侧身像 希尔梅丽娅2》作者：梅村崇 翻译：YULA、翔月   &lt;br /&gt;[轻小说]《伯爵与妖精11-16+短篇》 作者：谷瑞惠   &lt;br /&gt;[轻小说]《临界杀机》作者：神崎紫电（1-2未完）   &lt;br /&gt;[轻小说]《魔法目录》作者：鎌池和马 （1-8卷）   &lt;br /&gt;[轻小说] 《空之轨迹长篇同人 炎の轨迹》作者：夏木の友人帐   &lt;br /&gt;[動漫相關]《女王之刃 独角兽之剑》 作者：冲田荣次   &lt;br /&gt;[轻小说]《惡女來敲門》作者：织田兄第   &lt;br /&gt;&lt;br /&gt;[轻小说]《高校女仆警察1-4》作者：沢上水也   &lt;br /&gt;[轻小说]《风之圣痕 1-6卷+外传》作者：山门敬弘（靈異類）   &lt;br /&gt;[官方小说]《JOJO的奇妙冒险》 作者:乙一   &lt;br /&gt;[动漫相关]《灼眼的夏娜17、18》作者：高桥弥七郎   &lt;br /&gt;[轻小说]《狼与辛香料》作者：支仓冻砂 （1-10卷）   &lt;br /&gt;[轻小说]《绝望的世界1~腐蚀篇》作者：宫谷俊二   &lt;br /&gt;[轻小说]《永生之酒》作者：成田良悟（1-6未完）   &lt;br /&gt;[轻小说]《对某个飞行员的追忆》 作者：犬村小六 翻译：demongod   &lt;br /&gt;[人物传记]《德川家康》 作者：山冈庄八   &lt;br /&gt;[剧情小说]《零~月蚀的假面》 作者:不详   &lt;br /&gt;[官方小说]《失落的奥德赛 番外 塞丝、敏篇》作者：重松清 翻译：夜蓝   &lt;br /&gt;[游戏剧本]《奥丁领域》 作者:不详（DOC下载 慎入！）   &lt;br /&gt;[剧情小说]《聖女之歌》作者：不详   &lt;br /&gt;[同人小说]《恶魔城 审判 时之缝隙》 作者：有须hideki &lt;br /&gt;[游戏剧本] 《CLANNAD》中文剧本 作者：不详   &lt;br /&gt;[剧情小说]《合金装备》作者：不详   &lt;br /&gt;[剧情小说]《晓之女神》作者：不详   &lt;br /&gt;[剧情小说]《莎木》作者：不详   &lt;br /&gt;[军事小说]《环形世界》作者：菲立普·狄克（光环原案）   &lt;br /&gt;[动漫小说] 《女王之刃》TV版很黄很暴力 作者：不知道 （1-3未完）   &lt;br /&gt;[轻小说]《月兔公主》 作者:野村美月   &lt;br /&gt;[轻小说] 《扉之外~the outside of door》 作者：土桥真二郎（1-3全）   &lt;br /&gt;[剧情小说]《王国之心2》作者：不详   &lt;br /&gt;[剧情小说]《荒野兵器4 上》作者：不详   &lt;br /&gt;[剧情小说] 《王国之心Ⅱ》序章剧情小说 作者：LightLucifer   &lt;br /&gt;[官方小说]《战国basara2》作者：不详   &lt;br /&gt;[轻小说]《新橙路》作者：松本泉 寺田宪史   &lt;br /&gt;[轻小说]《银之镇魂歌》作者：吉原理惠子   &lt;br /&gt;[动漫相关]《苍穹之巨龙》 作者:冲方丁   &lt;br /&gt;[动漫相关]《钢壳都市雷吉欧斯1-7+番外》 作者：雨木シュウスケ   &lt;br /&gt;[中文剧本]《最终幻想战略版》 作者:天幻   &lt;br /&gt;[剧情小说]《银河游侠》 作者:不详   &lt;br /&gt;[动漫相关]《今日起是魔王1-16》 作者:乔林 知   &lt;br /&gt;[动漫相关]《最终兵器彼女 全》 作者:不详   &lt;br /&gt;[游戏相关]《最终幻想11 官方小说-守护之剑》 作者:不详   &lt;br /&gt;[D&amp;D]《时光之轮：世界之眼1-5》作者：罗伯特·乔丹   &lt;br /&gt;[剧情小说]《大神》作者：不详   &lt;br /&gt;[轻小说]《图书馆战争1~4全》 作者:有川 浩（09年2月2更新番外）   &lt;br /&gt;[官方小说]《女神侧身像 两卷全》 作者：梅村崇   &lt;br /&gt;[游戏小说]《北欧女神》作者：不详   &lt;br /&gt;[游戏小说]《女神侧身像 希尔梅丽娅》 作者：不详   &lt;br /&gt;[动漫相关]《天是红河岸 外传 魔之时代的黎明》 作者：筱原千绘   &lt;br /&gt;[轻小说]《我家有个狐仙大人1-6》作者：柴村仁 译者：张信儀   &lt;br /&gt;[动漫相关]《攻壳机动队 宇宙生化人》 作者：远藤明范 翻译：赵玲   &lt;br /&gt;[轻小说]《寒蝉鸣泣之时1-5》作者：龙骑士07   &lt;br /&gt;[动漫相关]《真·天地无用_魉皇鬼1-2》 作者:不详   &lt;br /&gt;[轻小说]《风之大陆1-9》作者：河竹圣   &lt;br /&gt;[轻小说]《黑执事 上》作者：不详   &lt;br /&gt;[官方小说]《宿命传说 苍黑的追忆》原作：矢島さら 翻译：子云   &lt;br /&gt;[轻小说]《悖德之城 （全）》作者：桑原水菜&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;此外，还有 个城寨书房 的 全区资源索引帖 ，放在下面：&lt;br /&gt;&lt;blockquote&gt;A&lt;br /&gt;[轻小说]《艾莉森》作者： 时雨泽惠一 （全）&lt;br /&gt;[轻小说]《阿妮丝与爱摆臭脸的魔法使》1-3卷 作者：[日]花房牧生&lt;br /&gt;[轻小说]《ALL YOU NEED IS KILL》作者：樱坂 洋 (全)&lt;br /&gt;[轻小说]《莉莉亚＆特雷兹》作者： 时雨泽惠一 （全）&lt;br /&gt;[游戏相关]《奥丁领域 古温托丽篇》作者：不详&lt;br /&gt;[游戏剧本]《奥丁领域》 作者:不详（DOC下载 慎入！）&lt;br /&gt;&lt;br /&gt;B&lt;br /&gt;[轻小说] 《便·当 味噌炖青花鱼290元》作者：朝浦（第1卷未完）&lt;br /&gt;[轻小说]《白山同学与黑色手提袋》第一卷 作者：[日铃木铃&lt;br /&gt;[推理侦探]《白夜行》作者：东野圭吾 &lt;br /&gt;[轻小说]《不適合少女的職業》作者：櫻庭一樹&lt;br /&gt;[轻小说]《凛子与昭介の故事&amp;Yaorozu》作者：土塀赋之 古户真智子&lt;br /&gt;[輕小說]《佰物語》广播剧全对话翻譯. 作者：[日]西尾維新话&lt;br /&gt;[轻小说]《冰箱上的洞》作者：KOMUGI&lt;br /&gt;[轻小说]《抱歉咯 二之宫同学》作者：铃木大辅（1卷未）&lt;br /&gt;[輕小說]《百花缭乱》作者：すずきぁきら（1卷未）&lt;br /&gt;[轻小说]《本格推理委员会》作者：日向正道 （全）&lt;br /&gt;[轻小说]《Black Blood Brother》作者：あざの耕平（1-3+外）&lt;br /&gt;[架空都市]《波罗的海复仇记 （全）》作者：田中芳树&lt;br /&gt;[历史傳记]《奔流》作者：田中芳树&lt;br /&gt;[影视相关]《变形金刚电影版 前傳 昨日幽靈 》作者：不詳&lt;br /&gt;[轻小说] 《笨蛋，测验，招唤兽》 作者：井上坚二 （1-5+外传 未完）&lt;br /&gt;[游戏小说]《北欧女神》作者：不详&lt;br /&gt;[轻小说]《悖德之城 （全）》作者：桑原水菜&lt;br /&gt;[游戏相关]《薄暮传说剧情小说》 作者：沙下夜雪&lt;br /&gt;[奇幻经典]《被遗忘的国度系列（包含部分英文原著）》更新《血脉+无星之夜》 &lt;br /&gt;[官方小说]《瀞灵庭的阴谋之秋 》作者：不详&lt;br /&gt;[动漫相关]《Black Blood Brothers S1》作者：あざの耕平&lt;br /&gt;[日本文学]《白夜的吊钟》 作者：田中芳树&lt;br /&gt;[轻小说]《伯爵与妖精1-10》 作者：谷瑞惠&lt;br /&gt;[轻小说]《伯爵与妖精11-16+短篇》 作者：谷瑞惠 &lt;br /&gt;[奇幻合集]《被遗忘国度—短篇集》 作者：[美]R·A·萨尔瓦多&lt;br /&gt;[轻小说]《伯爵与妖精》作者：谷瑞惠（日）（1-7卷，同名动漫原著）&lt;br /&gt;[资料典故]《本能寺三劫之变的传说》作者：青树秀吉&lt;br /&gt;[奇幻合集]《被遗忘国度》系列：伊尔明斯特之旅&lt;br /&gt;C&lt;br /&gt;[游戏剧本] 《CLANNAD》中文剧本 作者：不详&lt;br /&gt;[动漫相关]《出包王女 危险的闺房私语》作者：[日]若月光&lt;br /&gt;[动漫相关]《初恋限定 冬季写真》作者：[日]平林佐和子 &lt;br /&gt;[輕小說]《创立！？三星学生会》作者：[日]佐々原史绪&lt;br /&gt;[游戏小说]《尘骸魔京》作者：[日]海法纪光 &lt;br /&gt;[轻小说]《超钢女雪拉》1~9未完+番外 作者：寺田とものり &lt;br /&gt;[轻小说]《菖蒲的少女革命！》第一卷 作者：[日]志茂文彦&lt;br /&gt;[輕小說]《触摸魔女》作者：[日]镜裕之 &lt;br /&gt;[轻小说]《超妹大战》作者：古桥修之（1～2）&lt;br /&gt;[轻小说]《此处前方是荒野》作者：水无神知宏&lt;br /&gt;[轻小说]《超人家族一家和乐!? 》作者：桥本和也 （1～3）&lt;br /&gt;[轻小说]《串刺少女》作者：木村航 （1～3完结） &lt;br /&gt;[轻小说]《春季限定草莓塔事件》作者：米泽穗信 (1+解说) &lt;br /&gt;[轻小说]《重回那天》作者：健速（全一卷）&lt;br /&gt;[轻小说]《初恋魔法电击》作者：明日香正太（1-9完整版 未完）&lt;br /&gt;[轻小说]《虫之歌》作者：岩井恭平（9卷全+BUG系列+外传）&lt;br /&gt;[輕小說]《抽签勇者1-8》 作者:清水文化&lt;br /&gt;[动漫相关]《苍穹之巨龙》 作者:冲方丁&lt;br /&gt;[畅销小说]《创龙传1-13卷》作者：田中芳树&lt;br /&gt;[剧情小说]《超级机器人大战OG》作者：不详&lt;br /&gt;[轻小说]《彩云国物语1-14+番外+特典+外传》 作者：雪乃纱衣&lt;br /&gt;[轻小说]《铳姬1-4》作者：高殿円&lt;br /&gt;[轻小说]《传说中勇者的传说1-4+外传 总而言之的传勇传1-2》作者：镜贵也&lt;br /&gt;[动漫相关]《超时空要塞 边界》官方小说第1、2卷 作者：小太刀右京&lt;br /&gt;[轻小说]《纯情罗曼史》 作者：藤崎都（BL，慎入）&lt;br /&gt;[剧情小说]《重生传说》作者：卡伦&lt;br /&gt;[轻小说]《虫师官方小说》 原作：漆原友纪 脚本：大友克洋 &lt;br /&gt;[国轻小说]《長安幻夜》原作：面堂兄 漫画：韩露（漫友人气连载） &lt;br /&gt;[轻小说]《穿越时空的少女》作者:筒井康隆(短篇全) &lt;br /&gt;D&lt;br /&gt;[轻小说]《单恋的麒麟1-2》 作者：志村一矢&lt;br /&gt;[轻小说]《电波女与青春男01》作者：入间人间&lt;br /&gt;[轻小说]《吊线木偶症候群》作者：乾久留美&lt;br /&gt;[輕小說]《刀語》作者：[日]西尾維新（未完）&lt;br /&gt;[輕小說]《東京吸血鬼金融》作者：[日]真藤順丈 &lt;br /&gt;[轻小说]《彈珠汽水》作者：[日]鴻野貴光 （全一卷）&lt;br /&gt;[轻小说]《电波系彼女 三卷全》作者：片山宪太郎&lt;br /&gt;[恐怖小说]《第十三种人格的恐怖》作者：贵志祐介&lt;br /&gt;[轻小说]《打工魔法师》作者：椎野美由贵 （1～6）&lt;br /&gt;[轻小说]《电波男》作者：本田透（适合宅人群= =）&lt;br /&gt;[轻小说]《DoubleDown—以小博大的勘缲郎》作者：西尾维新（全）&lt;br /&gt;[轻小说]《DDD》作者：奈须きのこ（1-2卷未完）&lt;br /&gt;[轻小说]《对某个飞行员的追忆》 作者：犬村小六 翻译：demongod &lt;br /&gt;[动漫相关]《地狱少女-彼岸花》作者：天羽沙夜&lt;br /&gt;[畅销小说]《达·芬奇密码、天使与魔鬼、数字城堡、骗局》 作者：丹·布朗&lt;br /&gt;[剧情小说]《大神》作者：不详&lt;br /&gt;[台湾戏剧]《大霹雳》 作者：不详&lt;br /&gt;[侦探推理]《东野圭吾推理小说合集》作者：东野圭吾&lt;br /&gt;[人物传记]《德川家康》 作者：山冈庄八&lt;br /&gt;[人物传记]《德川家康》 作者：[曰]松本清张 译者：高仁 &lt;br /&gt;E&lt;br /&gt;[游戏小说]《恶魔城 审判 时之缝隙》 作者：有须hideki (未完待译)&lt;br /&gt;[轻小说]《恶魔同盟》作者：うえお久光 （1～5）&lt;br /&gt;[轻小说]《惡女來敲門》作者：织田兄第 &lt;br /&gt;&lt;br /&gt;F&lt;br /&gt;[动漫小说] 《反逆的鲁路修官方小说朱之轨迹》作者：岩佐守（完）&lt;br /&gt;[轻小说]《风之圣痕》作者：山门敬宏（1~6+短篇）&lt;br /&gt;[轻小说]《放学后的征服世界》作者：わかつきひかる&lt;br /&gt;[轻小说]《绯弹的亚里亚1～3》作者：赤松中学&lt;br /&gt;[轻小说]《复仇之虎（全）》作者：田中芳树&lt;br /&gt;[轻小说]《风翔万里 （全）》作者：田中芳树&lt;br /&gt;[轻小说] 《扉之外~the outside of door》 作者：土桥真二郎（1-3全）&lt;br /&gt;[轻小说]《风之大陆1-9》作者：河竹圣&lt;br /&gt;[轻小说]《风之圣痕》第一卷 作者：山门敬弘&lt;br /&gt;[轻小说]《废气公主》作者：榊一郎 &lt;br /&gt;[轻小说]《FATE ZERO》 &lt;br /&gt;G&lt;br /&gt;[轻小说]《公主+天国》作者：風見周（第1卷未完）&lt;br /&gt;[轻小说]《攻壳机动队——宇宙生化人》作者：[日]远藤明范 &lt;br /&gt;[遊戲小說]《格蘭蒂亞》作者：[日]細江ひろみ &lt;br /&gt;[轻小说]《钢铁白兔骑士团》作者：舞阪洸 （1-6卷未完）5/31日更新&lt;br /&gt;[轻小说]《盖棺论定！》作者：文冈あちら &lt;br /&gt;[轻小说]《管家后宫学园》作者：上月司 （1卷未）&lt;br /&gt;[推理小说]《姑获鸟之夏》作者：京极夏彦(京极堂系列01)(世界上没有不可思议的事）&lt;br /&gt;[轻小说]《高校女仆警察1-4》作者：沢上水也&lt;br /&gt;[动漫相关]《攻壳机动队 宇宙生化人》 作者：远藤明范 翻译：赵玲&lt;br /&gt;[动漫相关]《高达系列八部合集》&lt;br /&gt;[动漫相关]《钢壳都市雷吉欧斯1-7+番外》 作者：雨木シュウスケ&lt;br /&gt;[轻小说]《钢壳都市雷吉欧斯》作者：雨木シュウスケ （1-8+外,前传,短篇 未完） &lt;br /&gt;[轻小说]《钢壳都市雷吉欧斯》作者：雨木シュウスケ （1-8+外,前传,短篇 未完）&lt;br /&gt;[游戏相关]《光明之泪 双龙骑士》 作者：加纳新太&lt;br /&gt;[游戏相关]《薄暮传说剧情小说》 作者：沙下夜雪&lt;br /&gt;[灵异小说]《怪谈新耳袋》 作者：木原浩胜、中山市朗&lt;br /&gt;[动漫相关]《钢の錬金术师》作者：井上真&lt;br /&gt;[游戏相关]《光明之泪 双龙骑士》 作者：未知&lt;br /&gt;[动漫相关]《高达W外传 左手持镰，右手拥你》 作者：皆川由佳&lt;br /&gt;[动漫相关]《高达OO P（前传）第一卷》 作者：矢立肇&lt;br /&gt;[官方小说]《高达00之二 捕获高达》作者：木村畅&lt;br /&gt;[官方小说]《高达00 天人组织》作者：木村畅&lt;br /&gt;[游戏相关]《鬼泣4剧情小说》 作者:不详 &lt;br /&gt;[游戏相关]《鬼哭街》 作者：虚渊玄&lt;br /&gt;[轻小说]  《谷川流作品集》（部分附插画），纳米盘 &lt;br /&gt;[畅销小说]《鬼吹灯Ⅱ之黄皮子坟&amp;南海归墟&amp;怒晴湘西&amp;巫峡棺山》（全）作者：天下霸唱&lt;br /&gt;[畅销小说]《鬼吹灯精绝古城&amp;龙岭迷窟&amp;云南虫谷&amp;昆仑神宫》作者：天下霸唱&lt;br /&gt;[官方小说]《怪物猎人官方小说1~4》作者:ゆうきりん&lt;br /&gt;[科幻军事]《光晕》（1～4全）作者：[美] 埃里克·尼伦德&amp;威廉·C·迪茨&lt;br /&gt;[科幻军事]《光晕三部曲》 作者：[美] 埃里克·尼伦德 威廉·C·迪茨 &lt;br /&gt;H &lt;br /&gt;[轻小说]《虎跃龙笑 狮王争霸！》作者：嬉野秋彦 （1～2未完）&lt;br /&gt;[輕小說]《欢迎你！美少女游戏的世界》作者：[日]田尾典丈&lt;br /&gt;[推理小说]《黑死馆杀人事件》作者：小栗虫太郎（日本推理四大奇书）&lt;br /&gt;[轻小说]《欢迎来到血吸村》第一卷 作者：[日]阿智太郎 &lt;br /&gt;[轻小说]《幻兽少年》1-2卷 作者：[日]梦枕貘&lt;br /&gt;[推理小说]《火车》作者：宫部美雪&lt;br /&gt;[轻小说]《幻影父亲》作者：深泽美潮 &lt;br /&gt;[短篇轻小说]《辉石之花》作者：河屋 一&lt;br /&gt;[轻小说]《黑魂少女》作者：[日]上月雨音（未完结）&lt;br /&gt;[輕小說]《化物語》作者：西尾維新（上卷未）&lt;br /&gt;[轻小说]《紅》作者：片山憲太郎&lt;br /&gt;[历史傳记]《红尘》作者：田中芳树&lt;br /&gt;[轻小说]《 黄昏色的咏使》作者：细音启（1-6卷）&lt;br /&gt;[历史傳记]《海嘯》作者：田中芳树&lt;br /&gt;[轻小说]《黑龙潭异闻 短篇集（全）》作者：田中芳树&lt;br /&gt;[轻小说]《黑猫1-2》作者：大崎知仁&lt;br /&gt;[军事小说]《环形世界》作者：菲立普·狄克（光环原案）&lt;br /&gt;[轻小说]《欢迎来到NHK!》作者：滝本竜彦&lt;br /&gt;[剧情小说]《合金装备2》作者：不详 &lt;br /&gt;[剧情小说]《荒野兵器4 上》作者：不详&lt;br /&gt;[轻小说]《黑执事 上》作者：不详&lt;br /&gt;[日系耽美]《海盗风云》作者：松冈夏树 &lt;br /&gt;[轻小说]《寒蝉鸣泣之时1-5》作者：龙骑士07 &lt;br /&gt;[轻小说]《寒蝉鸣泣之时》 鬼隐篇作者：龙骑士070&lt;br /&gt;[日本文学]《红蔷薇新娘1-3》 作者：田中芳树&lt;br /&gt;[游戏相关]《火焰之纹章 暗黑龙与光之剑》 作者：不详 &lt;br /&gt;[漫画改编]《黑血》 原案/漫画：赵佳&lt;br /&gt;[游戏相关]《幻想传说 沉寂的历史》原作：祭紀 りゅーじ 翻译：子云、清雨 &lt;br /&gt;[动漫相关]《《横行霸道4(GTA4)》剧情小说》作者：不详 &lt;br /&gt;[英国童话]《哈尔的移动城堡中英两版》作者：DianaWynneJones &lt;br /&gt;[奇幻合集]《哈利·波特全集》（HTML格式电子书全7本中文合辑收藏版）[附下载] &lt;br /&gt;[畅销小说]《黑质三部曲 黄金罗盘&amp;魔法神刀&amp;琥珀望远镜》作者：菲利普·普尔曼 &lt;br /&gt;[轻小说]《欢迎加入HNK》作者：滝本龙彦 &lt;br /&gt;[现代神话]《河图洛书》作者：不动（来自新干线的超人气连载）&lt;br /&gt;I&lt;br /&gt;&lt;br /&gt;[輕小說]《IS》作者：[日]弓弦イズル &lt;br /&gt;&lt;br /&gt;J&lt;br /&gt;&lt;br /&gt;[轻小说]《吉永家的石像怪1-11》作者：田口仙年堂&lt;br /&gt;[輕小說]《娇蛮猫娘大横行！》作者：[日]松智洋&lt;br /&gt;[轻小说]《静流姐与无言的公主们》作者：[日]上远野浩平 &lt;br /&gt;[輕小說]《机巧魔神》作者：[日]三雲岳斗 &lt;br /&gt;[轻小说]《疾走！青春期的帕拉贝伦》作者：深见真（1～2）&lt;br /&gt;[轻小说]《将花束献给月亮与你》作者：[日]志村一矢&lt;br /&gt;[动漫相关]《机动战士高达UNICORN 0096》作者：[日]福井晴敏（1-6）&lt;br /&gt;[轻小说]《9S》作者：[日]叶山透（1-9+Memories+SS，未完结）&lt;br /&gt;[轻小说]《静流姐与执拗的死者们》作者：上远野浩平&lt;br /&gt;[轻小说]《加速世界 第一卷》作者：不詳&lt;br /&gt;[动漫相关]《机动战舰大和號 琉璃由A到B的故事》 作者：不詳&lt;br /&gt;[动漫相关]《君吻》作者：日暮茶坊 （未完）&lt;br /&gt;[轻小说]《绞缬城绮谭（全）》作者：田中芳树&lt;br /&gt;[剧情小说]《莎木》作者：不详&lt;br /&gt;[剧情小说]《寄生前夜2》作者：不详&lt;br /&gt;[动漫相关]《今日起是魔王1-16》 作者:乔林 知&lt;br /&gt;[动漫相关]《今日起是魔王17-20》 作者:乔林 知&lt;br /&gt;[官方小说]《JOJO的奇妙冒险》 作者:乙一 &lt;br /&gt;[日本科幻]《寄生前夜》作者：濑名秀明 &lt;br /&gt;[侦探惊忪]《金田一全集》作者：横沟正史 &lt;br /&gt;[官方小说]《寂静岭》 作者：山下定&lt;br /&gt;[官方小说]《寂静岭2》 作者：山下定&lt;br /&gt;[推理侦探]《金田一少年的事件薄》作者：天树征丸&lt;br /&gt;[日本文学]《甲贺忍法帖》作者：山田风太郎&lt;br /&gt;[官方小说]《机动战士高达0080口袋里的战争》作者：山口宏、结城恭介 &lt;br /&gt;[官方小说]《机动战士高达0079+外传-密会》作者： 富野由悠季&lt;br /&gt;[历史典故]《剑与禅：宫本武藏》 &lt;br /&gt;[合集汇总]《九州实体书汇总》&lt;br /&gt;K&lt;br /&gt;[轻小说]《空之境界》作者：奈须きのこ（全）&lt;br /&gt;[轻小说]《看着月亮说着谎话》第一卷 作者：[日]日日日 &lt;br /&gt;[轻小说]科学超电磁炮特典小说，全八话 &lt;br /&gt;[轻小说]《矿物质超女》作者：冬樹忍 （1~6）&lt;br /&gt;[轻小说]《骷髅恋人》作者： 平坂读（1~5）&lt;br /&gt;[轻小说]《空罐少女！》作者：蓝上陆/铃平ひろ （1~4）&lt;br /&gt;[推理小說]《狂骨之夢》作者：[日]京极夏彦（上卷未） &lt;br /&gt;[轻小说]《壳中少女》作者：冲方丁（全）&lt;br /&gt;[短篇轻小说]《可疑的少女与危险的少年》作者：深见真&lt;br /&gt;[轻小说]《肯普法》作者：筑地俊彦（1-3未）&lt;br /&gt;[轻小说]《肯普法10.5》作者：筑地俊彦&lt;br /&gt;[轻小说]《快打城市 slum online》作者：樱坂洋 (全)&lt;br /&gt;[轻小说]《空之中》作者：有川浩（全）&lt;br /&gt;[轻小说]《狂乱家族日记1-6》 作者：日日日&lt;br /&gt;[轻小说] 《空之轨迹长篇同人 炎の轨迹》作者：夏木の友人帐&lt;br /&gt;[轻小说]《狂恋声优宝贝》作者：木本雅彦&lt;br /&gt;[动漫相关]《空中杀手》作者：森博嗣 （完） &lt;br /&gt;&lt;br /&gt;L&lt;br /&gt;[轻小说]《罗德岛战记+罗德岛传说+新罗德斯岛战记》 作者：水野良&lt;br /&gt;[轻小说]《莱茵河的囚徒》作者：[日]田中芳树&lt;br /&gt;[轻小说]《离别的钢琴奏鸣曲 1》作者：杉井光&lt;br /&gt;[推理小说]《猎捕史奈克》作者：宫部美雪 &lt;br /&gt;[輕小說]《狼與辛香料》作者：[日]支仓冻沙 （11,12卷）&lt;br /&gt;[輕小說]《蘿球社！》作者：[日]蒼山サグ&lt;br /&gt;[轻小说]《流星慢舞》作者：桥本纺&lt;br /&gt;[轻小说]《铁拳灵感少女》作者：松原真琴/小畑健&lt;br /&gt;[剧情小说]《流行之神》作者：不详&lt;br /&gt;[轻小说]《临界杀机》作者：神崎紫电（1-2未完）&lt;br /&gt;[轻小说]《零之使魔1-16+外传》作者：ヤマグチノボル&lt;br /&gt;[动漫相关]《L改变世界+外传》 作者:西尾维新 &lt;br /&gt;[动漫相关]《L改变世界+外传》 作者:西尾维新&lt;br /&gt;[动漫相关]《龙虎斗1-6》 作者：未知 &lt;br /&gt;[轻小说]《龙眠》 作者：宫部美幸&lt;br /&gt;[轻小说]《LUCK*STAR杀人事件》作者：竹井10日 &lt;br /&gt;[轻小说]《狼與辛香料1-9》 作者：支仓冻砂&lt;br /&gt;[轻小说]《狼与辛香料》作者：支仓冻砂 （1-10卷）&lt;br /&gt;[动画外传]《另一个冰轮丸》 作者：松永真琴 译者:Youyuan&lt;br /&gt;[日本文学]《柳生忍法帖》 作者：山田风太郎&lt;br /&gt;[剧情小说]《龙背上的骑士1+2》作者：不详&lt;br /&gt;[动漫相关]《L改变世界 洛杉矶BB连续杀人案件》作者：西尾维新&lt;br /&gt;[热门小说]《凉宫春日的忧郁》八部全 &lt;br /&gt;[游戏小说]《零~月蚀的假面》 作者:不详&lt;br /&gt;[游戏小说]《零·ZERO》作者：不详&lt;br /&gt;[游戏小说]《零·红蝶》作者：不详&lt;br /&gt;[游戏小说]《零·刺青之声》作者：不详 &lt;br /&gt;[轻小说]《罗德斯岛战记》 &lt;br /&gt;[轻小说]《零之使魔 ゼロづ使い魔小说1-14+番外》作者：ヤマグチノボル(更新到第12卷)&lt;br /&gt;[轻小说]《凉宫春日的忧郁》 &lt;br /&gt;&lt;br /&gt;M&lt;br /&gt;[轻小说]《魔法目录1-6+ss+外传》 作者：镰池和马&lt;br /&gt;[一般小说]《魔王》作者：[日]伊坂幸太郎 &lt;br /&gt;[轻小说]《魔女宅急便》作者：角野荣子（全）&lt;br /&gt;[推理小说]《魔术的耳语》作者：宫部美雪&lt;br /&gt;[轻小说]《MAMA》作者：红玉ぃづき&lt;br /&gt;[輕小說]《梅格＆賽隆》作者：[日]时雨泽惠一 &lt;br /&gt;[轻小说]《魔法战士李维》作者：[日]水野良（未完结）&lt;br /&gt;[轻小说]《魔法**目录》作者：镰池和马（9.10卷）&lt;br /&gt;[轻小说]《某一天，炸弹从天而降》作者：古桥秀之 （全）&lt;br /&gt;[轻小说]《MM一族》作者：作者：松野秋鸣（1-5卷）&lt;br /&gt;[架空都市]《梦幻都市（全）》作者：田中芳树 &lt;br /&gt;[轻小说]《魔法目录》作者：鎌池和马 （1-8卷） &lt;br /&gt;[动漫相关]《名侦探柯南 江神原的魔女》 作者：平良隆久&lt;br /&gt;[畅销小说]《暮光之城 1-4部（英文版）》作者：斯蒂芬妮·梅尔&lt;br /&gt;[轻小说]《魔法人力派遣公司》第1~2卷 作者：三田诚&lt;br /&gt;[日本文学]《麻辣教师GTO 颠覆北海道》 作者:不详&lt;br /&gt;[动漫游戏]《魔界战记迪斯凯亚1-6全》作者：神代创 &lt;br /&gt;[动漫相关]《秒速五厘米》 作者：新海诚 &lt;br /&gt;[轻小说]《魔法少女奈叶》作者：都筑真纪（全）&lt;br /&gt;[资料分享]《魔法书与恶魔学》 &lt;br /&gt;[游戏小说]《魔兽世界官方小说+同人》作者：多人&lt;br /&gt;[游戏相关]魔兽世界小说三部曲&lt;br /&gt;&lt;br /&gt;N&lt;br /&gt;[轻小说]《你我崩坏的世界》作者：西尾纬新&lt;br /&gt;[推理小说]《脑髓地狱》作者：梦野久作 （日本推理四大奇书）&lt;br /&gt;[轻小说]《女帝·龍凰院麟音的初恋 第一卷》作者：[日]风见周&lt;br /&gt;[动漫小说] 《女王之刃》TV版很黄很暴力 作者：不知道 （1-3未完）&lt;br /&gt;[動漫相關]《女王之刃 独角兽之剑》 作者：冲田荣次 &lt;br /&gt;[轻小说] 《乃木坂春香的秘密》作者：五十岚雄策（0-9卷未完） 5/14日更新&lt;br /&gt;[官方小说]《女神侧身像 两卷全》 作者：梅村崇&lt;br /&gt;[官方小说]《女神侧身像 负罪者》作者：不详&lt;br /&gt;[游戏小说]《女神侧身像 希尔梅丽娅》 作者：梅村崇&lt;br /&gt;[官方小说]《女神侧身像 希尔梅丽娅2》作者：梅村崇 翻译：YULA、翔月 &lt;br /&gt;[剧情小说]《逆转裁判4》翻译：清雨（游小说）&lt;br /&gt;[奇幻经典]《纳尼亚传奇2 凯斯宾王子》作者：[英] C·S·刘易斯&lt;br /&gt;O&lt;br /&gt;[动漫相关]《one piece》 作者:不详&lt;br /&gt;P&lt;br /&gt;[动漫相关]《PHANTOM OF INFERNO 无间地狱》作者：虚渊玄&lt;br /&gt;[轻小说]《pulp》作者：森桥ビソゴ（1~3）&lt;br /&gt;Q&lt;br /&gt;[轻小说]《七姬物语1-4》作者：高野和&lt;br /&gt;[轻小说]《轻小说社》作者：平坂读（1~2）&lt;br /&gt;[轻小说]《企鹅之夏(ペンギン·サマー)》全一卷 作者：[日]六塚光&lt;br /&gt;[轻小说]《犬神》作者：有沢まみず （1~12） &lt;br /&gt;[轻小说]《七人武器店》（1-2）作者：[日]大乐绚太（未完结）&lt;br /&gt;[轻小说]《亲亲坏老爹》作者：野村美月（1-3卷）&lt;br /&gt;[轻小说]《青叶君与宇宙人1~3》作者：松野秋鸣 (全)&lt;br /&gt;[轻小说]《七都市物语 （全）》作者：田中芳树&lt;br /&gt;[轻小说]《晴空之下，突然……（全）》作者：田中芳树&lt;br /&gt;[轻小说]《侵略少女与谎言庭院》作者：清水マリコ（1卷全）&lt;br /&gt;[剧情小说]《潜龙谍影4爱国者之枪》作者：不详&lt;br /&gt;[轻小说]《轻小说的快乐写法》作者：本田透&lt;br /&gt;[游戏相关] 潜龙谍影 - Metal Gear Solid [官方小说] (1卷全)&lt;br /&gt;[推理小说] 《秋叶原@DEEP》作者：石田衣良 （全）&lt;br /&gt;[动漫相关]《晴空之Air1-6》作者：不详&lt;br /&gt;[游戏相关]《秋之回忆1-3+从今以后》 作者:不详&lt;br /&gt;[轻小说]《奇诺之旅》作者：时雨泽惠（1-11+外+PS2剧本）&lt;br /&gt;[轻小说]《奇诺之旅1-10全》作者:时雨沢恵一&lt;br /&gt;[游戏相关]《潜龙谍影4官方小说》（下）作者：伊藤计划 &lt;br /&gt;[轻小说]《[欢迎加入NHK》 作者：泷本龙彦&lt;br /&gt;[游戏相关]《潜龙谍影4官方小说》（上） 作者：伊藤计划&lt;br /&gt;[动漫相关]《全金属狂潮短片集》作者：贺东招二 等 &lt;br /&gt;[动漫相关]《全金属狂潮1-11》作者：贺东招二 &lt;br /&gt;[游戏剧情]《寄生前夜2》 作者：不详&lt;br /&gt;&lt;br /&gt;R&lt;br /&gt;[轻小说]《人间系列》作者：西尾纬新 （第3卷）&lt;br /&gt;[轻小说] 《ROOM NO.1301》 作者：新井辉（1-7卷未完）9/13更新&lt;br /&gt;[轻小说] 《R.O.D》作者：仓田英之（第1卷未完）&lt;br /&gt;[历史研究]《日本战国史》作者:赤军（国产）&lt;br /&gt;[日本小说]《人间失格》作者：太宰治&lt;br /&gt;[资料收集]《日本战国明将用兵哲学》 作者:不详&lt;br /&gt;&lt;br /&gt;S&lt;br /&gt;[轻小说]《三坪房间的侵略者！？第一卷》作者：健速&lt;br /&gt;[推理小说]《世纪末的侦探神话》作者：清凉院流水 &lt;br /&gt;[輕小說]《SH@PPLE》作者：[日]竹岡葉月&lt;br /&gt;[游戏小说]《水仙》全一卷 作者：[日]片冈とも&lt;br /&gt;[轻小说]《杀×爱》作者：风见周（0~4） &lt;br /&gt;[轻小说]《神样家族》作者：桑岛由一 （1~7）&lt;br /&gt;[轻小说]《神之游戏1～3》作者：宮崎柊羽 &lt;br /&gt;[輕小說]《428被封锁的涩谷》作者：[日]北岛行德&lt;br /&gt;[恐怖小说]《尸鬼》作者：[日]小野不由美 （完结）&lt;br /&gt;[轻小说]《捨棄在八月的路上》作者：伊藤たかみ（全一卷）&lt;br /&gt;[輕小說]《傷物語》作者：[日]西尾維新&lt;br /&gt;[轻小说]《神样灵感少女》作者：松原真琴/小畑健&lt;br /&gt;[轻小说]《神曲奏界 異色協奏》作者：淺井ラボ、あざの耕平、神野奧那、三田誠&lt;br /&gt;[轻小说] 《圣诞节的恐怖分子》作者：佐藤友哉（全一卷）&lt;br /&gt;[轻小说]《淑女骑士团 Lady General》作者：千田诚行（未完）&lt;br /&gt;[轻小说]《神的记事本》作者：杉井光（1-3卷未完）&lt;br /&gt;[轻小说]《神灯女仆1-4》作者：夏绿&lt;br /&gt;[轻小说] 《ROOM NO.1301》 作者：新井辉（1-7卷+番外未完）&lt;br /&gt;[轻小说]《说谎的男孩与坏掉的女孩》作者：入间人间（1-3未完）&lt;br /&gt;[剧情小说]《聖女之歌》作者：不详&lt;br /&gt;[动漫相关]《闪光的哈萨维》 作者:不详&lt;br /&gt;[轻小说]《少年阴阳师1～20》 作者:结城光流&lt;br /&gt;[D&amp;D]《时光之轮：世界之眼1-5》作者：罗伯特·乔丹 &lt;br /&gt;[动漫相关]《水星领航员ARIA四季之风的赠礼》作者：岡田麿里 藤咲ぁゅな 浦畑达彦 吉田玲子&lt;br /&gt;[日系耽美]《三千世界鸦杀1-13+番外+前传》 作者：津守时生 &lt;br /&gt;[官方小说]《生化危机官方小说（Resident Evil）（1-8）》原著：S·D·Perry&lt;br /&gt;[官方小说]《宿命传说 苍黑的追忆》原作：矢島さら 翻译：子云 &lt;br /&gt;[游戏相关]《失落的奥德赛番外篇》作者：松重清 翻译：夜蓝&lt;br /&gt;[官方小说]《失落的奥德赛 番外 塞丝、敏篇》作者：重松清 翻译：夜蓝&lt;br /&gt;[官方小说]《宿命传说官方小说 苍黑的思念》原作：矢島さら 翻译：子云&lt;br /&gt;[轻小说]《死后文》作者：雨宫谅&lt;br /&gt;[百合向耽美]《圣母在上1-12》 作者：今野绪雪 &lt;br /&gt;[轻小说]《水星领航员水之都与哀伤的歌姬》作者：藤咲ぁゅな&lt;br /&gt;[动漫相关]《死神的歌谣》作者：长谷川启介&lt;br /&gt;[游戏小说]《失落的奥德赛 千年之梦 永远的旅人》原作：重松 清 翻译：夜蓝&lt;br /&gt;[人文历史]《十字军骑士》作者：显克维支（EXE,TXT双版本） &lt;br /&gt;[轻小说]《十二国记全集+外传》作者：小野不由美&lt;br /&gt;[轻小说]《少年残像》原作：由贵香织里&lt;br /&gt;[轻小说]《圣魔之血》作者：吉田直  &lt;br /&gt;&lt;br /&gt;T&lt;br /&gt;[轻小说]《同居五重奏！》作者：越后屋铁舟（1卷未完）&lt;br /&gt;[轻小说]《他能在那天逃过死亡吗》作者：[日]小木君人&lt;br /&gt;[遊戲相關]《Tales of Symphonia 拉塔特斯克的骑士 世界之愿》作者：[日]矢島さら&lt;br /&gt;[推理小说]《铁鼠之槛》作者：京极夏彦&lt;br /&gt;[推理小说]《他人事》作者：平山梦明&lt;br /&gt;[轻小说]《TIGER X DRAGON》作者：竹宫ゆゆこ（9卷）&lt;br /&gt;[轻小说]《听到涛声》作者：冰室冴子（1～2+番外篇）&lt;br /&gt;[轻小说]《逃离学校！》作者：谷川流 (1~6全)&lt;br /&gt;[轻小说]《替身伯爵系列 1》作者：清家未森&lt;br /&gt;[轻小说]《天空之钟 响彻惑星》作者：渡濑草一郎（1-9）&lt;br /&gt;[军事小说]《汤姆克兰西部分军事小说》作者：汤姆克兰西 &lt;br /&gt;[动漫相关]《天是红河岸 外传 魔之时代的黎明》 作者：筱原千绘 &lt;br /&gt;[动漫相关]《太空堡垒－麦克罗斯传奇》作者：未知 &lt;br /&gt;[畅销小说]《马法尔年代记1-3全》作者：田中芳树&lt;br /&gt;[轻小说]《图书馆战争1~4全》 作者:有川 浩（09年2月2更新番外）&lt;br /&gt;[动漫相关]《太空堡垒－南十字军》作者：[美] 杰克·麦金尼【上、下册完整版】&lt;br /&gt;[漫画相关]《天使迷梦1-6全+番外+前传》作者：游素兰（台湾）&lt;br /&gt;[影视文学]《跳跃大搜查线》 作者：不详&lt;br /&gt;[畅销小说]《天竺热风录》作者：田中芳树（波澜壮阔的盛唐再现）&lt;br /&gt;U&lt;br /&gt;&lt;br /&gt;V&lt;br /&gt;&lt;br /&gt;W&lt;br /&gt;[轻小说]《无头骑士异闻录 DuRaRaRa！！1-2》作者：成田良悟&lt;br /&gt;[轻小说]《我们的蔬菜不够》作者：浅沼广太（1~4）&lt;br /&gt;[轻小说]《我的朋友很少 第二卷》作者：平坂読&lt;br /&gt;[轻小说]《我的腐女友》作者：ぺんたぶ（1~2）&lt;br /&gt;[轻小说]《我的朋友很少》（第一卷）作者：[日]平坂読&lt;br /&gt;[轻小说]《伪物语（下）》作者：[日]西尾维新&lt;br /&gt;[輕小說]《無頭騎士異聞錄DuRaRaRa！！》作者：[日]成田良悟（3卷未） &lt;br /&gt;[悬疑小说]《无人生还》 作者：阿加莎·克里斯蒂&lt;br /&gt;[輕小說]《偽物語》作者：[日]西尾維新（上卷未）&lt;br /&gt;[輕小說]《我甜蜜的苦涩委内瑞拉》作者：[日]森田季节&lt;br /&gt;[輕小說]《物質幽靈》作者：[日]葵せきな（未完）&lt;br /&gt;[轻小说]《我的亲爱主人！？》作者：鹰野佑希（1-5完） 7/4更新&lt;br /&gt;[轻小说]《我们的田村同学》作者：竹宫ゆゆこ （1～2+短篇）&lt;br /&gt;[轻小说]《我的爱马很凶恶》作者：新井辉&lt;br /&gt;[轻小说]《“文学少女”见习生の、初恋》作者：野村美月&lt;br /&gt;[轻小说] 《我的妹妹不可能那么可爱》作者：伏见司（1+短篇未完）&lt;br /&gt;[轻小说]《我的世界守护者》作者：谷川流&lt;br /&gt;[轻小说]《我的狐仙女友1-4》 作者：西野胜海&lt;br /&gt;[轻小说] 《文学少女》作者：野村美月 （1-8+番外 完）5/6日更新&lt;br /&gt;[动漫小说] 《魍魉之匣》 作者：京极夏彦（全）&lt;br /&gt;[剧情小说] 《王国之心Ⅱ》序章剧情小说 作者：LightLucifer&lt;br /&gt;[剧情小说]《王国之心2》作者：不详 &lt;br /&gt;[轻小说]《我家有个狐仙大人1-6》作者：柴村仁 译者：张信儀&lt;br /&gt;[现代文学]《五百年吸血鬼惊世传奇》作者：伊丽莎白·科斯托娃&lt;br /&gt;[影视相关]《我是传奇 英文版》作者：理查德·马瑟森&lt;br /&gt;[日本耽美]《王朝春宵罗曼史1-4》 作者：不详&lt;br /&gt;[日本小说]《为夜空的双子座衬上深红蔷薇》作者：冈崎裕信 原案：田中芳树&lt;br /&gt;[轻小说]《万岁系列1-8全》作者：三浦勇雄&lt;br /&gt;[悬疑恐怖]《午夜凶铃1-4》作者：铃木光司&lt;br /&gt;[资料收集]《五轮书：地之卷》 作者：宫本武藏 &lt;br /&gt;[资料收集]《五轮书：火之卷》作者：宫本武藏&lt;br /&gt;&lt;br /&gt;X&lt;br /&gt;[短篇轻小说]《夏天，真纪子与MD-WalkMan的故事》作者：紅玉いづき &lt;br /&gt;[推理小说]《献给虚无的供物》作者：中井英夫 （日本推理四大奇书）&lt;br /&gt;[推理小说]《匣中的失乐》作者：竹本键治 （日本推理四大奇书）&lt;br /&gt;[轻小说]《新本格魔法少女莉丝佳》作者：西尾维新（1~2）&lt;br /&gt;[妖怪小说]《巷说百物语》作者：京极夏彦（1~4完结） &lt;br /&gt;[輕小說]《虚轴少女ResinCastMilk》作者：[日]藤原佑（1-5）&lt;br /&gt;[輕小說]《闲狼作家是美少女妖怪？》作者：[日]杉井光&lt;br /&gt;[輕小說]《Resin Cast Milk 虚轴少女的日常》作者：[日]藤原佑&lt;br /&gt;[輕小說]《幸运机会！》作者：[日]有泽真水 &lt;br /&gt;[轻小说]《心灵侦探八云》作者：神永学 （1～2）&lt;br /&gt;[輕小說]《學生會的日常》作者：[日]葵せきな（1卷未）&lt;br /&gt;[輕小說]《小齒輪！》作者：[日]樋口司（1卷未）&lt;br /&gt;[轻小说]《学生会的一己之见》作者：[日]葵せきな（1-3+外 未完）&lt;br /&gt;[轻小说]《掀起世界危机！》 作者： 佐藤了&lt;br /&gt;[轻小说]《学校的阶梯》作者：櫂末高彰 （1～8+短篇 未完）&lt;br /&gt;[推理小说]《“犀川&amp;萌绘”系列》作者：森博嗣 （1～2未完）&lt;br /&gt;[動漫相关]《星之声》作者：新海诚&lt;br /&gt;[轻小说]《消极的快乐、电锯的边缘》作者：泷本龙彦 （全）&lt;br /&gt;[轻小说]《戏言系列》作者：西尾维新 （1-10完结）&lt;br /&gt;[轻小说]《学院人体练金术 一卷全》作者：筱崎一夜&lt;br /&gt;[剧情小说]《晓之女神》作者：不详 &lt;br /&gt;[游戏对话]《仙剑奇侠传四》作者：上海软星&lt;br /&gt;[轻小说]《新橙路》作者：松本泉 寺田宪史 &lt;br /&gt;[轻小说]《吸血鬼骑士1-4》作者：藤咲あゆな&lt;br /&gt;[推理侦探]《嫌疑犯X的献身》作者：东野圭吾 （神探伽利略系列）&lt;br /&gt;[轻小说]《吸血鬼猎人D》 作者：菊地秀行 插话：天野喜孝 &lt;br /&gt;[剧情小说]《新鬼武者 梦之黎明》作者：不详 &lt;br /&gt;[轻小说]《XXXHOLIC兰德尔特环的粉尘]》作者：西尾维新 &lt;br /&gt;[畅销经典]《肖申克的救赎》作者：斯蒂芬·金 &lt;br /&gt;[轻小说]《星界系列》 作者：森冈浩之 &lt;br /&gt;[轻小说]《幸运☆星 ONLINE》原作：美水かがみ 著：竹井10日&lt;br /&gt;[军事科幻]《星之海洋》全 作者：charlesp &lt;br /&gt;[国产耽美]《希露芙斯战记（5中篇） 》作者：七月 &lt;br /&gt;[轻小说]《新罗德斯岛战记》作者：【日】水野良（全） &lt;br /&gt;&lt;br /&gt;Y&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[轻小说]《幽灵恋人1～4》作者：平坂 读 (全) &lt;br /&gt;[轻小说]《阴沉少女与黑魔法之恋》作者：熊谷雅人（1~3）&lt;br /&gt;[轻小说]《遥仰凰华》番外+游戏剧本 作者：冈田留奈&lt;br /&gt;[轻小说]《月兔的银色方舟》作者：[日]鴨志田一&lt;br /&gt;[轻小说]《眼镜男与断头少女》作者： 藤原祐 （1~2）&lt;br /&gt;[合集小说]乙一作品集[共32篇] &lt;br /&gt;[轻小说]《影≒光 Shadow Light》作者：影名浅海 （1~5）&lt;br /&gt;[轻小说]《银盘万花筒》作者：海原零 （1~9）&lt;br /&gt;[轻小说]《仰望半月的夜空》作者：桥本纺 （1-8卷+2短篇完结）&lt;br /&gt;[遊戲相關]《命运传奇 命运传承者》作者：[日]矢島さら（上卷未）&lt;br /&gt;[轻小说]《云霄飞车》作者：山田悠介（全）&lt;br /&gt;[短篇小说]《月之雨物语》作者：古茶（全）&lt;br /&gt;[轻小说]《一切终将远去》作者：山本文绪 (全) &lt;br /&gt;[轻小说]《幽灵少女与科学少年1～2》作者：飞田甲 &lt;br /&gt;[轻小说]《烟囟町的赤魔与绝望少年 1 》作者：ゆうきりん&lt;br /&gt;[幻想小说]《妖藩记鬼剑众》作者：菊地秀行 (全) &lt;br /&gt;[轻小说]《伊里野的天空 UFO的夏天》作者：秋山瑞人（1-4+短篇 全）&lt;br /&gt;[轻小说]《银之镇魂歌》作者：吉原理惠子 &lt;br /&gt;[剧情小说]《银河游侠》 作者:不详&lt;br /&gt;[轻小说]《月兔公主》 作者:野村美月&lt;br /&gt;[魔幻小说]《夜访吸血鬼》作者：安妮·赖斯 &lt;br /&gt;[宇宙战争]《铁达尼亚1-3卷》 作者：田中芳树&lt;br /&gt;[轻小说]《银魂 3年Z班的银八老师1-3》 作者：不详&lt;br /&gt;[轻小说]《银河铁道之夜》&lt;br /&gt;[游戏人]《樱花大战3 前传巴黎前夜· 北大路花火篇》 作者：赤堀悟 &lt;br /&gt;[游戏人]《樱花大战3 前传巴黎前夜·古妮西露篇》 作者：赤堀悟&lt;br /&gt;[游戏人]《樱花大战3 前传巴黎前夜·艾莉卡篇》 作者：赤堀悟 &lt;br /&gt;[动漫相关]《云之彼端约定之地》 原作：新海诚&lt;br /&gt;[游戏剧本]《XENOGEARS（异度装甲）》+《世界观解疑》&lt;br /&gt;[英国童话]《哈尔的移动城堡中英两版》作者：DianaWynneJones &lt;br /&gt;[轻小说]《永生之酒》作者：成田良悟 （更新1~8）&lt;br /&gt;[轻小说]《亚普菲兰特》作者：田中芳树 &lt;br /&gt;[日本文学]《亚也日记》作者：木藤亚也（又名：一公升的眼泪） &lt;br /&gt;[流行小说]药师寺凉子怪奇事件簿（1~7卷） 作者：田中芳树&lt;br /&gt;[科幻经典]《银河英雄传说》&lt;br /&gt;[轻小说]《BACCANO(永生之酒)第1-6卷》作者：]成田良悟&lt;br /&gt;[轻小说]《阴阳师物语 1》 &lt;br /&gt;&lt;br /&gt;Z&lt;br /&gt;[轻小说]《斩鬼夜鸟子1-3》作者：树田省治&lt;br /&gt;[轻小说]《战斗！暴风少女！》作者：佐佐原始绪（1~2） &lt;br /&gt;[轻小说]《最后大魔王》作者：水城正太郎（1~5）&lt;br /&gt;[杂书？]《征服世界有可能的吗》作者：[日]冈田斗司夫 &lt;br /&gt;[轻小说]《战斗司书与终章猛兽》作者：山形石雄 （系列第八作）&lt;br /&gt;[轻小说]《在暗夜中寻找羔羊》作者：穗史贺雅也 （1～3完结）&lt;br /&gt;[轻小说]《镇魂练习曲》作者：北泽大辅 （1～3）&lt;br /&gt;[惊悚小说]《ZOO》作者：[日]乙一&lt;br /&gt;[轻小说]《在遙遠彼方的小千》作者：日日日（全一卷）&lt;br /&gt;[轻小说]《拯救你的最初咒语》作者：须堂项（1~2未完）&lt;br /&gt;[轻小说]《终焉的年代记》作者：川上稔（1-2未完）&lt;br /&gt;[轻小说]《战斗司书与虚言者的宴会 》作者：山形石雄&lt;br /&gt;[游戏小说]《最终幻想Ⅶ~On the way to a smile》（ 那那岐篇 神罗篇 尤菲篇）&lt;br /&gt;[轻小说]《灼热的龙骑兵（3本全）》作者：田中芳树&lt;br /&gt;[官方小说]《战国basara2》作者：不详&lt;br /&gt;[轻小说]《自卫队三部曲第一部》作者：有川浩&lt;br /&gt;[动漫相关]《真·天地无用_魉皇鬼1-2》 作者:不详&lt;br /&gt;[剧情小说]《战争机器》 作者：不详&lt;br /&gt;[动漫相关]《最终兵器彼女 全》 作者:不详 &lt;br /&gt;[剧情小说]《战神：奥林匹斯之链》作者：城寨某人（-，-！）&lt;br /&gt;[人物传记]《织田信长》 作者：山冈庄八&lt;br /&gt;[剧情小说] 最终幻想系列剧情小说》&lt;br /&gt;[港漫相关]《中华英雄》 作者：不详 &lt;br /&gt;[历史记载]《中国武将列传》 作者:田中芳树&lt;br /&gt;[中文剧本]《最终幻想战略版》 作者:天幻&lt;br /&gt;[剧情小说]《最终幻想VI》 作者:不详&lt;br /&gt;[剧情小说]《最终幻想XII》作者：不详&lt;br /&gt;[游戏相关]《最终幻想11 官方小说-守护之剑》 作者:不详&lt;br /&gt;[游戏相关]《最终幻想7游戏剧本+剧情小说》 作者：不详&lt;br /&gt;[游戏剧本]《最终幻想10剧情小说》 作者：慕容非 &lt;br /&gt;[剧情小说]《最终幻想IX》作者：不详 &lt;br /&gt;[官方小说]《FF7AC On The Way to a Smile丁塞尔篇/蒂法篇》作者：ベニー松山&lt;br /&gt;[游戏剧本]《最终幻想X-2外传 你所吹响的口哨》作者：ベニー松山 &lt;br /&gt;[轻小说]《灼眼的夏娜 》作者：高桥弥七郎 （0~16卷、附加S卷）0 &lt;br /&gt;[专题收集]《战国趣闻录(番外篇*2)》.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;嘛...娱乐而已的东西嘛...这里是一个链接也没有的...&lt;br /&gt;&lt;br /&gt;lightnovel.cn曾打包放出过东西，不过风格有些区别。&lt;br /&gt;&lt;blockquote&gt;ed2k://|file|%5B%E8%BD%BB%E4%B9%8B%E5%9B%BD%E5%BA%A6%5D%E8%BD%BB%E5%B0%8F%E8%AF%B4%E5%90%88%E9%9B%86VOL.1%5B2009-09%5D%5Blightkingdom.lightnovel.collection.vol1%5D.zip|183888376|98448761c16748b1742080b7953db837|h=sa2xcobe5uypgofn4fnfdyfvlx66it3c|/&lt;br /&gt;ed2k://|file|%5B%E8%BD%BB%E4%B9%8B%E5%9B%BD%E5%BA%A6%5D%E8%BD%BB%E5%B0%8F%E8%AF%B4%E5%90%88%E9%9B%86VOL.2%5B2009-10%5D%5Blightkingdom.lightnovel.collection.vol2%5D.7z|2222403|c659f06bc7ecfc05219fc63117bd4872|h=ffr6ennkgx534gjt6ijih5ag755ycheb|/&lt;br /&gt;ed2k://|file|%5B%E8%BD%BB%E4%B9%8B%E5%9B%BD%E5%BA%A6%5D%E8%BD%BB%E5%B0%8F%E8%AF%B4%E5%90%88%E9%9B%86VOL.3%5B2009-11%5D%5Blightkingdom.lightnovel.collection.vol3%5D.7z|2824935|bf6f16910e9f11945d84cf155dd5aaf9|h=45iw2wmhyognkkxpwwc67fzoxdeu46dc|/&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;相关的站点的话自己能想到的还有&lt;br /&gt;http://bbs.levelup.im/forum-38-1.html&lt;br /&gt;book.sky-fire.com&lt;br /&gt;comic.92wy.com&lt;br /&gt;www.ffsky.com&lt;br /&gt;www.hgamecn.com&lt;br /&gt;www.imdb.com&lt;br /&gt;类似站点去找一下也能发现些，这里名字有些杂乱了，况且ACG内容还是好找的。&lt;br /&gt;此外呢，有些考古性质的企划文对于搜索而言是有辅助作用的，例如维基百科。&lt;br /&gt;&lt;br /&gt;这年头有dangdang在，还是纸质顺眼来着，也觉得存放起来踏实一点。&lt;br /&gt;曾有的版权问题的正在发展出适合的解决途径，目前不必要无视已有的关注度。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/8514323822263038132/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/8514323822263038132' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8514323822263038132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8514323822263038132'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/08/levelupcn.html' title='【挖一挖】levelup.cn的论坛ACG小说版的某些内容'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-2170970700863375216</id><published>2011-07-07T12:07:00.007+08:00</published><updated>2011-07-08T16:45:11.332+08:00</updated><title type='text'>静态类型函数式语言Objective Caml/ML的简要介绍【程序语言介绍】</title><content type='html'>下面拿OCaml手册的导论部分的前两章缩译了一下，这里涵盖了核心语言和模块系统两方面的内容。&lt;br /&gt;&lt;br /&gt;* Chapter 1  The core language&lt;br /&gt;&lt;br /&gt;这部分是OCaml语言的简明教程，需要有某一编程语言的使用基础，但不一定是函数式语言。&lt;br /&gt;&lt;br /&gt;** 1.1  Basics&lt;br /&gt;&lt;br /&gt;下面将在交互模式中演示，“#”开头的行表示用户输入。输入以“;;”终止，交互系统会随即解析表达式或定义语句并返回执行结果。&lt;br /&gt;&lt;br /&gt;#1+2*3;;&lt;br /&gt;- : int = 7&lt;br /&gt;&lt;br /&gt;#let pi = 4.0 *. atan 1.0;;&lt;br /&gt;val pi : float = 3.14159265358979312&lt;br /&gt;&lt;br /&gt;#let square x = x *. x;;&lt;br /&gt;val square : float -&amp;gt; float = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#square(sin pi) +. square(cos pi);;&lt;br /&gt;- : float = 1.&lt;br /&gt;&lt;br /&gt;值和类型会被执行，函数中未显式声明的参数系统会根据其定义中的语句来推断。要注意整数和浮点数是不同的类型，前者用“+”和“*”而后者用“+.”和“*.”。&lt;br /&gt;&lt;br /&gt;#1.0 * 2;;&lt;br /&gt;Error: This expression has type float but an expression was expected of type int&lt;br /&gt;&lt;br /&gt;递归函数有“let rec”绑定：&lt;br /&gt;&lt;br /&gt;#let rec fib n =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if n &amp;lt; 2 then n else fib(n-1) + fib(n-2);;&lt;br /&gt;val fib : int -&amp;gt; int = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#fib 10;;&lt;br /&gt;- : int = 55&lt;br /&gt;&lt;br /&gt;** 1.2  Data types&lt;br /&gt;&lt;br /&gt;除了整数和浮点数，Caml中还提供了其他的常用基本类型：布尔型、字符型、字符串型。&lt;br /&gt;&lt;br /&gt;#(1 &amp;lt; 2) = false;;&lt;br /&gt;- : bool = false&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#’a’;;&lt;br /&gt;- : char = ’a’&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;quot;Hello world&amp;quot;;;&lt;br /&gt;- : string = &amp;quot;Hello world&amp;quot;&lt;br /&gt;&lt;br /&gt;预定义的数据结构包括元组、数组、列表，此外也可创建自定义类型。列表是由“[”和“]”包裹“;”分割，或者由空表“[]”（读作nil）前面用“::”操作符添加元素构成。&lt;br /&gt;&lt;br /&gt;#let l = [&amp;quot;is&amp;quot;; &amp;quot;a&amp;quot;; &amp;quot;tale&amp;quot;; &amp;quot;told&amp;quot;; &amp;quot;etc.&amp;quot;];;&lt;br /&gt;val l : string list = [&amp;quot;is&amp;quot;; &amp;quot;a&amp;quot;; &amp;quot;tale&amp;quot;; &amp;quot;told&amp;quot;; &amp;quot;etc.&amp;quot;]&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#&amp;quot;Life&amp;quot; :: l;;&lt;br /&gt;- : string list = [&amp;quot;Life&amp;quot;; &amp;quot;is&amp;quot;; &amp;quot;a&amp;quot;; &amp;quot;tale&amp;quot;; &amp;quot;told&amp;quot;; &amp;quot;etc.&amp;quot;]&lt;br /&gt;&lt;br /&gt;列表的内存管理将自动进行，不需要显式地分配或回收。指针由Caml编译器负责，也不需要显式的处理。&lt;br /&gt;&lt;br /&gt;列表（以及大部分Caml数据结构）的检查和解析通过模式匹配进行。列表的模式与列表的定义形式相同，以标识符表示列表中未定义的部分。以下是用列表进行插入排序的例子：&lt;br /&gt;&lt;br /&gt;#let rec sort lst =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match lst with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| head :: tail -&amp;gt; insert head (sort tail)&lt;br /&gt;&amp;nbsp;and insert elt lst =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match lst with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; [elt]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| head :: tail -&amp;gt; if elt &amp;lt;= head then elt :: lst else head :: insert elt tail&lt;br /&gt;&amp;nbsp;;;&lt;br /&gt;val sort : ’a list -&amp;gt; ’a list = &amp;lt;fun&amp;gt;&lt;br /&gt;val insert : ’a -&amp;gt; ’a list -&amp;gt; ’a list = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#sort l;;&lt;br /&gt;- : string list = [&amp;quot;a&amp;quot;; &amp;quot;etc.&amp;quot;; &amp;quot;is&amp;quot;; &amp;quot;tale&amp;quot;; &amp;quot;told&amp;quot;]&lt;br /&gt;&lt;br /&gt;这里sort推断得到的类型是“’a list -&amp;gt; ’a list”，表示作用于任意类型的列表并返回相同类型的列表。其中“’a ”是类型变量，代表任意类型。之所以sort可以用于任意类型列表，是因为比较操作（“=”“&amp;lt;=”等等）在Caml中是多态的。&lt;br /&gt;&lt;br /&gt;#sort [6;2;5;3];;&lt;br /&gt;- : int list = [2; 3; 5; 6]&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#sort [3.14; 2.718];;&lt;br /&gt;- : float list = [2.718; 3.14]&lt;br /&gt;&lt;br /&gt;上面的sort函数没有修改它的输入列表，而是创建并返回一个元素个数相同的递增列表。列表创建后是无法在原地修改的，在Caml中列表是不可变的结构。大部分Caml中的数据结构是不可变的，而少部分（如数组）是可变的（可以在任何时候原地修改）。&lt;br /&gt;&lt;br /&gt;** 1.3  Functions as values&lt;br /&gt;&lt;br /&gt;Caml是一种函数式语言，支持数学意义上的函数并可以和其他数据片段一样被自由地传递。例如这里的deriv函数以浮点函数为参数并返回它的导函数的逼近函数：&lt;br /&gt;&lt;br /&gt;#let deriv f dx = function x -&amp;gt; (f(x +. dx) -. f(x)) /. dx;;&lt;br /&gt;val deriv : (float -&amp;gt; float) -&amp;gt; float -&amp;gt; float -&amp;gt; float = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let sin’ = deriv sin 1e-6;;&lt;br /&gt;val sin’ : float -&amp;gt; float = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#sin’ pi;;&lt;br /&gt;- : float = -1.00000000013961143&lt;br /&gt;Even function composition is definable:&lt;br /&gt;&lt;br /&gt;#let compose f g = function x -&amp;gt; f(g(x));;&lt;br /&gt;val compose : (’a -&amp;gt; ’b) -&amp;gt; (’c -&amp;gt; ’a) -&amp;gt; ’c -&amp;gt; ’b = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let cos2 = compose square cos;;&lt;br /&gt;val cos2 : float -&amp;gt; float = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;以其他函数作为参数的函数称为“泛函數”（functionals）或者“高阶函数”（higher-order functions）。泛函数可用于对数据结构的迭代或类似的操作。例如Caml的标准库中提供“List.map”将给定函数应用于列表中的每个元素并返回结果列表：&lt;br /&gt;&lt;br /&gt;#List.map (function n -&amp;gt; n * 2 + 1) [0;1;2;3;4];;&lt;br /&gt;- : int list = [1; 3; 5; 7; 9]&lt;br /&gt;&lt;br /&gt;常用的列表和数组相关的函数已经定义好了，或者也可以按照下面的方式自行定义。&lt;br /&gt;&lt;br /&gt;#let rec map f l =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match l with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| hd :: tl -&amp;gt; f hd :: map f tl;;&lt;br /&gt;val map : (’a -&amp;gt; ’b) -&amp;gt; ’a list -&amp;gt; ’b list = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;** 1.4  Records and variants&lt;br /&gt;&lt;br /&gt;用户定义的数据结构包括记录和变体。它们都通过类型声明来定义。这里我们声明了一个表示有理数的记录类型。&lt;br /&gt;&lt;br /&gt;#type ratio = {num: int; denum: int};;&lt;br /&gt;type ratio = { num : int; denum : int; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let add_ratio r1 r2 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{num = r1.num * r2.denum + r2.num * r1.denum;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denum = r1.denum * r2.denum};;&lt;br /&gt;val add_ratio : ratio -&amp;gt; ratio -&amp;gt; ratio = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#add_ratio {num=1; denum=3} {num=2; denum=5};;&lt;br /&gt;- : ratio = {num = 11; denum = 15}&lt;br /&gt;&lt;br /&gt;变体类型的声明列出了该类型所有值的形状。每种情况用一个名称作为标识符，称为构造器，既用来在构造那种变体类型的值，也用来在模式匹配中检查它们。构造器的首字母大写，用来和变量名区分（必须以小写字母开头）。例如这里是一个用来进行混合运算（整数和浮点）的变体类型：&lt;br /&gt;&lt;br /&gt;#type number = Int of int | Float of float | Error;;&lt;br /&gt;type number = Int of int | Float of float | Error&lt;br /&gt;&lt;br /&gt;这个声明表示number类型的值或者是一个整数，或者是一个浮点数，或者是表示无效运算结果的常量Error（比如被零除）。&lt;br /&gt;&lt;br /&gt;枚举类型是变体类型的一种特殊情况，是当所有的选择支都是常量的时候：&lt;br /&gt;&lt;br /&gt;#type sign = Positive | Negative;;&lt;br /&gt;type sign = Positive | Negative&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let sign_int n = if n &amp;gt;= 0 then Positive else Negative;;&lt;br /&gt;val sign_int : int -&amp;gt; sign = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;要定义number类型的算数运算，我们需要对用到的两个number使用模式匹配：&lt;br /&gt;&lt;br /&gt;#let add_num n1 n2 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match (n1, n2) with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Int i1, Int i2) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(* Check for overflow of integer addition *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if sign_int i1 = sign_int i2 &amp;amp;&amp;amp; sign_int(i1 + i2) &amp;lt;&amp;gt; sign_int i1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then Float(float i1 +. float i2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Int(i1 + i2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| (Int i1, Float f2) -&amp;gt; Float(float i1 +. f2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| (Float f1, Int i2) -&amp;gt; Float(f1 +. float i2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| (Float f1, Float f2) -&amp;gt; Float(f1 +. f2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| (Error, _) -&amp;gt; Error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| (_, Error) -&amp;gt; Error;;&lt;br /&gt;val add_num : number -&amp;gt; number -&amp;gt; number = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#add_num (Int 123) (Float 3.14159);;&lt;br /&gt;- : number = Float 126.14159&lt;br /&gt;&lt;br /&gt;变体类型的最常见的用途是描述递归的数据结构。考虑二叉树的例子：&lt;br /&gt;&lt;br /&gt;#type ’a btree = Empty | Node of ’a * ’a btree * ’a btree;;&lt;br /&gt;type ’a btree = Empty | Node of ’a * ’a btree * ’a btree&lt;br /&gt;&lt;br /&gt;该定义这样来读：一个包含类型&#39;a（任意类型）的值二叉树或者是空的或者是一个节点，节点有一个类型&#39;a的值和两个也包含类型&#39;a的子树（即两个 &#39;a btree）。&lt;br /&gt;&lt;br /&gt;二叉树上的操作的操作依照其定义自身很自然的用递归函数表达出来。例如这里的函数用来在有序二叉树（元素又左至右递增）上查找和插入。&lt;br /&gt;&lt;br /&gt;#let rec member x btree =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match btree with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Empty -&amp;gt; false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(y, left, right) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x = y then true else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x &amp;lt; y then member x left else member x right;;&lt;br /&gt;val member : ’a -&amp;gt; ’a btree -&amp;gt; bool = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let rec insert x btree =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match btree with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Empty -&amp;gt; Node(x, Empty, Empty)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(y, left, right) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if x &amp;lt;= y then Node(y, insert x left, right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Node(y, left, insert x right);;&lt;br /&gt;val insert : ’a -&amp;gt; ’a btree -&amp;gt; ’a btree = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;** 1.5  Imperative features&lt;br /&gt;&lt;br /&gt;尽管目前的例子都写为纯函数的风格，Caml也具有命令式的特性。这包括了常见的while和for循环，以及可变的数据结构比如数组。数组用“[|”“|]”包围的形式来书写，或者通过“Array.create”函数来分配并初始化然后再赋值。例如，下面的函数即求两个向量（实现为浮点数组）的部分的和。&lt;br /&gt;&lt;br /&gt;#let add_vect v1 v2 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let len = min (Array.length v1) (Array.length v2) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let res = Array.create len 0.0 in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 0 to len - 1 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res.(i) &amp;lt;- v1.(i) +. v2.(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;done;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;res;;&lt;br /&gt;val add_vect : float array -&amp;gt; float array -&amp;gt; float array = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#add_vect [| 1.0; 2.0 |] [| 3.0; 4.0 |];;&lt;br /&gt;- : float array = [|4.; 6.|]&lt;br /&gt;&lt;br /&gt;通过来定义中声明为可变的，记录的字段也可以通过赋值操作来修改：&lt;br /&gt;&lt;br /&gt;#type mutable_point = { mutable x: float; mutable y: float };;&lt;br /&gt;type mutable_point = { mutable x : float; mutable y : float; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let translate p dx dy =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.x &amp;lt;- p.x +. dx; p.y &amp;lt;- p.y +. dy;;&lt;br /&gt;val translate : mutable_point -&amp;gt; float -&amp;gt; float -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let mypoint = { x = 0.0; y = 0.0 };;&lt;br /&gt;val mypoint : mutable_point = {x = 0.; y = 0.}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#translate mypoint 1.0 2.0;;&lt;br /&gt;- : unit = ()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#mypoint;;&lt;br /&gt;- : mutable_point = {x = 1.; y = 2.}&lt;br /&gt;&lt;br /&gt;Caml没有内置变量（可以通过赋值改变当前值的标识）的概念。（let绑定不是赋值，它在新作用域里建立了新的标识。）不过标准库中通过间接地使用可变字段（或者单元素数组）来提供了引用类型，并可通过操作符“!”获取引用的当前内容以及“:=”来赋值。变量可以通过绑定一个引用来模拟。例如，这里是一个数组的原地插入排序的例子：&lt;br /&gt;&lt;br /&gt;#let insertion_sort a =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for i = 1 to Array.length a - 1 do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let val_i = a.(i) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let j = ref i in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while !j &amp;gt; 0 &amp;amp;&amp;amp; val_i &amp;lt; a.(!j - 1) do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a.(!j) &amp;lt;- a.(!j - 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j := !j - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;done;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a.(!j) &amp;lt;- val_i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;done;;&lt;br /&gt;val insertion_sort : ’a array -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;函数也可用于书写需要维持两次调用中的当前状态的函数。例如下面的伪随机数生成器通过引用记录了最后返回的数值：&lt;br /&gt;&lt;br /&gt;#let current_rand = ref 0;;&lt;br /&gt;val current_rand : int ref = {contents = 0}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let random () =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;current_rand := !current_rand * 25713 + 1345;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;!current_rand;;&lt;br /&gt;val random : unit -&amp;gt; int = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;再次说明，引用没什么特别的：它们是通过下面这样的一个可变字段的记录来实现的。&lt;br /&gt;&lt;br /&gt;#type ’a ref = { mutable contents: ’a };;&lt;br /&gt;type ’a ref = { mutable contents : ’a; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let (!) r = r.contents;;&lt;br /&gt;val ( ! ) : ’a ref -&amp;gt; ’a = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let (:=) r newval = r.contents &amp;lt;- newval;;&lt;br /&gt;val ( := ) : ’a ref -&amp;gt; ’a -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;有时会需要在数据结构中存放多态函数并保持多态。除非用户提供类型标记，不然是不允许的，因为多态仅在全局类型中引入。不过你可以给记录的字段给出显式的多态类型。&lt;br /&gt;&lt;br /&gt;#type idref = { mutable id: ’a. ’a -&amp;gt; ’a };;&lt;br /&gt;type idref = { mutable id : ’a. ’a -&amp;gt; ’a; }&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let r = {id = fun x -&amp;gt; x};;&lt;br /&gt;val r : idref = {id = &amp;lt;fun&amp;gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let g s = (s.id 1, s.id true);;&lt;br /&gt;val g : idref -&amp;gt; int * bool = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#r.id &amp;lt;- (fun x -&amp;gt; print_string &amp;quot;called id\n&amp;quot;; x);;&lt;br /&gt;- : unit = ()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#g r;;&lt;br /&gt;called id&lt;br /&gt;called id&lt;br /&gt;- : int * bool = (1, true)&lt;br /&gt;&lt;br /&gt;** 1.6  Exceptions&lt;br /&gt;&lt;br /&gt;Caml提供异常机制用来指示和处理例外的状况。异常也可用于通用的非局部控制结构。异常通过异常构造来声明，并用raise操作符来指示。例如，下面这个取列表头的函数使用异常来指示遇到空表的情况。&lt;br /&gt;&lt;br /&gt;#exception Empty_list;;&lt;br /&gt;exception Empty_list&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let head l =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match l with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; raise Empty_list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| hd :: tl -&amp;gt; hd;;&lt;br /&gt;val head : ’a list -&amp;gt; ’a = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#head [1;2];;&lt;br /&gt;- : int = 1&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#head [];;&lt;br /&gt;Exception: Empty_list.&lt;br /&gt;&lt;br /&gt;在标准库中异常用来指示库函数不能被正常完成的情况。例如，“List.assoc”函数，用来返回一个“(键, 数据)”对的列表中给定键关联的值，在键没有在列表中出现的时候将引起预定义的异常&amp;quot;Not_found&amp;quot;:&lt;br /&gt;&lt;br /&gt;#List.assoc 1 [(0, &amp;quot;zero&amp;quot;); (1, &amp;quot;one&amp;quot;)];;&lt;br /&gt;- : string = &amp;quot;one&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#List.assoc 2 [(0, &amp;quot;zero&amp;quot;); (1, &amp;quot;one&amp;quot;)];;&lt;br /&gt;Exception: Not_found.&lt;br /&gt;Exceptions can be trapped with the try…with construct:&lt;br /&gt;&lt;br /&gt;#let name_of_binary_digit digit =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List.assoc digit [0, &amp;quot;zero&amp;quot;; 1, &amp;quot;one&amp;quot;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;with Not_found -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot;not a binary digit&amp;quot;;;&lt;br /&gt;val name_of_binary_digit : int -&amp;gt; string = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#name_of_binary_digit 0;;&lt;br /&gt;- : string = &amp;quot;zero&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#name_of_binary_digit (-1);;&lt;br /&gt;- : string = &amp;quot;not a binary digit&amp;quot;&lt;br /&gt;&lt;br /&gt;with部分其实是异常值的正则模式匹配。因此，若干异常可以用一个try...with结构来捕获。此外，终止可以通过捕获所有的异常来进行，执行终止操作，然后再次引起该异常：&lt;br /&gt;&lt;br /&gt;#let temporarily_set_reference ref newval funct =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let oldval = !ref in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref := newval;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let res = funct () in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref := oldval;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;with x -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ref := oldval;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;raise x;;&lt;br /&gt;val temporarily_set_reference : ’a ref -&amp;gt; ’a -&amp;gt; (unit -&amp;gt; ’b) -&amp;gt; ’b = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;** 1.7  Symbolic processing of expressions&lt;br /&gt;&lt;br /&gt;我们通过一个较完整的例子来结束这次介绍：使用Caml进行符号处理，形式化的操作包含变量的算术表达式。下列的变体类型描述了我们将操作的表达式：&lt;br /&gt;&lt;br /&gt;#type expression =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const of float&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Var of string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Sum of expression * expression    (* e1 + e2 *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Diff of expression * expression   (* e1 - e2 *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Prod of expression * expression   (* e1 * e2 *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Quot of expression * expression   (* e1 / e2 *)&lt;br /&gt;&amp;nbsp;;;&lt;br /&gt;type expression =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const of float&lt;br /&gt;&amp;nbsp;&amp;nbsp;| Var of string&lt;br /&gt;&amp;nbsp;&amp;nbsp;| Sum of expression * expression&lt;br /&gt;&amp;nbsp;&amp;nbsp;| Diff of expression * expression&lt;br /&gt;&amp;nbsp;&amp;nbsp;| Prod of expression * expression&lt;br /&gt;&amp;nbsp;&amp;nbsp;| Quot of expression * expression&lt;br /&gt;&lt;br /&gt;我们首先定义一个函数在所给变量由名称映射到值的环境下计算表达式的值。为了简化，环境用关联列表表示。&lt;br /&gt;&lt;br /&gt;#exception Unbound_variable of string;;&lt;br /&gt;exception Unbound_variable of string&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let rec eval env exp =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match exp with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const c -&amp;gt; c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Var v -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(try List.assoc v env with Not_found -&amp;gt; raise(Unbound_variable v))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Sum(f, g) -&amp;gt; eval env f +. eval env g&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Diff(f, g) -&amp;gt; eval env f -. eval env g&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Prod(f, g) -&amp;gt; eval env f *. eval env g&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Quot(f, g) -&amp;gt; eval env f /. eval env g;;&lt;br /&gt;val eval : (string * float) list -&amp;gt; expression -&amp;gt; float = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#eval [(&amp;quot;x&amp;quot;, 1.0); (&amp;quot;y&amp;quot;, 3.14)] (Prod(Sum(Var &amp;quot;x&amp;quot;, Const 2.0), Var &amp;quot;y&amp;quot;));;&lt;br /&gt;- : float = 9.42&lt;br /&gt;&lt;br /&gt;现在为了进行真正的符号处理，我们定义关于变量dv的表达式的导数：&lt;br /&gt;&lt;br /&gt;#let rec deriv exp dv =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;match exp with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const c -&amp;gt; Const 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Var v -&amp;gt; if v = dv then Const 1.0 else Const 0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Sum(f, g) -&amp;gt; Sum(deriv f dv, deriv g dv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Diff(f, g) -&amp;gt; Diff(deriv f dv, deriv g dv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Prod(f, g) -&amp;gt; Sum(Prod(f, deriv g dv), Prod(deriv f dv, g))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Quot(f, g) -&amp;gt; Quot(Diff(Prod(deriv f dv, g), Prod(f, deriv g dv)),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Prod(g, g))&lt;br /&gt;&amp;nbsp;;;&lt;br /&gt;val deriv : expression -&amp;gt; string -&amp;gt; expression = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#deriv (Quot(Const 1.0, Var &amp;quot;x&amp;quot;)) &amp;quot;x&amp;quot;;;&lt;br /&gt;- : expression =&lt;br /&gt;Quot (Diff (Prod (Const 0., Var &amp;quot;x&amp;quot;), Prod (Const 1., Const 1.)),&lt;br /&gt;&amp;nbsp;Prod (Var &amp;quot;x&amp;quot;, Var &amp;quot;x&amp;quot;))&lt;br /&gt;&lt;br /&gt;** 1.8  Pretty-printing and parsing&lt;br /&gt;&lt;br /&gt;上面的例子显示，表达式的内部结构（通常也称为抽象语法）在表达式变长的时候很快就难以读写。我们需要打印和解析过程在抽象语法和具体语法（这里指表达式用熟悉的代数符号，例如“2*x+1”）之间来回转换。&lt;br /&gt;&lt;br /&gt;在打印函数中，我们考虑通常的优先规则（比如*比+绑定地更紧）来避免打印不必要的括号。在实现上，我们记录当前操作符的优先级并只当操作符的优先级低于当前优先级的时候在周围打印出括号。&lt;br /&gt;&lt;br /&gt;#let print_expr exp =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(* Local function definitions *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let open_paren prec op_prec =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if prec &amp;gt; op_prec then print_string &amp;quot;(&amp;quot; in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let close_paren prec op_prec =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if prec &amp;gt; op_prec then print_string &amp;quot;)&amp;quot; in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec print prec exp =     (* prec is the current precedence *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match exp with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Const c -&amp;gt; print_float c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Var v -&amp;gt; print_string v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Sum(f, g) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;open_paren prec 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print 0 f; print_string &amp;quot; + &amp;quot;; print 0 g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_paren prec 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Diff(f, g) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;open_paren prec 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print 0 f; print_string &amp;quot; - &amp;quot;; print 1 g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_paren prec 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Prod(f, g) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;open_paren prec 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print 2 f; print_string &amp;quot; * &amp;quot;; print 2 g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_paren prec 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Quot(f, g) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;open_paren prec 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print 2 f; print_string &amp;quot; / &amp;quot;; print 3 g;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close_paren prec 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;in print 0 exp;;&lt;br /&gt;val print_expr : expression -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let e = Sum(Prod(Const 2.0, Var &amp;quot;x&amp;quot;), Const 1.0);;&lt;br /&gt;val e : expression = Sum (Prod (Const 2., Var &amp;quot;x&amp;quot;), Const 1.)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#print_expr e; print_newline();;&lt;br /&gt;2. * x + 1.&lt;br /&gt;- : unit = ()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#print_expr (deriv e &amp;quot;x&amp;quot;); print_newline();;&lt;br /&gt;2. * 1. + 0. * x + 0.&lt;br /&gt;- : unit = ()&lt;br /&gt;&lt;br /&gt;解析（将具体语法转换为抽象语法）通常更精巧些。Caml提供若干工具来帮助编写解析器：一方面，Caml版本的Lex词法生成器和Yacc解析生成器，可以使用下推自动机处理啦LALR(1)语言。另一方面，预定义的（字符或标志）流类型和流的模式匹配，可以为LL(1)语言方便地编写递归下降的解析器。后面的章节中有使用ocamllex和ocamlyacc的例子。这里我们将使用流解析器。流解析器的语法支持由Camlp4预处理器提供，它可以在交互模式中由下面的“#load”指令载入。&lt;br /&gt;&lt;br /&gt;##load &amp;quot;camlp4o.cma&amp;quot;;;&lt;br /&gt;Characters -1–1:&lt;br /&gt;Error: Reference to undefined global ‘Dynlink’&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#open Genlex;;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;let lexer = make_lexer [&amp;quot;(&amp;quot;; &amp;quot;)&amp;quot;; &amp;quot;+&amp;quot;; &amp;quot;-&amp;quot;; &amp;quot;*&amp;quot;; &amp;quot;/&amp;quot;];;&lt;br /&gt;val lexer : char Stream.t -&amp;gt; Genlex.token Stream.t = &amp;lt;fun&amp;gt;&lt;br /&gt;&lt;br /&gt;在词法分析阶段（将输入文本转换为标志流），我们使用标准库中Genlex模块的“通用”的词法解析器。“make_lexer”接受关键词列表并返回“标志化”字符输入流的词法解析函数。标志是标识符、关键词或者是字面义（整数、浮点、字符、字符串）。空白和评论跳过。&lt;br /&gt;&lt;br /&gt;#let token_stream = lexer(Stream.of_string &amp;quot;1.0 +x&amp;quot;);;&lt;br /&gt;val token_stream : Genlex.token Stream.t = &amp;lt;abstr&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#Stream.next token_stream;;&lt;br /&gt;- : Genlex.token = Float 1.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#Stream.next token_stream;;&lt;br /&gt;- : Genlex.token = Kwd &amp;quot;+&amp;quot;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#Stream.next token_stream;;&lt;br /&gt;- : Genlex.token = Ident &amp;quot;x&amp;quot;&lt;br /&gt;&lt;br /&gt;解析器通过在在标志流上执行自身的操作。和常见的递归下降解析器一样，我们使用若干中间解析函数来反映操作符的优先级和结合性。流上的模式匹配比正则的数据结构更为强大，因为它允许在模式里递归的调用解析函数，用以匹配输入流的子部件。更多的细节见Camlp4的文档。&lt;br /&gt;&lt;br /&gt;#let rec parse_expr = parser&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;lt; e1 = parse_mult; e = parse_more_adds e1 &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;and parse_more_adds e1 = parser&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;lt; ’Kwd &amp;quot;+&amp;quot;; e2 = parse_mult; e = parse_more_adds (Sum(e1, e2)) &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; ’Kwd &amp;quot;-&amp;quot;; e2 = parse_mult; e = parse_more_adds (Diff(e1, e2)) &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; &amp;gt;] -&amp;gt; e1&lt;br /&gt;&amp;nbsp;and parse_mult = parser&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;lt; e1 = parse_simple; e = parse_more_mults e1 &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;and parse_more_mults e1 = parser&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;lt; ’Kwd &amp;quot;*&amp;quot;; e2 = parse_simple; e = parse_more_mults (Prod(e1, e2)) &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; ’Kwd &amp;quot;/&amp;quot;; e2 = parse_simple; e = parse_more_mults (Quot(e1, e2)) &amp;gt;] -&amp;gt; e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; &amp;gt;] -&amp;gt; e1&lt;br /&gt;&amp;nbsp;and parse_simple = parser&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[&amp;lt; ’Ident s &amp;gt;] -&amp;gt; Var s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; ’Int i &amp;gt;] -&amp;gt; Const(float i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; ’Float f &amp;gt;] -&amp;gt; Const f&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;| [&amp;lt; ’Kwd &amp;quot;(&amp;quot;; e = parse_expr; ’Kwd &amp;quot;)&amp;quot; &amp;gt;] -&amp;gt; e;;&lt;br /&gt;Error: Syntax error&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#let parse_expression = parser [&amp;lt; e = parse_expr; _ = Stream.empty &amp;gt;] -&amp;gt; e;;&lt;br /&gt;Error: Syntax error&lt;br /&gt;&lt;br /&gt;通过组合来词法和语法解析器，我们最终获得了一个从字符串中读取表达式的函数：&lt;br /&gt;&lt;br /&gt;#let read_expression s = parse_expression(lexer(Stream.of_string s));;&lt;br /&gt;Error: Unbound value parse_expression&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#read_expression &amp;quot;2*(x+y)&amp;quot;;;&lt;br /&gt;Error: Unbound value read_expression&lt;br /&gt;&lt;br /&gt;小问题：为什么在下面两个例子中我们得到了不同的结果？&lt;br /&gt;&lt;br /&gt;#read_expression &amp;quot;x - 1&amp;quot;;;&lt;br /&gt;Error: Unbound value read_expression&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#read_expression &amp;quot;x-1&amp;quot;;;&lt;br /&gt;Error: Unbound value read_expression&lt;br /&gt;&lt;br /&gt;解答：由Genlex提供的通用的词法解析器把负数识别为一个整数标志。因此“x-1”被读取为标志Ident &amp;quot;x&amp;quot; 跟着标志Int(-1)；该序列不匹配任何解析规则。另一方面“x - 1”中的第二个空格导致词法解析器返回三个期望的标志：Ident &amp;quot;x&amp;quot;然后Kwd &amp;quot;-&amp;quot;然后Int(1)。&lt;br /&gt;&lt;br /&gt;** 1.9  Standalone Caml programs&lt;br /&gt;&lt;br /&gt;目前所有给出的例子是在交互系统下执行的。Caml代码也可以通过编译器“ocamlc”或“ocamlopt”单独地编译并非交互的执行。源代码需要放在以“.ml”为扩展名的文件中。源文件包含一序列的代码，并在运行时按照排列的顺序执行。不同于交互模式，类型和值不会自动打印；程序需要调用打印函数来显式地输出。这里是一个打印斐波纳契数列的独立的示例程序。&lt;br /&gt;&lt;br /&gt;(* File fib.ml *)&lt;br /&gt;let rec fib n =&lt;br /&gt;&amp;nbsp;&amp;nbsp;if n &amp;lt; 2 then 1 else fib(n-1) + fib(n-2);;&lt;br /&gt;let main () =&lt;br /&gt;&amp;nbsp;&amp;nbsp;let arg = int_of_string Sys.argv.(1) in&lt;br /&gt;&amp;nbsp;&amp;nbsp;print_int(fib arg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;print_newline();&lt;br /&gt;&amp;nbsp;&amp;nbsp;exit 0;;&lt;br /&gt;main ();;&lt;br /&gt;&lt;br /&gt;“Sys.argv”是包含命令行参数的字符串数组。“Sys.argv.(1)”因此是命令行的第一个参数。上面这个程序通过下列命令编译并执行：&lt;br /&gt;&lt;br /&gt;$ ocamlc -o fib fib.ml&lt;br /&gt;$ ./fib 10&lt;br /&gt;89&lt;br /&gt;$ ./fib 20&lt;br /&gt;10946&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Chapter 2  The module system&lt;br /&gt;&lt;br /&gt;这一章介绍Objective Caml的模块系统。&lt;br /&gt;&lt;br /&gt;** 2.1  Structures&lt;br /&gt;&lt;br /&gt;模块的主要动机是是将相关的定义（比如定义了一种数据类型和那个类型关联的操作符）打包在一起并为这些定义执行一致的命名策略。这样避免的用尽名称或者意外的命名冲突。这样的包称为一个结构通过“struct…end”结构引入，并包含任意定义语句的序列。结构通常给予一个模块绑定的名称。这里的例子是用结构把优先列队的类型和操作打包在一起：&lt;br /&gt;&lt;br /&gt;#module PrioQueue =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type priority = int&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type ’a queue = Empty | Node of priority * ’a * ’a queue * ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let empty = Empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec insert queue prio elt =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match queue with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Empty -&amp;gt; Node(prio, elt, Empty, Empty)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(p, e, left, right) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if prio &amp;lt;= p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then Node(prio, elt, insert right p e, left)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Node(p, e, insert right prio elt, left)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exception Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec remove_top = function&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Empty -&amp;gt; raise Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(prio, elt, left, Empty) -&amp;gt; left&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(prio, elt, Empty, right) -&amp;gt; right&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(prio, elt, (Node(lprio, lelt, _, _) as left),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Node(rprio, relt, _, _) as right)) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if lprio &amp;lt;= rprio&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;then Node(lprio, lelt, remove_top left, right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Node(rprio, relt, left, remove_top right)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let extract = function&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Empty -&amp;gt; raise Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Node(prio, elt, _, _) as queue -&amp;gt; (prio, elt, remove_top queue)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module PrioQueue :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type priority = int&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type ’a queue = Empty | Node of priority * ’a * ’a queue * ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val insert : ’a queue -&amp;gt; priority -&amp;gt; ’a -&amp;gt; ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exception Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val remove_top : ’a queue -&amp;gt; ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val extract : ’a queue -&amp;gt; priority * ’a * ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;在结构的外面，它的组件可以用“.”点号标记来引用，也就是由结构名限制的标识符。例如“PrioQueue.insert”的在值的上下文中是结构“PrioQueue”中定义的一个函数。类似的，“PrioQueue.queue”在类型的上下文中是“PrioQueue”中定义的列队类型。&lt;br /&gt;&lt;br /&gt;#PrioQueue.insert PrioQueue.empty 1 &amp;quot;hello&amp;quot;;;&lt;br /&gt;- : string PrioQueue.queue =&lt;br /&gt;PrioQueue.Node (1, &amp;quot;hello&amp;quot;, PrioQueue.Empty, PrioQueue.Empty)&lt;br /&gt;&lt;br /&gt;** 2.2  Signatures&lt;br /&gt;&lt;br /&gt;签名是结构的界面。签名指定了结构的哪些组件可以从外部访问，并通过何种类型。它可以用来隐藏结构中的一些组件（例如局部函数定义）或者由受限的类型导出相关组件。例如下面的签名指定了三个优先列队的操作符“empty”、“insert”和“extract”，但是没有辅助函数“remove_top”。类似的，它使得列队类型抽象化（通过不以具体的类型提供实际的表现形式）。&lt;br /&gt;&lt;br /&gt;#module type PRIOQUEUE =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type priority = int         (* still concrete *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type ’a queue               (* now abstract *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val insert : ’a queue -&amp;gt; int -&amp;gt; ’a -&amp;gt; ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val extract : ’a queue -&amp;gt; int * ’a * ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exception Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module type PRIOQUEUE =&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type priority = int&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val insert : ’a queue -&amp;gt; int -&amp;gt; ’a -&amp;gt; ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val extract : ’a queue -&amp;gt; int * ’a * ’a queue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exception Queue_is_empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;通过该签名限制“PrioQueue”结构的结果是“PrioQueue”结构的另一种使用视角，其中“remove_top”函数不可访问同时有限列队的实际表现是隐藏的：&lt;br /&gt;&lt;br /&gt;#module AbstractPrioQueue = (PrioQueue : PRIOQUEUE);;&lt;br /&gt;module AbstractPrioQueue : PRIOQUEUE&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#AbstractPrioQueue.remove_top;;&lt;br /&gt;Error: Unbound value AbstractPrioQueue.remove_top&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#AbstractPrioQueue.insert AbstractPrioQueue.empty 1 &amp;quot;hello&amp;quot;;;&lt;br /&gt;- : string AbstractPrioQueue.queue = &amp;lt;abstr&amp;gt;&lt;br /&gt;&lt;br /&gt;限制也可以在定义结构的时候执行，就像&lt;br /&gt;&lt;br /&gt;module PrioQueue = (struct ... end : PRIOQUEUE);;&lt;br /&gt;&lt;br /&gt;上面的另一种可选语法是：&lt;br /&gt;&lt;br /&gt;module PrioQueue : PRIOQUEUE = struct ... end;;&lt;br /&gt;&lt;br /&gt;** 2.3  Functors&lt;br /&gt;&lt;br /&gt;函子使用由结构到结构的”函数“。它们用来表达参数化的结构：以结构B作为参数的结构A，简单地说就是以B为形式参数（依照对B期望的签名）的函子F返回实际的结构A自身。函子F随后可以使用到B的若干实现B1...Bn上面，对应的产生结构A1...An。&lt;br /&gt;&lt;br /&gt;例如这里是一个用有序列表作为集合的结构实现，以一个提供集合元素的类型的结构和该类型的排序函数（用来保持集合是有序的）为参数：&lt;br /&gt;&lt;br /&gt;#type comparison = Less | Equal | Greater;;&lt;br /&gt;type comparison = Less | Equal | Greater&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module type ORDERED_TYPE =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val compare: t -&amp;gt; t -&amp;gt; comparison&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module type ORDERED_TYPE = sig type t val compare : t -&amp;gt; t -&amp;gt; comparison end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module Set =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;functor (Elt: ORDERED_TYPE) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = Elt.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = element list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let empty = []&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec add x s =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match s with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; [x]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| hd::tl -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match Elt.compare x hd with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Equal   -&amp;gt; s         (* x is already in s *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Less    -&amp;gt; x :: s    (* x is smaller than all elements of s *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Greater -&amp;gt; hd :: add x tl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let rec member x s =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match s with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[] -&amp;gt; false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| hd::tl -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;match Elt.compare x hd with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Equal   -&amp;gt; true     (* x belongs to s *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Less    -&amp;gt; false    (* x is smaller than all elements of s *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;| Greater -&amp;gt; member x tl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module Set :&lt;br /&gt;&amp;nbsp;&amp;nbsp;functor (Elt : ORDERED_TYPE) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = Elt.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = element list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : ’a list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : Elt.t -&amp;gt; Elt.t list -&amp;gt; Elt.t list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : Elt.t -&amp;gt; Elt.t list -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&lt;br /&gt;通过把函子“Set”应用到一个实现有序类型的结构上，我们获得了该类型的集合操作符：&lt;br /&gt;&lt;br /&gt;#module OrderedString =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type t = string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let compare x y = if x = y then Equal else if x &amp;lt; y then Less else Greater&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module OrderedString :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig type t = string val compare : ’a -&amp;gt; ’a -&amp;gt; comparison end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module StringSet = Set(OrderedString);;&lt;br /&gt;module StringSet :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = OrderedString.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = element list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : ’a list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : OrderedString.t -&amp;gt; OrderedString.t list -&amp;gt; OrderedString.t list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : OrderedString.t -&amp;gt; OrderedString.t list -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#StringSet.member &amp;quot;bar&amp;quot; (StringSet.add &amp;quot;foo&amp;quot; StringSet.empty);;&lt;br /&gt;- : bool = false&lt;br /&gt;&lt;br /&gt;** 2.4  Functors and type abstraction&lt;br /&gt;&lt;br /&gt;在“PrioQueue”例子中，隐藏集合类型的实际实现会是一个良好的习惯，这样该结构的用户就不依赖于集合是一个列表，并我们能够随后切换到其他更高效的集合的表现形式而不破坏它们的代码。这可以通过合适的函子签名限制“Set”来实现：&lt;br /&gt;&lt;br /&gt;#module type SETFUNCTOR =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;functor (Elt: ORDERED_TYPE) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = Elt.t      (* concrete *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set                  (* abstract *)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module type SETFUNCTOR =&lt;br /&gt;&amp;nbsp;&amp;nbsp;functor (Elt : ORDERED_TYPE) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = Elt.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module AbstractSet = (Set : SETFUNCTOR);;&lt;br /&gt;module AbstractSet : SETFUNCTOR&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module AbstractStringSet = AbstractSet(OrderedString);;&lt;br /&gt;module AbstractStringSet :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = OrderedString.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = AbstractSet(OrderedString).set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#AbstractStringSet.add &amp;quot;gee&amp;quot; AbstractStringSet.empty;;&lt;br /&gt;- : AbstractStringSet.set = &amp;lt;abstr&amp;gt;&lt;br /&gt;&lt;br /&gt;试图更优雅的书写类型约束，有人会希望命名函子返回的结构的签名，然后在约束中使用那个签名：&lt;br /&gt;&lt;br /&gt;#module type SET =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module type SET =&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module WrongSet = (Set : functor(Elt: ORDERED_TYPE) -&amp;gt; SET);;&lt;br /&gt;module WrongSet : functor (Elt : ORDERED_TYPE) -&amp;gt; SET&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module WrongStringSet = WrongSet(OrderedString);;&lt;br /&gt;module WrongStringSet :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = WrongSet(OrderedString).element&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = WrongSet(OrderedString).set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#WrongStringSet.add &amp;quot;gee&amp;quot; WrongStringSet.empty;;&lt;br /&gt;Error: This expression has type string but an expression was expected of type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WrongStringSet.element = WrongSet(OrderedString).element&lt;br /&gt;&lt;br /&gt;这里的问题是“Set”制定的类型元素是抽象的，使得在函子结果的元素和参数的“t”之间类型相等被遗忘了。所以“WrongStringSet.element”和字符串是不同的类型，“WrongStringSet”上的操作不能使用到字符串上。正如上述演示，签名“Set”中的类型元素声明为和“Elt.t”相等是很重要；不幸地，由于“SET”定义在“Elt”不存在的上下文中上面的想法是不可能的。为了克服这个困难，Objective Caml提供了签名上的类型约束来允许使用额外的类型相等来扩充一个签名：&lt;br /&gt;&lt;br /&gt;#module AbstractSet = &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(Set : functor(Elt: ORDERED_TYPE) -&amp;gt; (SET with type element = Elt.t));;&lt;br /&gt;module AbstractSet :&lt;br /&gt;&amp;nbsp;&amp;nbsp;functor (Elt : ORDERED_TYPE) -&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = Elt.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br /&gt; &lt;br /&gt;和简化结构定义的情况一样，定义函子并约束其结果提供有另一种语法：&lt;br /&gt;&lt;br /&gt;module AbstractSet(Elt: ORDERED_TYPE) : (SET with type element = Elt.t) =&lt;br /&gt;&amp;nbsp;&amp;nbsp;struct ... end;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;抽象函子结果的类型组件是一个强大的技术来提供我们所描述的这样提供了高度的类型安全。考虑一个字符串序不同于在“OrderedString”结构中实现的标准顺序。例如我们忽略大小写来比较字符串。&lt;br /&gt;&lt;br /&gt;#module NoCaseString =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type t = string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let compare s1 s2 =&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OrderedString.compare (String.lowercase s1) (String.lowercase s2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;;&lt;br /&gt;module NoCaseString :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig type t = string val compare : string -&amp;gt; string -&amp;gt; comparison end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#module NoCaseStringSet = AbstractSet(NoCaseString);;&lt;br /&gt;module NoCaseStringSet :&lt;br /&gt;&amp;nbsp;&amp;nbsp;sig&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type element = NoCaseString.t&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type set = AbstractSet(NoCaseString).set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val empty : set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val add : element -&amp;gt; set -&amp;gt; set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val member : element -&amp;gt; set -&amp;gt; bool&lt;br /&gt;&amp;nbsp;&amp;nbsp;end&lt;br /&gt;&amp;nbsp;&lt;br /&gt;#NoCaseStringSet.add &amp;quot;FOO&amp;quot; AbstractStringSet.empty;;&lt;br /&gt;Error: This expression has type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AbstractStringSet.set = AbstractSet(OrderedString).set&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;but an expression was expected of type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NoCaseStringSet.set = AbstractSet(NoCaseString).set&lt;br /&gt;&lt;br /&gt;注意“AbstractStringSet.set”和“NoCaseStringSet.set”这两个类型是不兼容的，这两个类型的值不相匹配。这是正确的行为：即使两个集合包含相同类型（字符串），两者构建于该类型的不同的顺序，操作符需要维护不同的不变量（标准顺序的严格递增和忽略大小写的顺序）。把“AbstractStringSet”的操作应用到类型“NoCaseStringSet.set”的值会给出错误的结果，或创建了违背“NoCaseStringSet”的不变量的列表。&lt;br /&gt;&lt;br /&gt;** 2.5  Modules and separate compilation&lt;br /&gt;&lt;br /&gt;目前所有的模块的例子都是在交互系统的上下文中给出。不过模块对大型的批量编译程序格外有用。对这样的程序，存在实践的必要性把源代码分割到若干文件中，称为编译单元，可以单独的编译，由此最小化修改后的重编译。&lt;br /&gt;&lt;br /&gt;在Objective Caml中，编译单元是结构和签名的特例，单元之间的关系可以从模块系统的方面容易地解释。一个编译单元A包含两个文件：&lt;br /&gt;&lt;br /&gt;实现文件A.ml，包含一序列定义，相当于在“struct…end”构造之内；&lt;br /&gt;界面文件A.mli，包含一序列规格，相当于在“sig…end”构造之内。&lt;br /&gt;&lt;br /&gt;两个文件定义了一个名为A的结构如同下面的定义插入在顶层环境中：&lt;br /&gt;&lt;br /&gt;module A: sig (* contents of file A.mli *) end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= struct (* contents of file A.ml *) end;;&lt;br /&gt;&lt;br /&gt;文件定义的编译单元可以用“ocamlc -c”命令（-c选项表示“只编译，不要连接”）单独编译；这样产生了编译的界面文件（以.cmi为扩展名）和编译的目标代码文件（以.cmo为扩展名）。当所有的单元都被编译，它们的“.cmo”文件使用“ocaml&amp;quot;连接在一起。例如下列命令编译并连接一个由两个编译单元“Aux”和“Main”组成的程序：&lt;br /&gt;&lt;br /&gt;$ ocamlc -c Aux.mli                     # produces aux.cmi&lt;br /&gt;$ ocamlc -c Aux.ml                      # produces aux.cmo&lt;br /&gt;$ ocamlc -c Main.mli                    # produces main.cmi&lt;br /&gt;$ ocamlc -c Main.ml                     # produces main.cmo&lt;br /&gt;$ ocamlc -o theprogram Aux.cmo Main.cmo&lt;br /&gt;&lt;br /&gt;这个程序的行为正如同下列语句插入到顶层环境：&lt;br /&gt;&lt;br /&gt;module Aux: sig (* contents of Aux.mli *) end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= struct (* contents of Aux.ml *) end;;&lt;br /&gt;module Main: sig (* contents of Main.mli *) end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= struct (* contents of Main.ml *) end;;&lt;br /&gt;&lt;br /&gt;特别地，“Main”可以引用“Aux”：“Main.ml”和“Main.mli”所包含的定义和声明可以引用“Aux.ml”的定义，使用“Aux.ident”标记，如果“Aux.mli”导出了这些定义的话。&lt;br /&gt;&lt;br /&gt;在连接阶段给“ocaml”的“.cmo”文件的顺序决定了模块定义发生的顺序。因此在上面的例子中，“Aux”先出现并且“Main”可以引用它，但是“Aux”不能引用“Main”。&lt;br /&gt;&lt;br /&gt;注意仅仅顶层的结构可以映射到单独编译的文件，并且不是函子或者模块类型。不过所有的模块类对象可以以结构的组件出现，所以解决方法是把函子和模块类型放在结构内，这样就能映射为文件了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* 翻译说明&lt;br /&gt;&lt;br /&gt;** 什么是OCaml/ML语言&lt;br /&gt;&lt;br /&gt;OCaml是ML语言（当初作为可计算理论证明的工具产生的）的主要方言之一Caml语言当前的实现和扩展，是由INRIA开发的多范式语言。相比于ML另一方言SML，Caml语言是由它的实现（目前是OCaml）所描述的一种语言而没有基于某一报告或标准。但是OCaml在ML的基础上作出有用的扩展和尝试，使之在函数式编程语言中较适合做实际的应用。虽然ML系的语言并不广为使用（貌似仅在一些性能有关的金融数据分析的场合），但是这无法掩盖其设计上存在优异之处。并且OCaml目前在众Linux发行版中得到了较重点的支援，也影响到了F#和Scala语言的产生。关于编程语言类型的一书《Types And Programming Languages》中以OCaml作为描述语言。&lt;br /&gt;个人觉得OCaml的代码十分清晰易读，至少从上面出现的例子中可以感知一二。它比Lisp更接近数学表达式，而比Haskell语法糖要少。在编译过程中编译为带类型的Lambda表达式的，这是它和它之前的函数式语言相通的地方。&lt;br /&gt;&lt;br /&gt;** 和Standard ML的比较&lt;br /&gt;&lt;br /&gt;SML当前是依据97年的修订报告，其功能和OCaml的核心加上模块这两部分是一致的，在语法上有些许差异。例如SML区分地除type外用datatype声明变体类型，用fun代替let绑定函数类型，用case...of而不是match...with进行模式匹配，用访问方法而不是下标的形式取记录的元素，有单独的eqtype表示可以判断相等的类型，在不同的内置类型重载了同样的算数运算符。&lt;br /&gt;SML更关注于语言自身的规范和设计，在ML系语言中SML更加适合在教学场合中使用，并且不像OCaml受到法国文化的影响。&lt;br /&gt;&lt;br /&gt;** 关于所翻译内容的说明&lt;br /&gt;&lt;br /&gt;这里翻译的是OCaml手册中An introduction to Objective Caml部分的前两章节，这部分的原理是对所有ML系语言都使用，并且涵盖了编写程序时需要使用到的特性。其中核心部分用于编写一般的程序逻辑，而模块系统用于使用标准库和创建自己的库。其他特性如面向对象部分在很多实际应用中并没有用到。如果想通过实际的例子来获得一些感受的话：&lt;br /&gt;简略的参考发卡片可以看&lt;br /&gt;http://www.ocamlpro.com/code/2011-06-03-cheatsheets.html&lt;br /&gt;这次有许多小的算法片段&lt;br /&gt;http://rosettacode.org/wiki/Category:OCaml&lt;br /&gt;一些开源项目的代码也可以拿来阅读，例如&lt;br /&gt;形式语言系统Coq和P2P客户端Mldonkey。&lt;br /&gt;&lt;br /&gt;** OCaml中提供的其他特性&lt;br /&gt;&lt;br /&gt;其他特性的话，首先要说到面向对象特性，其围绕object,、class和type这三个关键词展开。注意OCaml在运行式已经擦除了类型信息，所以类型转换只能往父类单向进行，不过type仅代表接口上的关系而与class无关。在OCaml中继承表示句法关系而子类型表示语义关系，两者使用了不相干的语法。&lt;br /&gt;至于常用的而上面没有说到的特性，一个是Labels，作为函数的关键词参数使用，另一个是Polymorphic variants，类似于Scheme中的Symbol。&lt;br /&gt;此外还包含了一个标准库，和若干哦你工具如创建解析器的ocamllex和ocamlyacc以及从代码中生成文档的ocamldoc还有调试和性能测试工具。&lt;br /&gt;另外有个语言扩充允许match语句中用when表示以条件来匹配还是一个较有用的特性。&lt;br /&gt;&lt;br /&gt;** 有关的参考文档和阅读资料&lt;br /&gt;&lt;br /&gt;首先是官网上的文档，包括OCaml和Caml Light的手册。它们侧重于对语言和实现本身的描述，这是书写程序时所必备的参考。&lt;br /&gt;http://caml.inria.fr/resources/&lt;br /&gt;还有oreilly的书名为《Developing Applications With Objective Caml》在官网是也免费的提供，涵盖了语言的教程和若干经验。&lt;br /&gt;http://caml.inria.fr/pub/docs/oreilly-book/&lt;br /&gt;&lt;br /&gt;** 可以使用的IDE工具&lt;br /&gt;&lt;br /&gt;良好的缩进对代码的可读性相当重要，有编辑器帮助的话会很方便的。&lt;br /&gt;这年头程序语言貌似都有强制缩进格式的倾向，让不同的人写出缩进完全一样的代码。&lt;br /&gt;在Emacs中可以使用Tuareg Mode；在Ecliipse中可以使用OcaIDE，Scite也自带了OCaml的语法高亮。&lt;br /&gt;&lt;br /&gt;** 和Haskell语言的区别&lt;br /&gt;&lt;br /&gt;语法的外表上有继承关系倒是了，况其也是随着ML系的强类型函数式语言这一范式发展过来的。&lt;br /&gt;区别在于Haskell是non-strict的，求值仅在需要是进行（注意一下此时的内存分配情况）；是核心部分是纯函数语言，命令式借助于函数的continuation约束执行的次序并由强类型机制约束发生的范围；支持函数的重载，通过typeclass使得同样名称的操作符可以用到不同类型的实例上。此外，Haskell的模块机制和类型无关，仅表示标识符的可见性。&lt;br /&gt;现在Haskell的关注度于已经有超越ML系的趋势，并且自身发展和用户群体更为活跃。&lt;br /&gt;&lt;br /&gt;** 关于此次翻译的说明&lt;br /&gt;&lt;br /&gt;本来是想根据官方文档的内容来简要的表述一下，后来发觉以自身的能力想说清楚是有难度的，所以就演变成了字面的直译了。&lt;br /&gt;这样可能产生了莫名其妙的曲解，在此也只能暂且就这样了。虽然翻译的曲解不会影响到原文的意思，但是给不幸接触到此文的人误导就不好了。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/2170970700863375216/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/2170970700863375216' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2170970700863375216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2170970700863375216'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/07/objective-caml.html' title='静态类型函数式语言Objective Caml/ML的简要介绍【程序语言介绍】'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-8109586980954306780</id><published>2011-06-30T23:06:00.012+08:00</published><updated>2011-07-08T23:33:13.444+08:00</updated><title type='text'>面向Scheme用户的Common Lisp语言的小贴士【程序语言介绍】</title><content type='html'>* Scheme&lt;br /&gt;Scheme的主要参考资源是SICP和R5RS，优点是语言设计的相当精巧，便于学习和理解程序的原理。&lt;br /&gt;&lt;br /&gt;* Common Lisp&lt;br /&gt;Common Lisp是Lisp最主要的方言之一，是为了标准化众多分支而产生的，在AI领域特别是符号计算方面有所应用。和Lisp的另一方言Scheme相比，更适合写实际可用的程序，而不限于演示的目的。&lt;br /&gt;本文假定读者已经了解了Scheme语言的基本使用，将侧重于CL语言自身中有差异的部分，以减少在使用CL因为困惑而不自在。&lt;br /&gt;Lisp的共同点是在于List，这里尽量把Scm和CL当作不同的语言来看待，避开去具体比较之间的相似和相异之处。&lt;br /&gt;这里假设已经了解了Lisp系语言的基本使用和编程范式，将仅从语言特性角度来看反而能都看到CL的一些特别之处。&lt;br /&gt;&lt;br /&gt;* 参考文档&lt;br /&gt;** Common Lisp the Language, 2nd Edition&lt;br /&gt;语言描述文档，对语言特性和提供的库都有详细的说明&lt;br /&gt;** Common Lisp HyperSpec&lt;br /&gt;参考手册，用于查阅，形式类似于按照关键词组织的卡片表格样式&lt;br /&gt;** ANSI Common Lisp&lt;br /&gt;偏向于语言特性的教学，很适合本文的话题，所以这里将按照这本书的结构来写&lt;br /&gt;&lt;br /&gt;* 正文 &lt;br /&gt;** 缩进对阅读代码来说，相当重要。如下内容如有歧义请以文档为准&lt;br /&gt;** 列表list是Lisp中重要的数据结构，同时Lisp语言的表达式也以list形式书写，表达式可以求值&lt;br /&gt;** 断言predicate命名以p结尾&lt;br /&gt;** t表示true而nil表示false，t是所有类型的supertype，nil是所有类型的subtype&lt;br /&gt;** 为方便表示不同的操作符，下面将Function称为函数，将Special Form称为语句，将Macro称为宏，有时候在用法上之间的差异会模糊&lt;br /&gt;** 用defun定义全局函数，用defparameter定义全局变量并计算初始值（如果仅仅是定义的话，也可用defvar），用defconstant定义全局常量&lt;br /&gt;** 用let/let*绑定局部变量，用flet/labels绑定局部函数&lt;br /&gt;** 宏destructuring-bind可以接受模式pattern形式的绑定&lt;br /&gt;** 语句setf用来改变全局或局部符号或表达式所表示的空间所绑定的值，当符号未绑定时自动绑定全局符号&lt;br /&gt;** 语句setf可以同时接受多组符号和值的绑定，这里的符号可以是符号类型，也可是表达式来指定符号的空间或者表示对对象的修改&lt;br /&gt;** 函数参数从左到右执行，函数定义时允许递归调用&lt;br /&gt;** 格式化函数format的第一个参数表示输出的方式，格式字符串~A表示在该处输出值，~%表示换行&lt;br /&gt;** 格式化函数中的格式字符串有一些复杂但有效的用法&lt;br /&gt;** 语句quote可以在包内获取或创建符号，或者用来创建列表，可缩写为&#39;&lt;br /&gt;** 语句function可以将符号或lambda表达式对应的函数，可缩写为#&#39;&lt;br /&gt;** 以lambda开头的不是函数或者语句，而是一种单独形式表达式，类似于列表&lt;br /&gt;** 函数apply和funcall用来将函数作用到参数上，第一个参数可以是函数也可以是符号，但不建议是lambda表达式&lt;br /&gt;** 判断值的类型可以用类型相关的断言，或者用函数typep进行比较，typecase进行分支，deftype定义类型，coerce进行类型转换&lt;br /&gt;** 判断值的内容是否相同用eql，判断列表及每个元素相同用equal，判断值所在的地址是否相同用eq&lt;br /&gt;** 列表list通过函数list生成或者通过make-list来创建，内部由点对pair构成&lt;br /&gt;** 用copy-list和copy-alist和copy-tree来复制列表和关联列表和嵌套列表&lt;br /&gt;** 函数mapcar用来通过某函数将列表的每个元素映射并新创建一个列表&lt;br /&gt;** 列表可以充当集合Set使用，或者是序列Sequence，或者是堆Stack，或者是关联列表Assoc-list，在CL中提供有相关的函数&lt;br /&gt;** 多维数组由函数make-array创建或者用#na生成，由函数aref引用下标，并可由setf来改变数组内的值&lt;br /&gt;** 向量是一种一维数组，用vector或者#()来生成，通过svref来引用。数组的函数如sort和aref同样可用&lt;br /&gt;** 字符串也是一种一维数组，可以用equal判断相等（区分大小写），同时也有专门用于字符串的函数如函数char来获取下标对应的字符以及不区分大小写的比较（以“string-”为前缀）&lt;br /&gt;** 列表可用nth获取下标，不过由于是递归调用cdr/rest所以性能不佳。和向量及字符串一起，都可以使用序列相关的函数，如elt获取下标对应的元素&lt;br /&gt;** 序列相关的函数常见的关键词是:key :test :from-end :start :end&lt;br /&gt;** 形如(defstruct point x y)定义了两个成员的结构Structure，由(make-point :x 0 :y 0))创建实例，并得到访问函数point-x和point-y，提供有setf形式用于修改，断言名为point-p。&lt;br /&gt;** 字段可有初始值，结构也由:cone-name定义对应函数的前缀，有:print-function定义打印方式&lt;br /&gt;** 哈希表Hash Table由make-hash-table创建（其:test默认为eql），gethash访问（其第二个返回值表示是否存在）&lt;br /&gt;** 控制流程中语句progn依次执行语句并返回最后一个值，语句block的第一个参数表示标签并可用return-from返回语句块的值（标签为nil时可用return，也可在一些语句内使用，函数名可作为标签使用），tagbody可在内部任意位置位置使用并由通过go来跳转&lt;br /&gt;** 分支cond和case的最后一个分支可以是t或者otherwise表示默认的情况&lt;br /&gt;** 循环和迭代过程可以使用do或do*或dolist或dotimes或mapc（不返回值的mapcar）或loop&lt;br /&gt;** 语句可以返回列表也可以由values返回多个值，通常只有第一个值其作用，可由multiple-value-bind或multiple-value-call或multiple-value-list使用多返回值&lt;br /&gt;** 非局部跳转（跨越函数调用）可以用throw（参数为标签加返回值）和catch和unwind-protect ，而错误error会触发error handler&lt;br /&gt;** 函数symbol-function用来获取符号对应的全局函数，也可以用setf的形式使用，它不可以用来访问局部函数&lt;br /&gt;** 用documentation可以获得defun中参数后的描述用字符串，函数之外的类型也可以定义这样的文档&lt;br /&gt;** 参数列表Parameter List指函数定义和调用时的&amp;rest &amp;optional &amp;key，可以有默认值&lt;br /&gt;** 函数定义中可以指定某变量使用动态作用域，形如(declare (special x))，可以在修改全局变量时以免造成副作用的扩散&lt;br /&gt;** 函数compile用来编译符号所对应的函数，有些操作符会在编译期执行的，会影响到性能和一些值的绑定。&lt;br /&gt;** 递归可以用数学归纳法来考虑&lt;br /&gt;** 标准输入输出流Stream所存放的全局变量是*standard-input*和*standard-output*&lt;br /&gt;** 由make-pathname创建路径，函数open（:direction表示读写方式）由路径打开流，函数close关闭流&lt;br /&gt;** 宏with-open-file所定义的语句有一个隐含的unwind-protect的close，其第一个参数的首元素是该语句中绑定到流的变量名&lt;br /&gt;** 函数read-*默认使用以*standard-input*作为字符输入，函数read-from-string从参数的字符串作为输入流，在读取时read-macro会被展开&lt;br /&gt;** 函数prin1可以和read配对使用（会将转义字符显示出来），通常的输出使用princ，函数pprint对应*print-pretty*非nil&lt;br /&gt;** 函数format中的格式化字符串在~后可跟,分割的参数，参数可空，右侧,可省略&lt;br /&gt;** 符号Symbol不区分大小写（对于包含空格等字符的符号名，可以用双&quot;|&quot;包围），会intern到包package中，不同的包里的同名符号是不同的。&lt;br /&gt;** 以冒号为前缀的关键词keyword的值是其本身，与包的作用域无关。有时需要用gensym得到一个唯一的符号。&lt;br /&gt;** 函数intern用于从字符串在包内查找或创建符号，每个符号有它的属性列表&lt;br /&gt;** 包由宏defpackage创建，可以指定:use :nicknames :export，使用in-package切换到某包内&lt;br /&gt;** 通过“包名:符号名”的形式来使用别的包里导出export的符号&lt;br /&gt;** 当符号有绑定全局变量时，可以用symbol-value获得该变量的值（不同的类型可以绑定到同一个符号）。局部变量只在编译或解释存在，不可以混用&lt;br /&gt;** 类型number分为integer float ratio complex，存在自动和手动的类型转换&lt;br /&gt;** 用=可以比较两个数是否相等（“/=表示参数各不相等”），而eql不仅要相等好需要类型一致&lt;br /&gt;** 整数分为fixnum（最大正值为常量most-positive-fixnum）和bignum，会自动转换。浮点数有四种，之间储存和计算的精度不同&lt;br /&gt;** eval以列表作为参数，执行使用全局作用域&lt;br /&gt;** 定义宏defmacro返回一个列表，语法类似于defun，用macroexpand-1可以手动展开，常配合Backquote书写&lt;br /&gt;** 宏将在在使用它的程序执行前替换原表达式，需要区分编译时和运行时执行的部分，以及和调用的上下文的影响（建议配合let使用）&lt;br /&gt;** 用于setf的同名宏通过define-modify-macro定义，setf中的表达式参数作为该宏的第一个参数&lt;br /&gt;** 定义类defclass，其参数为类名，超类列表，槽列表。函数make-instance通过符号创建类，函数slot-value访问实例的槽&lt;br /&gt;** 槽slot可以定义:accessor :initarg :initform，定义“:allcation :class”则槽属于类而非实例，槽还可以定义:documentation :type&lt;br /&gt;** 子类会继承超类superclass的槽，类可以有多个超类，按照从到右深度优先&lt;br /&gt;** 同名的槽，:allocation :initform :documentation取做特殊化的类（子类），:initargs :accessors :readers :writers取并集，:type取交集，同名依据符号相同来判断&lt;br /&gt;** standard-object是standard-class的实例，是t的subtype，是其他所有class的superclass&lt;br /&gt;** 宏defmethod用于定义方法，可以给参数定义class或者type或者eql条件&lt;br /&gt;** 方法必须有相同数量的参数，可选参数也需要个数一致，&amp;rest或&amp;key需要同时存在或不存在。其中只有必须的参数可以特例化，如果类型一致会覆盖先前定义的特例方法&lt;br /&gt;** 由方法定义的函数称为generic function，可以对不同的类定义不同的方法，类型依照参数从左到右的顺序匹配定义了特例且最特例的类型，这有消息转递模型所差异&lt;br /&gt;** 可以在方法的基础上定义辅助auxiliary方法:before(按照特殊往一般的顺序) :after（按照一般往特殊的顺序） :around（只执行最特殊的，可以(if (next-method-p) (call-next-method))）&lt;br /&gt;** 宏defgeneric用于将所有的方法看作一个整体，例如可用:method-combination通过某操作符混合所有的方法&lt;br /&gt;** CLOS可以配合PACKAGE机制来只导出需要暴露的函数&lt;br /&gt;** 列表类型（也包括其他的容器）中会存在节点数据的共享，并可能构成环（打印需要*print-circle*指定为t，使用#n=和#n#来读入）。特别要注意副作用会影响到所有引用它的数据，例如member就会引用原数据，而list会创建一个新的列表（quote就不会）&lt;br /&gt;** 操作列表的参数以形式(setf list1 (** list1))来使用，这里的操作符有的会创建新的列表，有的则是破坏性的destructive&lt;br /&gt;** 破坏性的操作会改变对象的数据，但是不保证会做出如何的修改，而是确保返回值是正确的，这样可以比完全重新创建列表有性能上的好处&lt;br /&gt;** 有无破坏性的函数可能会对应提供，如mapcar和mapcan，remove和delete，append和nconc，subst和nsubst，通常以命名以n为前缀（表示non-consing）&lt;br /&gt;** 可以用declare定义函数的编译参数，以及用declaim定义全局的，包括optimize inline type，用the定义表达式的类型，数组时可定义:element-type，已知类型可以加快对方法的查找。性能的因素可以在不影响语句时再完善&lt;br /&gt;** 可以定义类型，如(vector fixnum 20)，(simple-array fixnum (4 4))，(integer 1 100)，(simple-array fixnum (* *))，(or vector (and list (not (satisfies circular?))))&lt;br /&gt;** 容易可以定义大于:fill-pointer的空间，以便添加元素用。创建pool可以重复使用以创建的对象，减少cons和gc的开销&lt;br /&gt;** 当流是:element-type &#39;unsigned-byte时可以read-byte/write-byte&lt;br /&gt;** 定义read-macro通过set-macro-character以及set-dispatch-macro-character来通过流返回列表&lt;br /&gt;** 用户默认包是common-lisp-user，可以用make-package创建用in-package进入，用export导出use-package使用&lt;br /&gt;** 宏loop用来书写迭代过程，可以仿照已有的例子来使用&lt;br /&gt;** 函数error ecase check-type assert会抛出错误，可用ignore-errors转化为nil&lt;br /&gt;** 语句or和and是语句，本身不是函数，也不像C++中那样可以overload为函数&lt;br /&gt;** 可以使用trace以及交互模式中的指令对代码进行调试，交互回话可以保存为映像&lt;br /&gt;** 通过函数load载入文件，通过eval-when在设置在装载或编译时执行语句&lt;br /&gt;** 可以根据所使用的类型，有必要知道一下CL已经自带的一些函数或宏或方法&lt;br /&gt;&lt;br /&gt;* Wiki&lt;br /&gt;http://www.cliki.net&lt;br /&gt;&lt;br /&gt;* 实现&lt;br /&gt;我暂且用的是gcl和clisp，因为比较容易上手，话说自己还没什么CL的使用使用经验。&lt;br /&gt;IDE可以用SLIME，LispIDE或者带tag和高亮和括号匹配的文本编辑器也行，Cusp不知还在维护否。&lt;br /&gt;有一些开源的符号计算软件使用CL实现的，可以作为学习的资源和参考。&lt;br /&gt;&lt;br /&gt;* 其他方言或相关语言&lt;br /&gt;** Emacs Lisp&lt;br /&gt;** Visual Lisp&lt;br /&gt;** Clojure&lt;br /&gt;** Dylan&lt;br /&gt;&lt;br /&gt;* 接下来...&lt;br /&gt;** 面向Scheme用户的ML语言的小贴士&lt;br /&gt;** 面向Scheme用户的Haskell语言的小贴士&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;用org-mode列了一个提纲，展开缺乏，看着有点别扭。&lt;br /&gt;有些细节可能会有理解误差，这里仅仅是导读的目的了。&lt;br /&gt;此文纯介绍性质，不建议随意地在实际目的中使用。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;关于另一个很重要的特性，就是程序边运行边修改，自己还没有这方面的经验和习惯，但是CL的一些语言设计确实有为这种用法考虑。&lt;br /&gt;如果是有经验实现可以选择SBCL+SLIME，本文只是一个浅尝辄止的态度的产物，虽然出发点是想说说Scm和CL的差异的说。&lt;br /&gt;恩...有些地方简略地有些不明不白了...&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;貌似说reduce要优于不定长参数。&lt;br /&gt;loop宏和尾递归是两种风格不同的东西，前者算是更进一步的抽象吧。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/8109586980954306780/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/8109586980954306780' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8109586980954306780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/8109586980954306780'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/06/schemecommon-lisp.html' title='面向Scheme用户的Common Lisp语言的小贴士【程序语言介绍】'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-1377376285992854155</id><published>2011-06-13T10:45:00.010+08:00</published><updated>2011-06-17T12:48:18.515+08:00</updated><title type='text'>《现代操作系统》一书中的每章节的小结部分，放在这里的算是此书中比较浅显的概括</title><content type='html'>把每章节的SUMMARY翻译了一下，书是ISBN0-13-031358-0，有976页，这不是该书当前的最新版本。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MODERN OPERATING SYSTEMS&lt;br /&gt;SECOND EDITION&lt;br /&gt;by Andrew S. Tanenbaum&lt;br /&gt;&lt;br /&gt;* 0 前言&lt;br /&gt;空&lt;br /&gt;&lt;br /&gt;* 1 介绍&lt;br /&gt;操作系统可以从两个视角来看待：资源管理器和扩产的机器。从资源管理器的角度说，操作系统的工作是有效的管理系统的不同的部分。从扩充的机器的角度说，操作系统的工作是给用户提供一个比真实机器方便使用的虚拟机器。&lt;br /&gt;操作系统有一个很长的历史，从它们代替一般的操作的时候开始，到现代的多程序的系统。重要的包括早期的批处理系统、多程序系统、以及个人计算机系统。&lt;br /&gt;由于操作系统紧紧地和硬件交互，一些计算机硬件的知识对于理解操作系统的有用的。计算机由处理器、储存器以及I/O设备组成。这些部分由总线连接。&lt;br /&gt;所有的操作系统都依赖的概念是进程、内存管理、I/O管理、文件系统和安全。它们都会在随后的章节里处理。&lt;br /&gt;任何操作系统的核心是一系列可以处理的系统调用。它们表明了操作系统实际能做的事情。利于UNX系统，我们接触了一组系统调用。第一组系统调用和进程的创建和终止有关。第二组用来读取和写入文件。第三组用于目录管理。第四组包括其他杂项调用。&lt;br /&gt;操作系统结构可以有多种方式。最常见的为单片机系统、层状层次、虚拟机系统、集成内核或者使用客户机服务器模型。&lt;br /&gt;&lt;br /&gt;* 2 进程和线程&lt;br /&gt;为了隐藏中断的作用，操作系统提供了由一系列进程并行运行组成的概念模型。进程可以被动态的创建和终止。每个进程有它自己的地址空间。&lt;br /&gt;对于某些应用让一个进程里有多个线程控制是很有用的。这些线程相互独立地调度并个人有自己的堆栈，但是进程里的所有进程享用共同的地址空间。线程可以实现在用户空间或者内核当中。&lt;br /&gt;进程和使用进程间的通讯机制相互通信，例如信号、监视、或者消息。这些机制用来确保不会有两个进程同时在它们会引起混乱的关键区域。进程可以正在运行、可运行或者阻塞状态，并且可以在自己或者另一个进程运行一个通讯机制的中断的时候改变状态。线程间的通讯也是类似的。&lt;br /&gt;进程间的通讯机制可以解决一些问题、比如生产消费问题、餐饮的哲学家问题、读取器与写入器的问题、以及睡觉的理发师的问题。即使使用了这些机制，仍然需要避免错误和死锁问题。&lt;br /&gt;许多调度算法为人所知。它们中一些原先是用于批处理系统的，例如最短任务优先。另一些则在批处理系统中和交互系统中通用。包括循环调度、优先级调度、多级列队、保障调度、彩票调度、以及公平共享调度。一些系统在调度机制和调度方针之间有明确的划分，这样就可以允许用户来控制调度算法。&lt;br /&gt;&lt;br /&gt;* 3 死锁&lt;br /&gt;死锁是任何操作系统中都潜在的问题。它在发生在一组进程中各被授权独立地访问一些资源，并每个进程也需要已经属于该组中其他进程的资源。这些进程被阻塞并都永远不能再运行。&lt;br /&gt;死锁可以通过跟踪什么状态是安全的以及什么状态是不安全的来避免。安全的状态是才能在的一序列时间可以保证所有的进程可以结束。不安全的状态是没有这样的保证。Banker算法可以通过拒接将系统的置于不安全状态的请求来避免死锁。&lt;br /&gt;死锁可以通过建立一种让它永远不会产生的设计来阻止。例如，通过仅允许进程只能同时持有一个资源，死锁的循环等待条件就被打破了。死锁也可以通过给所有的资源编号、并让进程请求资源严格按照递增的顺序。饥饿可以通过先来先服务的分配方针。&lt;br /&gt;&lt;br /&gt;* 4 内存管理&lt;br /&gt;在这章中我们探讨了内存的管理。我们看到最简单的系统不交换或分页。一旦程序被载入内存中，它将持续到结束。一些操作系统仅允许某时刻仅有一个进程在内存中，而另一些支持多程序。&lt;br /&gt;下一步是交换。通过交换的应用，系统可以处理比内存空间更多的程序。没有空间的进程交换出到磁盘。内存和磁盘上的自由空间通过位图或者列表的形式跟踪。&lt;br /&gt;现代的计算机通常有某种形式的虚拟内存。在最简单的形式中，每个进程的机制空间划分为称为页面大小一致的块，可以放置到内存中任意可获得的页面帧里面。有许多页面替换算法：两种较好的算法是Aging和WSClock。&lt;br /&gt;页面系统的模型可以看作程序中抽象的页面引用字符串合计使用同样的字符串的不同算法。这些模型可以用来做出一些对分页行为的预测。&lt;br /&gt;为了使分页系统工作良好，选择算法是不够的；还需要注意到一些问题如工作集的决定、内存分配的方针、以及页面的大小。&lt;br /&gt;分段有助于在在执行中处理改变大小的数据结构并简化了连接和共享。它也促成了不同分段的不同保护方式。有时分段和分页是组合在一起提供了二维的虚拟内存模型。MULTICS和Intel Pentium系统支持分段和分页。&lt;br /&gt;&lt;br /&gt;* 5 输入/输出&lt;br /&gt;输入/输出是一个常被忽视，但是重要的话题。任何系统中相当大的部分是和I/O相连的。I/O可以通过三种方式来完成。第一种，是可编程了I/O，其中主CPU输入或输出每个字节或字并保持紧张的循环等待直到它能得到或发送下一个数据。第二种是中断驱动的I/O，其中CPU开始对字符或单词的传输后离开去做别的事情，直到中断到达表示I/O完成的信号。第三种是通过DMA，它是一个单独管理用户传输数据块的芯片，只有在整块数据传输完成的时候给出中断。&lt;br /&gt;I/O可以以四个层次来结构：中断服务程序，设备驱动程序、设备无关的I/O软件、以及用户空间中的I/O库和后台程序。设备驱动处理运行设备的细节以及为余下的系统提供一致的接口。设备无关的I/O软件进行缓冲和错误报告之类的事情。&lt;br /&gt;磁盘有多种类型，包括磁性的磁盘、阵列、和各种光盘。磁头的调度算法通常可以用来提升磁盘性能，不过这关系到所呈现的几何形态的复杂度。通过连接两个磁盘，可以构建特定作用属性的稳固储存。&lt;br /&gt;时钟用于跟踪真实事件，限制进程可以运行时间长度、处理看门狗定时器、以及做报告。&lt;br /&gt;面向字符的终端有一些特殊字符可用户输入和一些转义字符用于输出。输入可以在原始模式或者烹饪模式，这取决于程序想对输入有多少控制。输出中的转义序列控制光标的移动，并用户允许插入和删除屏幕上的文字。&lt;br /&gt;许多个人计算机使用GUI来输出。它们基于WMP范式：窗口、图标、菜单、以及指点设别。基于GUI的设备一盘是事件驱动的，通过键盘鼠标以及其他送往程序的事件被尽快地处理。&lt;br /&gt;网络终端有若干形式。其中一种最流行的是运行复杂地用于构建图形界面的X系统。X窗口的另一中方式是使用低层次的接口通过网络传输简单的原始像素。SLIM终端的实验显示这项技术也可以很好的工作。&lt;br /&gt;最后，电源管理是便携计算机的一个主要的问题，因为电池的寿命是有限的。各种技术可被操作系统采用来降低电源的损耗。程序可以通过牺牲一些性能来帮助延长电池的使用时间。&lt;br /&gt;&lt;br /&gt;* 6 文件系统&lt;br /&gt;从外面来看，文件系统是文件和目录的集合，加上对它们的操作。文件可以被读取和写入，目录可以创建和销毁，并且文件可以在目录间移动。大部分现代的文件系统支持层次的目录系统，其中目录可以有子目录，并它们循环地继续有子目录。&lt;br /&gt;当从内部来看，文件看起来有很大的不同。文件的设计者必须考虑储存是如何分配，以及系统是如何跟踪哪个块是属于哪个文件。可以的方式包括连续的文件、链接的列表、文件分配表、以及i-node。不同哦你高的系统有不同的目录结构。文件属性可以放在目录中或者其他地方（例如i-node中）。磁盘空间可以使用自由列表或者位图来管理。文件系统的可靠性通过制造增量的转储来增强以及通过让程序可以出错的文件系统。文件系统的性能是重要的并可以用若干方式来增强，包括转存、预读、以及仔细的方式文件块使之间临近。日志结构文件系统也通过大的单元进行写入来增强性能。&lt;br /&gt;文件系统的例子包括ISO 9660、CP/M、MS-DOS、Windows 98、以及UNIX。它们在许多方面有区别，包括如何跟踪哪个块属于哪个文件、目录的结构、以及自由磁盘空间的管理方式。&lt;br /&gt;&lt;br /&gt;* 7 多媒体操作系统&lt;br /&gt;多媒体是新起的计算机的使用。由于多媒体文件的大尺寸和它们严格的实时回放需求，为文本设计的操作系统对多媒体不够理想。多媒体文件有多重的平行的轨道组成，通常是一轨视频和至少一轨音频以及有时也有字幕轨。它们必须在播放时同步。&lt;br /&gt;音频的通过定期的采样来录制，通常是44,100次/秒（CD音质）。压制可用于音频信号定义统一的10x的压制速率。视频的压制同时使用帧内压缩（JPEG）和帧间压缩（MEPG），后者用P帧表示与前一帧不同的地方。B帧则居于前一帧或者下一帧。&lt;br /&gt;多媒体需要实时调度已满足期限。两种算法常被采用。第一种是固定速率调度，它使用静态的优先级算法依照周期给进程赋予固定的优先级。第二种是期限最近优先，它是总选择最接近期限的进程的动态算法。EDF较复杂，但是能实现100%的利用率。RMS那样的则不能。&lt;br /&gt;多媒体文件系统通常使用Push模型而不是Pull模型。一旦数据流开始，从磁盘上读取数据就不再要用户请求。这种途径和传统的操作系统有根本的不同，由于对满足实时请求的需要。&lt;br /&gt;文件可以连续的储存或者不是。在后一种情况下，单元是可以可变程度的（一个块是一帧）或者固定长度的（一块有多帧）。这些途径有不同的取舍。&lt;br /&gt;文件在磁盘上的放置影响到性能。当有多个文件的时候，有时organ-pipe算法可以使用。分割文件到多个磁盘上不论横向或纵向，是常见的。块和文件缓存策略也广泛地用来提升性能。&lt;br /&gt;&lt;br /&gt;* 8 多处理器系统&lt;br /&gt;计算机系统可以使用多个CPU来更加快速和可靠。三种多CPU系统的组成方式是多处理器、多计算机、以及分布式系统。其中每一种都有自己的特性和问题。&lt;br /&gt;多处理器由两个或更多享用功能的RAM的CPU组成。CPU可以用总线、交叉开关、或者多级交换网络来互联。多种操作系统的配置是可行的，包括给每个CPU单独的操作系统、有一个主操作系统其他作为从属、或者使用对称的对处理器让一份操作系的拷贝可以让任何CPU运行。在后面一种情况，需要用锁来保持同步。当锁不能获得的时候，CPU可以旋转或者做上下文切换。多种调度是可以的，包括时间分时、空间共享、以及成群调度。&lt;br /&gt;多计算机也有两个或者更多的CPU，但是这些CPU有它们自己的私有内存。它们不分享公用的内存，所以所有的通信使用消息的转递，在一些情况，网络接板有它自己的CPU，在这种情况下主CPU和接板的CPU必须自己组织以避免竞争条件。多计算机中用户层次的通讯通常使用远程过程调用，但是分布共享内存也可以使用。处理器局部的平衡是这里的一个问题，并有用于此的多种算法包括发送者启动的算法，接受方启动的算法、以及投标算法。&lt;br /&gt;分布系统是松散耦合的系统，它的每个节点都是有着完整的外围设备和自己的操作系统的独立的计算机。通常这样的系统分布在较广的地理区域。中间件通常构建在操作系统之上来给应用程序提供一致的交互层。各种的中间件包括基于文档的、基于文件的、基于对象的、以及基于协调的中间件。一些例子如World Wide Web、AFS、CORBA、Globe、Linda、以及Jini。&lt;br /&gt;&lt;br /&gt;* 9 安全&lt;br /&gt;操作系统可以在许多方面都到威胁，从内部的攻击到从外界进入的病毒。许多攻击是黑客尝试闯入特定的系统，通常仅仅是猜测密码。这些攻击通常只是使用常用密码的字典并惊人的成功。密码安全可以通过使用Salt、一次性密码、以及挑战响应方案。智能卡和生物指示也可以使用。视网膜扫面已经实用了。&lt;br /&gt;许多不同的对操作系统的攻击是一致的，包括特洛伊木马、登录欺骗、逻辑炸弹、陷阱门、以及缓冲溢出攻击。通用的攻击包括请求内存并对其窥探，使用非法的系统调用来看看发生什么，甚至尝试欺骗内部来透露他们不应该透露的信息。&lt;br /&gt;病毒是许多用于增长的严重问题。病毒存在多种形式，包括内存常驻病毒、引导区感染、以及宏病毒。使用病毒扫面器在查找病毒特征是有用的，不过真正好的病毒能加密它们的大部分代码并在每次复制的时候修改余下的代码，使得检测非常困难。一些杀毒软件不仅仅通过查找病毒的特征码来工作，而是通过发现特定可疑的行为。通过安全的计算机使用习惯来避免病毒要优于尝试处理攻击后的后果。简单的说，不要载入执行来历不明的和可信度有疑问的程序。&lt;br /&gt;移动代码是如今必须要处理的问题。把它放在沙箱内，解释运行、以及仅运行可信赖的供应商签名的代码是可行的途径。&lt;br /&gt;系统可以用一个领域（如用户）垂直或者对象水平的矩阵来保护。矩阵可以切割为行，采用基于能力的系统，或者为列，采用基于ACL的系统。&lt;br /&gt;安全的系统是可以被设计的，但是必须从开始就定位一个目标。可能最重要的设计规则是有一个最小的可信赖的计算机基础不能被任何资源的访问绕开。多层安全可以基于Bell-La Padula模型，为保密而设计，或者Biba模型，用于维护系统的完整性。橙皮书描述了可信系统需要满足的要求。最终，即使系统可证明是安全的，仍必须注意到隐蔽的渠道，它能够轻易的通过创建模型外的通信渠道来推翻系统。&lt;br /&gt;&lt;br /&gt;* 10 案例1：UNIX和LINUX&lt;br /&gt;UNIX由作为小型机的分时系统开始的，但是现在使用涵盖从笔记本计算机到超级计算机。存在有三个接口：Shell、C库、以及系统调用本身。Shell允许用于键入执行的命令。可以是简单的命令、管道、或者更复杂的结构。输入和输出可以重定向。C库涵盖了系统调用并也有增强的调用，例如printf用于格式化输出往文件。实际的系统调用接口是精简的，大约100个调用，每个调用仅仅做它需要的事情。&lt;br /&gt;UNIX中的关键概念包括进程、内存模型、I/O、以及文件系统。进程可以分出子进程，产生树状的结构。UNIX中的进程管理使用两个关键的数据结构，进程表和用户结构。前者总在内存中，但是后者可以被交换或者分页出去。进程的创建通过复制进程表以及内存镜像来完成。调度使用基于优先级的算法并请相互进程。&lt;br /&gt;内存模型每个进程由三个片段组成，text、data、stack。内存管理曾是用交换来完成，不过现在多数UNIX系统中通过分页来完成。核心地图跟踪每个页面的状态，页面守护进程使用使用时钟算法来保持大约有足有的自由页面。&lt;br /&gt;I/O设备使用特殊的文件来访问，各自有一个主设备号和一个次设备号。块设备I/O使用缓冲缓存来减少访问磁盘的次数。LRU算法可用来管理缓存。字符I/O可以通过直接或者烹制模式。线路规程或流用于给字符I/O添加功能。&lt;br /&gt;文件系统是由文件和目录组成的层次结构。所有的磁盘被载入有单独的根开始的单独的目录树。单独的文件可以链接如一个目录从文件系统的其他地方。要使用文件，必须先打开，产生一个用于读取或者写入的文件描述符。在内部，文件系统使用了三个主要的表：文件描述符表、打开的文件描述符表、以及i-node表。其中i-node表最为重要，包含了关于文件所有的管理信息以及它的块的位置。&lt;br /&gt;保护是基于根据所用者用户组和其他来控制读写执行操作。对于目录，可执行标记解释为搜索的权限。&lt;br /&gt;&lt;br /&gt;* 11 案例2：WINDOWS2000&lt;br /&gt;Windows2000的结构是HAL、内核、执行文件、以及一层薄的用于捕获传入的系统调用的系统服务层。此外，有各种设备驱动，包括文件系统和GDI。HAL从上层中隐藏了一定的差异。内核试图给可执行文件隐藏余下的差异使得执行文件是机器独立的。&lt;br /&gt;执行程序是基于内存对象。用户进程创建它们并取回句柄在随后操纵它们。执行组件也能创建对象。对象管理器维护了什么对象可以插入用于以后查找的命名空间。&lt;br /&gt;Windows支持进程、作业、线程和Fiber（用户空间）。进程有虚拟地址空间和资源的容器。线程是执行的单位并由操作系统调度。作业是一组进程用于分配资源的额度。调度通过通过优先级算法让最高优先级的线程随后执行。&lt;br /&gt;Windows2000支持按需分页的虚拟内存。分页算法是基于工作集的概念。系统维护若干自由页面的列表，这样每当页面错误发生，一般有自由页面可用。自由页面列表使用复杂的规则来调整，试图扔掉长时间里没有使用的页面。&lt;br /&gt;I/O通过遵循Windows设备模型的设备驱动完成。每个驱动由初始设备对象开始，其中包含了系统用于添加设备和执行I/O的调用的过程的地址。驱动可以层叠作为过滤器。&lt;br /&gt;NTFS文件系统是基于主文件表，它为每个文件或目录有一项记录。每个文件有多项属性，它可以在MFT记录中不常驻位于磁盘上。NTFS支持压缩和加密，以及其他的功能。&lt;br /&gt;安全是基于访问控制列表。每个进程有访问控制标记来表明它是谁以及如果有的话，它有什么特别的特权。每个对象有一个和它相关的安全描述符。安全描述符指向一个自由访问控制解表，其中有允许或拒绝个人或组访问的访问控制项。&lt;br /&gt;最后，Windows2000为文件系统维护单独系统范围的缓存。这是一个虚拟缓存而不是物理的。磁盘块的请求首先往缓存。如果它们不能满足，则适当的文件系统被调用以获取所需的块。&lt;br /&gt;&lt;br /&gt;* 12 操作系统设计&lt;br /&gt;设计一个操作系统有决定它要做什么开始。接口应该是简单、完整、并且高效的。它应该有清晰的用户接口范式、执行范式和数据范式。&lt;br /&gt;系统应该合理地结构，使用一种已知的技术，例如分层或客户服务模式。内部的组件应该相互正交并清晰的从机制中划分出政策。一些问题应该有多思考，例如静态动态的数据结构、命名、绑定时间、以及实现模型的顺序。&lt;br /&gt;性能是重要的，但是优化需要仔细选择而不会破坏系统的结构。空间时间的权衡、缓存、暗示、地区利用、以及优化常见情况是常常值得做的。&lt;br /&gt;由几个人编写的系统不同于300人生产出的大系统。在后一种情况下，团队的结构和项目的管理在项目的成功与失败中扮演了关键的角色。&lt;br /&gt;最终，操作系统不得不继续改变以遵循新的趋势迎接新的挑战。其中包括64位地址空间、大量的连接、桌面多处理器、多媒体、手持的无线计算机、以及种类繁多的嵌入系统。接下来的年份将会是操作系统设计的激动人心的时刻。&lt;br /&gt;&lt;br /&gt;* 13 阅读清单和参考书目&lt;br /&gt;空&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* &lt;br /&gt;下面是闲话时间，当前自己对操作系统的了解仅停留在浅浅的层面。关于操作系统方面还缺乏经验和心得，于是这里来说说Java和Scheme语言中多线程的原理和实现吧。这里的侧重是关于用户模式内线程，利用协程以及时间中断来实现多任务的切换。此外要注意到一些系统调用会阻塞整个进程，这也是需要处理的问题。当然，这部分闲话的内容是可以正好来运用一下操作系统方面的知识。&lt;br /&gt;坑</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/1377376285992854155/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/1377376285992854155' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/1377376285992854155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/1377376285992854155'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/06/blog-post.html' title='《现代操作系统》一书中的每章节的小结部分，放在这里的算是此书中比较浅显的概括'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-7578504195789476588</id><published>2011-06-10T20:21:00.008+08:00</published><updated>2011-06-10T21:03:15.211+08:00</updated><title type='text'>Academy of Interactive Arts &amp; Sciences【介绍文/翻译/施工】</title><content type='html'>&lt;a href=&quot;http://en.wikipedia.org/wiki/Academy_of_Interactive_Arts_%26_Sciences&quot;&gt;Academy of Interactive Arts &amp; Sciences From Wikipedia&lt;/a&gt;&lt;br /&gt;嘛...暂时还没开工...&lt;br /&gt;不过其实也没什么好翻译的，只是想找个条目来写写个人的想法。&lt;br /&gt;里面好多东西不熟悉，也没办法有什么感想。&lt;br /&gt;说自己熟悉的话，还是对NES和GBA要过一些。&lt;br /&gt;另外那里还没有涉及到1996年之前的东西。&lt;br /&gt;这样的话，就先坑在这里了。&lt;br /&gt;要是说自己口味的话，喜欢参与感和空间感强的。&lt;br /&gt;有时候对手柄和格子和树状结构有意外的好感。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/7578504195789476588/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/7578504195789476588' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/7578504195789476588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/7578504195789476588'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/06/academy-of-interactive-arts-sciences.html' title='Academy of Interactive Arts &amp; Sciences【介绍文/翻译/施工】'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-3567312060731999389</id><published>2011-06-02T23:03:00.043+08:00</published><updated>2011-10-08T17:48:12.037+08:00</updated><title type='text'>又一个坑了的视觉小说，\n顺便说说Java与Scheme的混合/嵌入使用</title><content type='html'>拿Slick2d和Kawa包了一组给Scheme用的API出来，做了一个简单而拙劣的VisualNovel演示。话说第三方库有源代码和JavaDoc外加严格的类型系统和Eclipse的辅助，使用起来还是挺方便的。&lt;br /&gt;下面的东西是个试验用的半成品，不过后来发觉又依赖JRE又依赖平台二进制包感觉挺恐怖的。想分发或者跨平台的话暂且都有问题，也就没动力继续去完善了这个自命名Slickawa的包了。&lt;br /&gt;于是代码什么的在很久很久以前就不继续了，现在拿出来发觉可以用来写篇日志，相当于随手写写遇到的想法吧。&lt;br /&gt;&lt;br /&gt;话说Slick的提供的库的API让自己挺欣赏的，至少是打消了再去包装它一层的看法（比如SDL就一定要先包一个主循环出来类出来供派生才觉得舒服）。不过要注意的是Slick是在OpenGL上的一层包装，如果觉得它提供了某个抽象合适的话，就拿来用，或者直接看它的代码。如果不合适的话，大可不必考虑某些类的存在，按照自己的需要直接从更底层的方法往上层建立。达到目的即可，而且目的肯定不是重复一个和Slick一样的抽象层（比如移植其他平台用）吧。&lt;br /&gt;不过SDL1.2和OpenGL用起来还是有个很明显的区别（就像PyGame和PyGlet），它们负责图像混合的设备不同。前者主要靠CPU，后者主要靠GPU，如果不这样顺着它们的原理用的话，性能会大有问题（所以C或者Shader的使用最好是无限制）。如果要在多媒体程序里做一些视觉效果的话，真的还是很容易出现性能瓶颈的。&lt;br /&gt;&lt;br /&gt;给Scheme的API分为四组，sk中是基本的过程，skex中是可以用Scm本身来实现的，sklab是试验用方法，sklib是依赖底层的方法。这分别对应四个Java的Class，要暴露的方法实现为静态的，这样在Kawa中就可以直接使用了。&lt;br /&gt;算是语言间类型的自动绑定吧，其实呢Kawa是把Scheme代码编译为Java的字节码，这样在性能上和互操作上都很方便。不过想在Kawa完全使用Java库还是有些不便，所以还是提供为简单的一个个过程较方便。对象仍旧是对象，方法变为以对象为参数的过程。&lt;br /&gt;现在让Scheme代码和Java代码结合的地方可以有两种，一种是用Kawa提供的机制直接在Scm中使用Java的包和对象，一种是在Java中用Kawa中提供的类型映射类创建实例交给自己管理的Scheme运行环境。不过这两种方式都不要指望Kawa能够是Scheme和Java部分能够完全的分离，必然会有一个中间层在Scheme中操作了Java的数组，或者是在Java中操作了Scm的列表。&lt;br /&gt;如果需要添加什么功能的话，要么单独的写为一个包，要么就在那个中间层里放心大胆的写。不必在意是写为纯Java的还是纯Scheme的为好，被中间层所选用的语言所限，不然在使用所依赖的库的时候会遇到麻烦。如果担心会导致所暴露的API会紊乱的话，就放到不同的命名空间里去。也不必在意是否暴露的足够的API，只要要中间层有足够的活性（有废止的方法标记一下就可以了，反正只涉及静态方法和单方法的界面，单一元素的修改仅会带来很有限的影响。），混合语言所带来的将不是负担而是效率了。中间层即使Java和Scheme语言同时用也可，目的都是让纯Scm部分的代码可以用某个函数，所以还是倾向于在Java中写这个中间层同时Scheme也用。至于Java6的那个对脚本语言的框架，造成通常得首先包装为对象传给那个框架，然后在用脚本语言提供适合自身类型的包装。用来两次包装之后，想实现一些功能的话，放在哪个部件里都觉得不是很方便。&lt;br /&gt;相比另一个Scheme的Java实现SISC，本来自己是觉得它更小巧一些，所以一开始的更偏爱一些。后来觉得Kawa做得更成熟一些，于是就从比较省事的角度选择的Kawa。之前在用tinyscheme做过一次绑定，得自己添加垃圾收集用的类型，再添加Unicode编码的支持，再针对类型的转换把提供的API函数一个个写一遍。而且用到的函数得去tinyscheme的头文件里找，然后再去长长的单个源代码里看看是怎么回事后才用，再传递指针的时候很容易就把类型信息丢掉。结果就是TinyScheme的代码也混杂在宿主程序里面一起修改了。Java的好处是可以把单独要改的类拿出来改一下然后用（只要不涉及包的可见性以及开源的许可协议的限定的话），原本引入的jar文件可以丝毫不变的放在那里。不过话说似乎好多Scm实现都是为单独使用设计的，想手工包装到C/C++里面都有点手疼，而更倾向于用FFI在Scm代码中用C库（于是对第三方库就可能是先用C包一层，然后再Scm针对类型转换包一层了。这样总比在C中连类似什么也考虑要手疼的好一些，虽然这里来说说感想也看不出多少可再用的价值）。&lt;br /&gt;有个chibi-scheme时间不如TinyScheme，但是设计得更加完善一些。&lt;br /&gt;&lt;br /&gt;Java和Scheme都有Steele的参与，这或许是让两者看起来很协调的一方面吧（只是或许而已）。两者都有各自的变量命名习惯，都喜欢使用长的n的单词组合。虽然一个用大小写来分割单词，一个用横线来分割单词，但是这两者对应起来还是相当直观。都是很少用语法糖，都是写起来手疼，都是值是有类型的对象的语言。所以两者混合用起来还是蛮协调一致的感觉。&lt;br /&gt;Scheme的运行环境有两个地方，一个是让Scm代码自己成为一个Java类，一个是人工的管理一个Runtime对象。如果仅仅是把Scheme作为数据来看待的话，似乎后者会比较方便。Scm的一个优势是自身可以当作一种数据格式来使用，Kawa中提供了解析供的方法。而让Scm代码去实现某个interface然后传回Java也是可以的。此外还可以main中直接eval，提供一些API后控制权给脚本，让Scheme当胶水使用。&lt;br /&gt;如果仅仅是想REPL地试验一下某个Java代码片段，有个BeanShell还是蛮方便用的。&lt;br /&gt;&lt;br /&gt;关于下面的实现，还有些额外的说明。这里就列举一下，语句会不大通顺。首先呢，当类型不重要的时候，用Scm中的List来传递值了，这样比从对象里查询要方便一些（如果List是Lazy的话就更方便了，语言的执行就是 Graph Reduction）。其次来说，这里Java的主循环三种事件要调用Scheme提供的函数。Java部分只要只管要时去调用，而场景的切换放在Scm里面做了。至于场景切换要怎么修改提供给Java的过程，以及场景切换中还是否要做一些额外的事情，Java部分是不用管的。所以这里为了方便的在Scm中实现多个场景，做了一个简单的OO。注意逻辑和渲染和必须分割开来的，中间可以用全局（相对两者而言）来传递信息。还有呢，涉及RGBA混合的过程无论写在Scheme中还是写在Java中都是会性能不够的，正确做法是写在OpenGL里面，可惜自己还不会。动画效果这里参考了Qt的状态和变换框架，这里仅仅提供了一个用来进行y=kx线性变化的类。其实利用y=f(kx1)+g(kx2)的组合还是能做出很多效果的，比如以线性变化为时间轴映射到多个变量上，或者串联多个线性变换，这些都是可以发挥想象里的地方。然后作用坐标、透明度、颜色以及其他可以数值表示的地方，看起来还是挺生动的（这方面Flash是榜样，不过Flash性能限制）。&lt;br /&gt;&lt;br /&gt;写的时候参照了KRKR2/KAG3和ONScripter和RenPy的部分代码，以及rpgchina.net和gamediy.net上的教程，以及Slick和PyGame和ClanLib的API：&lt;br /&gt;&lt;blockquote&gt;;;;开始&lt;br /&gt;(sk:make &quot;VisualNovelDemo&quot;)&lt;br /&gt;(sk:path &quot;.;visualnovel&quot;)&lt;br /&gt;(sk:display-mode 800 600 #f)&lt;br /&gt;(sk:fps 60)&lt;br /&gt;(sk:debug #t)&lt;br /&gt;;;;OO&lt;br /&gt;(define (send obj msg . arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(cond ((obj msg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&gt;(lambda (x) (apply x arg)))))&lt;br /&gt;(define (dispatch prototype method-alist)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(lambda (mth)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((assoc mth method-alist) =&gt; (lambda (x) (cadr x)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((procedure? prototype) (prototype mth) )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else #f))))&lt;br /&gt;;;;全局变量&lt;br /&gt;(define *env* (interaction-environment))&lt;br /&gt;(define *background* #f)&lt;br /&gt;;(define *script* (sk:load-data &quot;script.scm&quot;))&lt;br /&gt;(define *script* (skex:load-line-data &quot;script.scm&quot;))&lt;br /&gt;(define *scripts-now* #f)&lt;br /&gt;;;;全局过程&lt;br /&gt;;(define *music* #f)&lt;br /&gt;(define (state-clear)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(set! *scene* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dispatch &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame (lambda (delta) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button (lambda (b) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render (lambda (g) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;(define (dialog-jump! label)&lt;br /&gt;&amp;nbsp;&amp;nbsp;;(sk:display &quot;try&quot;)(sk:display label)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(let ((s (member (list &#39;label label) *script*)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:display s)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(state-clear)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scripts-now* s)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(sk:display (state))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)))&lt;br /&gt;;;;场景&lt;br /&gt;(define *scene* &lt;br /&gt;&amp;nbsp;&amp;nbsp;(dispatch &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame (lambda (delta) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button (lambda (b) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render (lambda (g) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)))&lt;br /&gt;;;;对话场景&lt;br /&gt;(define (scene-dialog text) &lt;br /&gt;&amp;nbsp;&amp;nbsp;(define dialog-font (sk:load-font &quot;Simhei&quot; 32))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *dialog-char-count* (skex:make-linear 0 (sk:string-length text) 1))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (dialog-end?)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:linear-end? *dialog-char-count*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (dialog-end!)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:linear-end! *dialog-char-count*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (on-frame delta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:linear-next! *dialog-char-count* (* 0.03 delta)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (on-render g)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:draw-color 30 428 (sk:color 0 0 0 128) (- 800 60) 128 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:draw-text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;34 432&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:substring text 0 (skex:linear-now *dialog-char-count*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(- 800 64) dialog-font (sk:color 0 0 0 128))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:draw-text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;32 430 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:substring text 0 (skex:linear-now *dialog-char-count*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(- 800 64) dialog-font (sk:color 255 255 255 255))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (dialog-end?)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:draw-color 740 530 (sk:color 128 255 128 255) 8 8)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (on-button b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (or (equal? b &#39;(pressed A)) (and (pair? b)(eq? (car b) &#39;touch)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if (dialog-end?)       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dialog-end!))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(dispatch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame  on-frame  )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button on-button )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render on-render )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;;;;scene-effect 背景切换效果&lt;br /&gt;;;;背景切换场景&lt;br /&gt;;;;(bg &quot;1.png&quot; 0)&lt;br /&gt;(define (scene-bg-change arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *bg-future* (sk:load-image (cadr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *bg-changing* (skex:make-linear 0 1 (/ 1 (caddr arg))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define on-frame&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (delta)   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:linear-next! *bg-changing* delta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (skex:linear-end? *bg-changing*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *background* *bg-future*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *bg-changing* #f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define on-button &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (b) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (on-render g)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:draw-image 0 0 *bg-future* (* 255 (skex:linear-now *bg-changing*))))    &lt;br /&gt;&amp;nbsp;&amp;nbsp;(dispatch &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame  on-frame  )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button on-button )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render on-render ))))&lt;br /&gt;;;;scene-effect 背景遮片效果&lt;br /&gt;;;;effect-mask&lt;br /&gt;;;;(effect mask &quot;1.png&quot; &quot;rule.png&quot; 100)&lt;br /&gt;;;;name = &#39;mask&lt;br /&gt;;;;arg  = &#39;(mask &quot;1.png&quot; &quot;rule.png&quot; 100)&lt;br /&gt;(define (scene-bg-effect arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;;;to extend this lambda class&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (make-effect bg-future effect-render-with-p% time-last)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dispatch &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame (lambda (delta) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button (lambda (b) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render (lambda (g) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(case (cadr arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((mask) (scene-bg-mask-change (cdr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((bg) (scene-bg-change (cdr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error &quot;effect&quot;))))&lt;br /&gt;;;;&#39;(mask &quot;1.png&quot; &quot;rule.png&quot; 100)&lt;br /&gt;(define (scene-bg-mask-change arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *bg-future* (sk:load-image (cadr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *bg-mask* (sk:load-image (caddr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *time-line* (skex:make-linear 0 1 (/ 1 (cadddr arg))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define on-frame&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (delta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(skex:linear-next! *time-line* delta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (skex:linear-end? *time-line*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *background* *bg-future*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *time-line* #f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define on-button &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (b) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (on-render g)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sklib:draw-image-with-mask 0 0 *bg-future* *bg-mask* (* 255 (skex:linear-now *time-line*))))   &lt;br /&gt;&amp;nbsp;&amp;nbsp;(dispatch &#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;frame  on-frame  )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;button on-button )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &#39;render on-render ))))&lt;br /&gt;;;;用户界面场景&lt;br /&gt;(define (scene-ui arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;;(ui ((text 116 500 &quot;开始&quot;  fnt clr) start) ((text 516 500 &quot;退出&quot;  fnt clr) end))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *ui* &#39;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (ui-draw x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(case (caar i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((text) sk:draw-string)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((image) sk:draw-image)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error i)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (j) (eval j *env*)) (cdar i))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define (ui-area x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((arg (map (lambda (j) (eval j *env*)) (cdar i))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((x (car arg)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(y (cadr arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(s (case (caar i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((text) (sk:text-size (caddr arg) (cadddr arg)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((image) sk:draw-image)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error i)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list x y (car s) (cadr s))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cadr i))) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(define *button-area* #f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(set!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scene* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dispatch&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;frame &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (delta) &#39;()))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;button &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (b)    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(sk:display (ui-area *ui*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (and (pair? b)(eq? (car b) &#39;touch))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(touched (1 2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((x (caadr b))(y (cadadr b)))  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (skex:contained? x y (car i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(sk:display (cadr i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (symbol? (cadr i)) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dialog-jump! (cadr i)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ui-area *ui*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (and (pair? b)(eq? (car b) &#39;cursor))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(touched (1 2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(let ((x (caadr b))(y (cadadr b)))  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *button-area* #f)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(map (lambda (i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when (skex:contained? x y (car i))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *button-area* (or *button-area* (car i))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when  *button-area*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*button-area* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (a b c d) (list a b (+ 2 c) (+ 2 d)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*button-area*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ui-area *ui*))))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(list &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&#39;render&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lambda (g) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when *button-area* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(apply sk:fill (append *button-area* (list (sk:color 0 0 0 128)))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(ui-draw *ui*)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(sk:display (cdr arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;(set! *ui* (cdr arg))&lt;br /&gt;&amp;nbsp;&amp;nbsp;*scene*)&lt;br /&gt;;;;解析并执行脚本&lt;br /&gt;(define (script-next!)&lt;br /&gt;&amp;nbsp;&amp;nbsp;(if (not (null? (cdr *scripts-now*)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scripts-now* (cdr *scripts-now*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(state-clear)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(cond ((string? (car *scripts-now*))  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;显示对话&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;&quot;Hello World&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scene* (scene-dialog (car *scripts-now*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((pair? (car *scripts-now*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(case (caar *scripts-now*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((bg)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;切换背景&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(bg &quot;05_1_2.jpg&quot; 100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scene* (scene-bg-change (car *scripts-now*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((effect)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;切换效果&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(effect mask &quot;sdf.jpg&quot; &quot;rule/12.png&quot; 2000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(effect bg &quot;rule/12.png&quot; 2000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(effect bg:mask &quot;rule/12.png&quot; 2000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scene* (scene-bg-effect (car *scripts-now*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((ui)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;显示界面&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(ui ((text 116 500 &quot;开始&quot;  fnt clr) start) ((text 516 500 &quot;退出&quot;  fnt clr) end))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scene*(scene-ui (car *scripts-now*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((music)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;播放音乐&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(music &quot;11.ogg&quot; 100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(sk:play-music (sk:load-music (cadr (car *scripts-now*))) #t)&lt;br /&gt;      (sk:play-music (cadr (car *scripts-now*)) #t)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((eval)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;(eval (set! fnt (sk:load-font &quot;Simhei&quot; 48)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(eval (cadr (car *scripts-now*)) *env*)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((label)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((jump)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(dialog-jump! (cadr (car *scripts-now*))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error &quot;未知指令&quot;))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((null? (car *scripts-now*)) (script-next!))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(else (error &quot;未知指令&quot;))))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:exit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;))&lt;br /&gt;&lt;br /&gt;(sk:on-init&lt;br /&gt;&amp;nbsp;(lambda (e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;;载入剧本&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(set! *scripts-now* (cons &#39;() *script*))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;;(set! bgm (sk:load-music &quot;music/bgm03.ogg&quot;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(script-next!)))&lt;br /&gt;(sk:on-frame&lt;br /&gt;&amp;nbsp;(lambda (delta)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(send *scene* &#39;frame delta)))&lt;br /&gt;(sk:on-button&lt;br /&gt;&amp;nbsp;(lambda (b)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(send *scene* &#39;button b)))&lt;br /&gt;(sk:on-render&lt;br /&gt;&amp;nbsp;(lambda (g)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(when *background*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(sk:draw-image 0 0 *background* 255))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(send *scene* &#39;render g)))&lt;br /&gt;(sk:start)&lt;/blockquote&gt;&lt;br /&gt;所用的脚本格式中@开始的行是命令，读取是首尾加括号，不然则加引号。读取后是一个sexp的列表，这样可以在Scheme中直接操作。&lt;br /&gt;话说IEEE标准里没有收eval语句，因为有点细节上的欠缺。虽然R5RS里有，个人还是觉得这里也不必要去用完整的eval过程，不过自己改写出来一个eval还是个重复劳动。&lt;br /&gt;脚本就是纯文本，话说一开始的写法是每个字符串要加引号。虽然有正则这种东西，但是想重新分段什么的还是不方便。与其每次保存是要处理，不如直接扩充Reader部分。&lt;br /&gt;上面的代码在重构的时候消灭了很多全局变量，顺便也抽象出来一些较直观的概念。这些修改不影响跑测试代码，但是这体现Scm代码的进化方式。&lt;br /&gt;以上的OO是基于原型的消息传递，还缺少一个set-this消息，继承时会用到。不过添加这样一个消息的话，对已有代码影响很小，而且暂时没用到，所以还没有添加。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Java部分的代码或许以后传吧，没多少内容&lt;/blockquote&gt;不过还是暂且来简单的写一些说明吧——&lt;br /&gt;首先呢，是最常用到的若干包和类（以及类的方法）：&lt;br /&gt;kawa.standard.Scheme 对应 Scheme的一个运行环境；&lt;br /&gt;gnu.lists.LList 对应 Scheme中的类型，列表；&lt;br /&gt;gnu.mapping.Symbol 对应 Scheme中的类型，符号；&lt;br /&gt;至于整型就是Integer，字符串就是String&lt;br /&gt;想把sexp字符转为Scheme的嵌套Pair的h话：&lt;br /&gt;LispReader reader = new LispReader(new InPort(new StringReader(sexp)));&lt;br /&gt;return ReaderParens.readList(reader, 0, 1, -1);&lt;br /&gt;至于Number的话可能是gnu.math.Numeric也可能是java.lang.Number，&lt;br /&gt;如要用instanceof判断之后再获取值，比如调用.floatValue();。&lt;br /&gt;此外，现在绘制是一堆draw-*的过程，另一种实现方式是：&lt;br /&gt;提供 &amp;lt;? extends Drawable &amp; Posable ...&amp;gt;然后统一的用draw来调用。&lt;br /&gt;这样就转变为考虑怎样在场景里放置物品，而让绘制操作可以自动进行。&lt;br /&gt;这部分暂时还没用到，只是在Java中申明了Interface，还是放到Scm中需要的时候写这部分好了。&lt;br /&gt;话说一般用对象的使用，以及界面的实现好了，类的派生什么的还是少用为好。&lt;br /&gt;比如这里Java给Scheme的API就不包括类的派生，不过Silck2D的习惯本身也没有精灵类。&lt;br /&gt;有时候嘛，精灵类还是需要的，用来管理场景里哪些东西要绘制，若仅仅是OO的话，还是放在Scm中为好。&lt;br /&gt;在Scheme中可以用lambda来做参数传递时转化为实现了所需要的只有一个方法的界面，&lt;br /&gt;此外Kawa提供的一些机制还是可以用虽然目前不够完善所以用着不舒服。&lt;br /&gt;kawa中导入Java的类是使用(define-namespace sk &lt;java.lang.Number&gt;)，&lt;br /&gt;然后可以直接使用静态成员方法，创建和使用对象也有提供了方法的。&lt;br /&gt;想开一个交互的调试窗口的话，可以执行如下的代码（可以绑定到按键上）：&lt;br /&gt;ReplDocument doc = new ReplDocument(scm, scm.getEnvironment(), true);&lt;br /&gt;GuiConsole con = new GuiConsole(doc);&lt;br /&gt;con.setVisible(true);&lt;br /&gt;其中scm是Kawa提供的Scheme类的实例，也就是我们的scm代码编译后运行的环境。&lt;br /&gt;像Gambit-C一类编译类的Scm实现，直接和C混合着用虽然看起来不够美观。&lt;br /&gt;但总比让FFI的部分复杂要好，毕竟C在内存管理和类型转换上比Java的鸿沟大。&lt;br /&gt;另一个编译器Chicken是可以即当编译器也可嵌入当解释器用，不过Chicken的内存管理方式比较异类。&lt;br /&gt;值得庆幸的是，两者都可以定义变量在GC时执行的过程，这样可以省写一些Free（不要和Close混淆哦，open/close是成对等价于with使用的）。&lt;br /&gt;是嵌入使用，还是有FFI调用外部类，不同的实现有不同的方式的。此外，用C库的话，还有字符串编码问题要自行解决一下。&lt;br /&gt;关于语言标准，IEEE出于简化考虑比R5RS少了eval和卫生宏，不过R5RS还没有module和record-type这两个很有用的组织代码的手段。&lt;br /&gt;再如果仅仅是拿sexp当数据格式来使用的话，那就和使用什么实现没有关系了，手工解决即可。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;剧本部分是拿以前的日志重写的，现在有点反胃了。&lt;br /&gt;所有@开始的行已删除，现在算是一个纯文本了。&lt;br /&gt;说实话，废话比以前多了，而且人物感觉更加薄弱。&lt;blockquote&gt;在遥远的被阻隔的异世界&lt;br /&gt;记忆之海&lt;br /&gt;埋藏着记忆力淡去的痕迹&lt;br /&gt;虽然显得遥远而迷茫&lt;br /&gt;可是……&lt;br /&gt;&lt;br /&gt;《遥远的记忆之海》&lt;br /&gt;&lt;br /&gt;【Chapter 0】&lt;br /&gt;这里是死后的世界，而年轻的我是记忆之海上的渡船人。&lt;br /&gt;每天都会有亡灵抵达这里，来在这片汹涌的波涛下探寻往日的回忆。&lt;br /&gt;虽然只是一些被遗忘的影像，这恐怕是对被阻隔在异世界的亡灵们有效的抚慰。&lt;br /&gt;我将用这片小舟载着他们，驶向掩埋于他们意识的幻境之中，去探寻这份被遗忘的记忆。&lt;br /&gt;不知道自己是如何开始这项职业的，也不知道是否在遥远的未来会有某个终结点。&lt;br /&gt;大概我便会这么一直以这样平淡而幸福的方式生活下去吧——每天都可以期待不同的故事。&lt;br /&gt;而自己就做好一个船夫好了，这点好奇心尚不会为自己的记忆增加多余的烦恼。&lt;br /&gt;&lt;br /&gt;【Chapter 1】&lt;br /&gt;【我】 坐稳呦～要出发了～&lt;br /&gt;我在船尾向着船头走上来的一位老奶奶说道。&lt;br /&gt;然后熟练而悠闲地划动起身旁的桨，让船缓缓却高速地飞向某个预定的水域。&lt;br /&gt;海水在炫目却冰凉的天空下闪着光芒，一眼望去只能看见浅浅的海面。&lt;br /&gt;目标抵达后，我让船平稳地停下而随意地顺着波浪起伏，然后向着船上老人站立的那一头说到——&lt;br /&gt;【我】 你的记忆便保存在这里，在这片浑浊的水面之下。不过还有若干事项要知道——&lt;br /&gt;【我】 在波浪起来的时候，要努力地往海底望，凭自己的坚定的意志去努力地望。&lt;br /&gt;【我】 让自己的身躯仿佛为回忆包围、洗涤、沉浸，直到某一刻海水骤然变得清晰。&lt;br /&gt;【我】 这样你便能看见深深的海底，看见那片保存着你的记忆的地方。&lt;br /&gt;【我】 那是只属于你的地方，只有凭自己的力量才能看见，而别人的帮助对此无能为力。&lt;br /&gt;而老人听见了我的话，点了点头，然后将视线远远的望着海平面的尽头。&lt;br /&gt;她用手触摸着船的边沿，却一直没有敢低下头去将视线触及身旁水面的光芒。&lt;br /&gt;虽然犹豫了一会，老人随后还是放弃了努力，也没有去尝试，转身向内在船头坐下。&lt;br /&gt;【我】 就真的这样放弃了吗，这可是一个难得的机会，不需要那个世界的记忆了吗。&lt;br /&gt;每个人只有一次机会来这里探寻活着时候的记忆，老人的行为多少让我不解。&lt;br /&gt;【老人】 确实呢……&lt;br /&gt;老人轻轻地应了声，然后坦然地点了点头，颤动着的嘴唇似乎有话要说。&lt;br /&gt;我也暂且安下心来，在这水天包裹的空间里躺在船的一角，听着老人传来的言语：&lt;br /&gt;【老人】 随着人生漫长的时光，我已经是一个年迈的人了。记忆力在一天天流逝，身体也一天天薄弱。&lt;br /&gt;【老人】 变得不再有力气去触摸身边的世界中的幸福，而对周围事物的意识也越渐模糊。&lt;br /&gt;【老人】 活着，自己却越来越难以感受到自己是存在着的。于是生命的最终一刻，便在完全不知觉中抵达了。&lt;br /&gt;【老人】 过完了一生，纵然有坎坷或遗憾，可终究还是幸福的一生，可以让我安心于死后了。&lt;br /&gt;【老人】 可是衰老的记忆力依旧是留下的残缺，对于自己最后的时光，竟然不能在心里珍藏着这份幸福。&lt;br /&gt;【老人】 所以我便来到了这片记忆之海，想弥补这份残缺，想为自己寻找一份安慰。&lt;br /&gt;【老人】 至少不论生后或生后，我想让自己明白，自己确实是幸福的生活着的。&lt;br /&gt;【老人】 不过啊，果然我还是有这份幸福感便足够了呢。&lt;br /&gt;【老人】 这种感受纵然已经被遗忘，也肯定在那个世界里曾经存在过吧。&lt;br /&gt;我打量着对面的老者，觉得她是在害怕由记忆去触及内心的真实，不禁叹气感到遗憾。&lt;br /&gt;老人在船头沉默地坐着，渐渐平静了略带激动的言语，我随后起身撑起船驶上回程之路。&lt;br /&gt;伴着海平面上柔和而巨大的夕阳，船的划痕消失在身后的那片先前抵达过的水域，&lt;br /&gt;这也同时告别了那里那些对于老人将永远被掩埋于海底的对往日的记忆与情感。&lt;br /&gt;这过去的，便是一个普通的工作日，随着一天天的过去，我不久也就会把这天淡忘的。&lt;br /&gt;因为这毕竟只是我不断往复着的类似的日子中的一天，一个没有源头也没有终点的记忆所背负的时光。&lt;br /&gt;接下来一天的客户是一位中年男子，身体健壮没有疾病的样子，看上去是个生活中积极的人。&lt;br /&gt;他是意外而死去的吧，真是遗憾呢，我简单地这样判断着。然后撑起船，又一起踏上一个新的旅途。&lt;br /&gt;&lt;br /&gt;【Chapter 2】&lt;br /&gt;船平稳地向预定的某地行去，今天的海面的波浪依旧缓和，我在船头悠闲地把着方向。&lt;br /&gt;而他在船的另一头显出好奇，往四周那片行船偶然路过的水天之痕，不断地张望。&lt;br /&gt;【我】 这途中附近不知是埋藏着谁的记忆，在无尽的记忆之海上，恐怕连我也可能不再会抵达这里。&lt;br /&gt;我静静地坐在船的末端，以船夫的身份这样解释道，然后视线依旧向着遥远的目光不能触及的何处。&lt;br /&gt;【中年】 好了，我是有点兴奋，毕竟是第一次来到记忆之海。如果这样做对航船有影响的话，我会注意的。&lt;br /&gt;我能够感受到他一旁的视线，那似乎是一种寻求着言语上的联系的期待，这恐怕是出于他待人的热情吧。&lt;br /&gt;【我】 我想知道，你为什么要用这唯一的机会，到这里探寻自己的记忆呢？你还没有到一个健忘的年纪。&lt;br /&gt;【中年】 我来寻找记忆，并不是因为它们被我遗忘，而是因为它们所承载的时光已经离我而远去。&lt;br /&gt;【中年】 我是想寻找一丝安慰——即使将来记忆变得淡去，记忆也曾经凭借着自我的存在而存在过。&lt;br /&gt;【中年】 这也是那个生者的世界所留给我的痕迹，告诉自己往日的努力的意义所在，没有遗憾也是一种遗憾吧。&lt;br /&gt;【中年】 那些记忆纵然不能在物质上于现在现在的我建立起沟通，但是分明就是我在这里可以依旧延续下的一种财富。&lt;br /&gt;【中年】 虽然记忆显得飘渺但却是中真实，这也就是我来到记忆之海缘由，想在这里挖掘到的一份心灵中的宝藏。&lt;br /&gt;船速已经变缓，这是即将到达预定的海域了，我向他做着关于探寻记忆的说明，引着他往船外沿的地方走去。&lt;br /&gt;然后留下他一人等待海风的气息掀起记忆之海翻滚的浪花，祝福他的思绪将能够触及到脚下海水的彼端世界。&lt;br /&gt;风与浪下船头的挺拔地站立着，在海天间映出一个厚实的身影，轮廓仿佛是一扇凭空为世界展开的门。&lt;br /&gt;他的声音在海风之间，在倾诉着言语，在一层层的展开着他的过去——&lt;br /&gt;【中年】 这是我的出生，这是我的父母，这是我的学校，&lt;br /&gt;【中年】 我的成年，我的工作，我的老婆，我的女儿，我的事业，我的生活……&lt;br /&gt;男人在回忆着他活着的经历，眼前海水的蔚蓝色里翻滚着幸福的味道，一丝腥味，又一丝甘甜。&lt;br /&gt;在随后回程的航线上，他一直在向我分享着他在这里获得的满足——&lt;br /&gt;【中年】 美好的期待一直在延续着，直到有一天，那天的一场意外的事故，让我只能告别那一切。&lt;br /&gt;【中年】 回忆是以痛苦终结的，我想把这最后的时刻忘掉，可是又害怕失去了想守护的东西。&lt;br /&gt;【中年】 我便这样犹豫着在这个死后的世界，后来想法开始有些坦然——&lt;br /&gt;【中年】 记忆的存在并不是因为它们被记住，而是它们被经历过。&lt;br /&gt;【中年】 记忆的痕迹即使随着时光淡去而似乎不曾有过，它们也不会消失依然存在。&lt;br /&gt;【中年】 不经意间看到自己身体上留下的微小残缺，知道这便是一种以不可弥补的痕迹来保存着记忆。&lt;br /&gt;【中年】 我想我脑海中的记忆也是一样的，是因为我曾今为着他们的存在而做出过什么。&lt;br /&gt;【中年】 这便足够了，它们就是我在记忆之海下埋藏的一份财富，将永远为海天守候。&lt;br /&gt;【中年】 所以，记忆里的东西无法改变，也不需要改变了，在现在这个世界里依然可以有新的记忆。&lt;br /&gt;他只是说着他想说出来的事情，似乎不在意我是怎样漫不经心地听着，这样能否记住他说出的话。&lt;br /&gt;在傍晚的时候，打量着我们周围海面似乎永恒不变的夕阳景色，我想——&lt;br /&gt;他说出了现在的感受，这样便是让这种感受以与人共同的记忆的形式确认着存在，让自己能够保留下去。&lt;br /&gt;不过即使这样，着对于我，仍只是不知过去与未来的时光里的一天，一个在永恒的时间轴上的一个渺小痕迹。&lt;br /&gt;而接下来一天的客人是位年轻的学生，年龄似乎与我接近而略小，我依然只是职业地将他引上船。&lt;br /&gt;今天的天空似乎有些异样的阴沉，不过不会影响到航行，于是这又将开始一个新的旅程。&lt;br /&gt;&lt;br /&gt;【Chapter 3】&lt;br /&gt;我控着方向，让船往预定的地点驶去，在有些阴沉的天空下划过淡淡的线条。&lt;br /&gt;他和来到记忆之海的大多数人一样，在船的前头打量周围，以未知抚慰着未知，显得有些无措。&lt;br /&gt;回忆的味道就是这样的吧，我也顺着他的视线向远方望去，心中划过这样的想法。&lt;br /&gt;其实的船行不需要过多的体力操作，在今天格外低的天空之下，航行显得有些沉闷。&lt;br /&gt;不过如果天空晴朗，这就是个同往日一样的航行了，充满生活的平淡的温馨，平淡便足够了。&lt;br /&gt;我沉浸在自己的思绪中，随后忽然感到船身的一个摇晃，我看见船对面的那个身影站起身子。&lt;br /&gt;他向我走来，我赶忙先稳定下船的航行，然后放松下身子。此时听见他说话的声音——&lt;br /&gt;【青年】 您比我大吧，我可以叫你哥哥吗？&lt;br /&gt;【我】 我已经是不在意自己的年龄了。&lt;br /&gt;【青年】 那我就叫你哥哥吧！&lt;br /&gt;【我】 这随便你。&lt;br /&gt;【青年】 嗯，哥哥好！&lt;br /&gt;【我】 ……&lt;br /&gt;他在我一旁坐下，没有把刚才打招呼的热情继续下去，而是将视线转向远方，有些顾虑的样子。&lt;br /&gt;【我】 来说你为什么要来到这里，是想寻找到怎样的记忆吧。&lt;br /&gt;虽然他的举动让我感到有些奇怪，我还是试图以平静的语气挑起对话。&lt;br /&gt;【青年】 不知道。&lt;br /&gt;他把头转向我，带着年轻人的稚气。&lt;br /&gt;【青年】其实我确实不知道，我没有想寻找的东西。&lt;br /&gt;即使这样也不必要有多余的犹豫吧。&lt;br /&gt;【我】 这里有记忆的宝藏哦，会有让人感到幸福的东西，不要为让自己可以努力的机会而犹豫。&lt;br /&gt;【青年】可是那些记忆是我主动抛开的，它们让我感到难受，我却矛盾地又为一种缺失感来到这里。&lt;br /&gt;【我】 好了，既然来到这里了，即使意外，也会找到些东西吧。&lt;br /&gt;【我】 它们都曾今属于你，今后也依然是。想着抛弃，就可能会让自己失去更多的东西。&lt;br /&gt;他看着我的眼睛，像在寻找一种希望。而航行也在这不知觉中驶近了目的地。&lt;br /&gt;【我】 去吧，相信自己心中小小的愿望，在海浪之间寻找能够寻找到的东西。&lt;br /&gt;【青年】 恩，谢谢哥哥。&lt;br /&gt;他答应了，然后走向船的那头。站立在船的边沿上，在阴沉的海天之间，显得波澜壮阔。&lt;br /&gt;而我一人在船的这头放松下身子，视线漫无目的地望向天空，意识到居然对着客人说出自己的想法。&lt;br /&gt;我这是说给谁听的呢。一个陌生人？一个在这死后世界里再也不会相遇的人？还是说……我自己？&lt;br /&gt;我在怀疑着自己举动的意义，是否就代表着自己已经做出或者将会做出一些多余的事情呢。&lt;br /&gt;可是此刻我异样的感觉到，我的思绪与情感在被他联系着，从未有过的被一个人所联系着。&lt;br /&gt;想着在此刻能为别人的困难添上自己的帮助，这同时也是在敞开心扉地能够去接受别人的帮助。&lt;br /&gt;看到船头转过头来望着我，在脸上露出一个微笑，而我看着也在自己脸上回应着一个微笑。&lt;br /&gt;两个人的微笑，未曾在这里奢望过的微笑，我意识到这是一个第一次在这死后世界里自己希望永远记住的东西。&lt;br /&gt;忽然平静的一切被打破了，一个浪打在了船身上，他刚刚侧转的身子没有站稳，摇晃着向记忆之海里跌落下去。&lt;br /&gt;在这一瞬间里，海风也变得巨大了，天空更加阴沉下去，而且似乎要发展往一个糟糕的方向。&lt;br /&gt;此刻顾不上太多，我想我得救他。赶忙跑向他所在的船头，往波浪翻滚的海水里跳了下去。&lt;br /&gt;我在下沉，身边被黑暗包围着。那是一片无尽的黑暗，我感到瞬间失去了重力，努力划着水却寻找不到方向。&lt;br /&gt;周围也异样的安静，这是一个海面下无声的世界，时间的流淌似乎漫长，甚至凝结。&lt;br /&gt;渐渐地我的心也在水中平静下来，我能感受到自己的呼吸，呼吸在这个海底并无异样。&lt;br /&gt;恐惧之后这我才意识到，这是在一个死后的世界，一个已经不会再死去而离开的世界，&lt;br /&gt;一个欣慰却又孤独的世界，一个没有失去也没有保留的世界，一个让记忆永恒封存的世界。&lt;br /&gt;在这个黑暗无声的世界里，我顺着水流漂浮着，让意识随着身体漂浮着。&lt;br /&gt;在记忆的海洋中以心灵去触摸着曾今，以及那些孕育着现在和未来的往昔时刻。&lt;br /&gt;我能体会到在深海之下闪烁的幽幽光芒，像一个指引者在前方对我轻轻的召唤着。&lt;br /&gt;我凭借着意志向光芒游去，让光点在眼前接近在身边扩散，觉得这样才能够拯救到什么。&lt;br /&gt;这样才能够实现自己对他人的一个守候，一个哪怕在这死后世界已经显得多余的举动。&lt;br /&gt;一种是哪怕只是出于内心原始的善良的淳朴的冲动，也要去带着落海的少年顺利的回来。&lt;br /&gt;光芒弥散于海底，如同思绪飘荡在无尽的水中接受着温柔而永恒的抚慰，包裹在我的周围。&lt;br /&gt;渐渐地，这些光点构成的屏障上清晰出一个影像，在向我讲述着什么。&lt;br /&gt;在向我呈现着一个“生”所在的世界，一个在海底无尽的黑暗里心所体会的“光”所组成的世界。&lt;br /&gt;&lt;br /&gt;【Chapter 4】&lt;br /&gt;【青年】 真是一个空旷的操场啊。&lt;br /&gt;耳边响起了青年的言语，轻轻地感叹着，然后声音又远去了。我想这是少年的记忆传递给我的信息吧。&lt;br /&gt;在他的视角上，我以第一人称在看到了他的双手，和他眼前的整片操场。&lt;br /&gt;接下来将在这个记忆构建的世界里，以一天天的经历，去体会着他的过去。&lt;br /&gt;可是这只是视觉，他的意识以及他的存在感，却无法通过薄弱的纽带感觉到。&lt;br /&gt;身体开始活动起来，由机械变得自然地走动着，向着教学楼那里去寻找人的踪影。&lt;br /&gt;我的意识仅仅是随着身体漂浮着，在这个世界里不能左右什么，也不会有想去左右什么的愿望。&lt;br /&gt;在阳光下曝露的身体，接触着这里的空气与水分，仿佛在由陌生不断变得亲近着。&lt;br /&gt;与空旷的操场相比，教学楼因为人的踪迹，而显出格外不同的氛围。&lt;br /&gt;身体继续往教室里走去，人的气息的存在让它移动着的脚步学会了自信。&lt;br /&gt;同时身体也是在渴望着阳光之外的什么，让自己来到这人群中去寻找着。&lt;br /&gt;身体在经历着成长，可是这样似乎仍缺少着什么，它所见到的人群都在它面前散开了。&lt;br /&gt;当身体带着疑惑去走进下一个教室，带着或许会有改观的期望，依旧得到的是一个失望的结果。&lt;br /&gt;【青年】 果然人们是讨厌我的，这个世界里已经不需要我的存在了。&lt;br /&gt;此刻身体举动正是表达着他的意志，这让我清晰的感受到意识的存在，但是明白这种体验的阻隔。&lt;br /&gt;之后，身体便失去了他本身的驱动，松软下来。重量压在了我的身上，而我只是依然麻木地站在教室中央。&lt;br /&gt;刚才跑去教室外的人群开始渐渐返回，他们仿佛无视了我的存在，又回到了他们的日常。&lt;br /&gt;我就这样站在教室里，近距离的带着身体逝去的愿望。去接触人群的气息，去沉浸于海洋的梦境之中。&lt;br /&gt;可是，梦境最终将迎来黎明。&lt;br /&gt;【同学】 刚才真是一个讨厌的人啊，就这么像无视我们的跑近教室来。”&lt;br /&gt;是“讨厌”吗？一句声音之后，周围的声音也纷纷附和起来，成为这个狭小的教室里共通的话题。&lt;br /&gt;我能感受到其中的恐惧，这正是我能从身体中所感受到的。&lt;br /&gt;让我出于内心的害怕，从这个空间里，从这个人群中向外跑去，跑向一个与此隔绝的世界中。&lt;br /&gt;我在遥远的地方大口的喘着气。驻足后望，那个教室，那片学校已经变成渺小的身影。&lt;br /&gt;这已经足够远了，这已经是喊声不能再被传递到的距离了。我的心开始变得空荡荡的。&lt;br /&gt;这是一种安心吗？我看着自己缓慢起落的脚步，在坚硬的水泥地面没有留下任何的痕迹。&lt;br /&gt;我再去望那片远去的世界，一个希望着阻隔开的，一个永远只保留着不起眼的存在的世界。&lt;br /&gt;我漂浮在这个梦境的世界，和一个已经属于我的身体，因为躲避着什么而肆意游荡着。&lt;br /&gt;只到有一天，也是偶然而特别的一天，我似乎是感到孤单，感到厌倦了。&lt;br /&gt;也似乎是出于好奇，决定再去一次那所学校，再次重拾起曾今想寻找的什么。&lt;br /&gt;校门在眼前清晰了，操场在眼前清晰了，教学楼在眼前清晰了，曾今去过的那所教室在眼前清晰了。&lt;br /&gt;自己觉得心中的愿望，去寻找一个未知到重要的东西的心愿，也这路途上变得清晰了。&lt;br /&gt;这或许就是在凭借着海的梦境的经历，来记忆里所未填的空缺吧。&lt;br /&gt;在那间教室的前，我敲了敲门走了进去，心里已经做好了接受各种意外的准备。&lt;br /&gt;这不是躲闪着旁人视线，而是在寻找他人的帮助，寻找着一种重拾遗失的启示。&lt;br /&gt;他站在教室门前，鼓起勇气地努力睁开眼，去接受着人群的目光。&lt;br /&gt;身体在人群中肆意的走动着，人们并没有做出异样的反应。&lt;br /&gt;身体想在人群中挑起话题，人们的意志中已经淡忘了他的痕迹了。&lt;br /&gt;这我才发现，他所做出决定已经无法改变，关于那个让自己消失于此的决定。&lt;br /&gt;他已经不再属于这个世界了，这一个他曾想抛开却一直未割舍的世界。&lt;br /&gt;那我又将飘向何方呢，向着一个新的永恒的世界吗？&lt;br /&gt;在意识在这个身体已经在远离我而去的时候，我又似乎不愿回到那片记忆之海上。&lt;br /&gt;因为在我海的梦境中，在这死后的世界里，我是第一次意识到了我所希望寻找的东西。&lt;br /&gt;我的意识回到的我的身体上，我闭着眼漂浮在黑暗的无尽的记忆之海的深处。&lt;br /&gt;随着水流飘向我一个不知为何方的地方，一个永远将背负着记忆的地方。&lt;br /&gt;在漫长的飘荡中，终于，我决定，睁开我的眼睛，去看看周围的世界。&lt;br /&gt;去看看身边的世界，哪怕看到的依旧只是黑暗，去依旧能在世界里发现着什么。&lt;br /&gt;&lt;br /&gt;【Chapter 5】&lt;br /&gt;这是一片天空柔和的色彩，西斜的阳光透过玻璃照射在我面前的床铺上。&lt;br /&gt;双手是棉被的触觉，鼻尖是医药水的味道，身边有机器在运转的声响。&lt;br /&gt;这是一个空荡荡的病房，我孤单的一个人躺在中央。身体不能动，只能望着粉白的屋顶。&lt;br /&gt;在这狭小的容器里，我感到内心的一阵寂寞与痛苦，因为孤单而在对外界恐惧而害怕着。&lt;br /&gt;害怕着我的记忆里所寄托的想象，会成为自己的一种负担，会让自己面对着未知却只会守护着丝丝迷茫。&lt;br /&gt;我闭上眼，想象自己正被水包围着，想象就在海底，在那片无尽的黑暗中。&lt;br /&gt;希望再次抵达那个世界每天航行在记忆之海上，一直地去陪同着别人寻找着别人在寻找的东西。&lt;br /&gt;于是在这样的孤单中，我的意识又变得模糊开始轻浮，再向一个遥远的地方飘去了。&lt;br /&gt;直到忽然间响起清脆的敲门声，这让我回过神来，可是我仍害怕着不敢睁开我的眼睛。&lt;br /&gt;我听出来是同班的同学来了，他们的话语声在翻滚着我的记忆，清晰着我的心跳。&lt;br /&gt;这让我想到，我忽视了一些自己没有察觉的细节——&lt;br /&gt;那片无尽的大海中也有一份属于自己的记忆吗，是否他们一直埋藏在那里而我却没有在意呢。&lt;br /&gt;我是否也有过一丝小小的心愿要实现——在那个异世界中，也去寻找属于自己的那一份记忆呢。&lt;br /&gt;那些记忆是一份仍然需要自己继续延续下去的记忆，它们还尚未到一个应该被海水所掩埋的时刻。&lt;br /&gt;处在这个生者的世界里的我，是否只有那个异世界里才能找到唯一的归宿，而该早早的就去呢。&lt;br /&gt;可是活着不该是一个被轻易淡忘着的概念，而让记忆独自在无尽深海之下，去忍受着永恒的没有终结的孤单。&lt;br /&gt;是啊，刚才心头居然有抛弃“生”的世界的想法，自己觉得可笑。&lt;br /&gt;去寻找活着的的自己的意义所在，才是对那个死后世界无尽时光最好的终结。&lt;br /&gt;况且一直有人在为着我的“生”而努力呢，让我能够再次的活过来，而我竟想拒绝他人的心愿。&lt;br /&gt;它们的努力让我能够有机会去真正地体会到自己内心的希望，这同时也是他人给予我的希望。&lt;br /&gt;不论是给予的关心或者是给予的治疗，都是由这一切的努力才让我又回到了这个世界中。&lt;br /&gt;【同学】 真希望你能够早点醒过来哦，和我们一起去看班级篮球赛。&lt;br /&gt;熟悉的声音在面前在病房中弥散开来。&lt;br /&gt;而我的内心出于一种固执，依然让自己的双眼紧紧闭着，用拒绝去回避心头残余的害怕。&lt;br /&gt;【同学】 今天我们先走了，明天放学的时候还会来看你的。&lt;br /&gt;然后是一个轻轻的关门声。&lt;br /&gt;病房里恢复了先前的安静，又只剩下我孤单的一个人在这狭小的房间里。&lt;br /&gt;此刻安静得如同深海的气息，我心头的另一种害怕又让自己猛地设法睁开自己的眼睛。&lt;br /&gt;可是我发现自己的眼睛没能睁开，只是忽然有泪水的热度在脸颊上流淌开来。&lt;br /&gt;我努力地张开口，努力地说着——&lt;br /&gt;【我】 只是一个旅途，这几天里我去了一个遥远的地方，现在我已经回来了……&lt;br /&gt;破碎的言语没有出声，只化作苦涩与甘甜，混杂着口角泪水的味道。&lt;br /&gt;而所告别的旅途呢，&lt;br /&gt;将依然安静地在一个遥远的地方延续下去，延续往彼世界中所不存在的尽头。&lt;/blockquote&gt;&lt;br /&gt;话说这种质量不高的应急式产物果然连自己都讨厌，当然GalGame是不应该用这样东西做剧本的。&lt;br /&gt;还是去看 阿加莎 克里斯蒂 的小说去吧。。。&lt;br /&gt;顺便觉得小野不由美的也不错。。。&lt;br /&gt;我这里质量拙劣，仅此而已。。。&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;后来试了试html5+Biwascheme或Processing+Kawa或Processing+自己解析脚本，just work。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/3567312060731999389/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/3567312060731999389' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3567312060731999389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/3567312060731999389'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/06/javascheme.html' title='又一个坑了的视觉小说，\n顺便说说Java与Scheme的混合/嵌入使用'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6001650352455840760.post-2142831042170735857</id><published>2011-05-28T10:30:00.013+08:00</published><updated>2011-05-28T15:52:24.019+08:00</updated><title type='text'>日记帖</title><content type='html'>还久没写日记直接的帖子了，总是从各种逻辑上的堆砌文本的话，有点像有意在消灭自身存在感的样子。就像是把时间的流逝只看作了是一种物理运动的规律，而就仅此而已，掩盖时间给予人的意义。不过日记这种东西，写的时候是需要某种闲心呢。比如正好躺在床上等待着什么，而且知道等待的那个时间是直到自己等待得厌倦了也不会到来。于是可以拿出手机之类可以把玩的东西（就是可以按这按那，但是又漫无目的），来记录一些心情引发一些所想，文字什么的只是附带产物。&lt;br /&gt;其实日记的本身的产物其实就是思绪的记录，一是证明了了脑部的某种运动，一是记录了某种运动确实是存在。当从产物而言去谈论其中的意义的话，并没有直接了价值所得，甚至可以说是某种能量的浪费。可是呢，有什么可以纠结就像知道有什么寻找到就可以满足了一样，然后去为了获得什么而做出什么，承载着一天天的时光。&lt;br /&gt;感觉现在没兴致说东西了，觉得时间就是用来做些什么的。哪怕就是不知如何的消失掉，也不会去让自己知道。于是只有闲暇在能产生的文字，就总是显得这么匆忙呢。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;最近这里没有贴新的小说呀，这么久没有贴的话，就自己都有种怀念的感觉了。总之就是一直没有要去再写出什么的想法过，因为知道这么写啊写啊，除了弥补自己某时间的闲暇之外，并没有明了的意义。所以了，除非像现在这样心血来潮一般，因为又难得的有心情去看了一些小说啊电影啊理论啊什么的，忽然觉得原来就这么写写也或许蛮有趣的。是啊，虽然平时是觉得写来写去是很无趣的，但是有的时候就是觉得也思路的电波就一致了。&lt;br /&gt;在平时的时候，对于文字的感觉是麻木的。就是觉得有时候觉得不写出来什么点不甘心的时候，也只是很牵强的来写出点什么。虽然自己知道这只是在自娱自乐，但是大多数时候是连这般自我的娱乐的兴致也没有了。有些文本就是在构造出氛围，用设定上的种种关联以及很长的时间来说清楚这是一件怎样一会事情。故事什么的相比于这种氛围是一种显得十分淡薄的东西了。&lt;br /&gt;话说今天来开帖堆字，是忽然觉得这样有趣。就仅仅是有趣而已，不然的话在上面给予思绪是一种不甘心的事情。不过通常的时候，是觉得堆文字是一种无趣的行为吧。但是有的时候出于需要，就是得做一些要如何去做的事情。类似于堆文字这样的事情也是不可避免的。可以在那种认为无趣的时候，总觉的始终思维受限的状态。就是那种要逼迫着自己才能说出些什么，甚至是不大想说也要说出些什么的样子。当然，真正有必要说什么的时候，还是得说了。不是像这里这个让自己随意地来堆放点什么的地方就这么平时可以大不在意的就堆放在这里。在动机越来越淡薄的时候，就是偶尔想出来自娱自乐的时候，就来这里堆放一点什么了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;上面还说是日记啊，原本想是想记录一些回忆的，或者哪怕是记录一点以前想记录下来的事情也好。虽然说开一个新帖长长的写出一大段说明的性质的文字至少在看起来的样子会有更好一些的质量，但是有些东西就毕竟只是零星的想法，如果不以随意的方式来记录的话，肯定是永远的掩埋下不会再去写了。凭借触动什么的突然有了生活的某种热情显然是不可靠的事情，至少在某种麻木的努力是无意义的假设之下。当然这句话可以从多方面来解释，可是这个似乎就想纠结于“无意义”三个字上呢，越想否定却又发觉不能完全否定掉的存在。觉得周围一下子变成负担，有忽然觉得原来还有许多有趣的东西等待着没有被发觉呢。&lt;br /&gt;否定掉了太多的东西，也就以为不会有什么剩下了，可是世界从时间和空间的角度来说，都是广阔而漫长的。有时就是有点额外的心情才会发觉到世界中的特别之处吧。而不只是在积累着越来越多的无奈什么的。&lt;br /&gt;不过貌似只是仅又来这里堆堆文字的什么的是形式很有限的，但是也确实可以随意的涂上几笔的意思。只是有所记录，而不是从好坏上评价什么，或者就此勉强着什么。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;这不叫日记，叫虚拟度假吧。</content><link rel='replies' type='application/atom+xml' href='http://myzsyweb.blogspot.com/feeds/2142831042170735857/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6001650352455840760/2142831042170735857' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2142831042170735857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6001650352455840760/posts/default/2142831042170735857'/><link rel='alternate' type='text/html' href='http://myzsyweb.blogspot.com/2011/05/blog-post.html' title='日记帖'/><author><name>ee.zsy</name><uri>http://www.blogger.com/profile/14388471421152431423</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>