<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>到哪里都是主场 &#187; Lisp</title>
	<atom:link href="http://duowang.info/archives/category/computer-science/lisp/feed" rel="self" type="application/rss+xml" />
	<link>http://duowang.info</link>
	<description>Monologue, Applied Math, Computer Science</description>
	<lastBuildDate>Sun, 10 Jul 2011 00:51:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Common Lisp笔记-2.数字表达与算术运算</title>
		<link>http://duowang.info/archives/595</link>
		<comments>http://duowang.info/archives/595#comments</comments>
		<pubDate>Thu, 03 Dec 2009 05:11:28 +0000</pubDate>
		<dc:creator>duo</dc:creator>
				<category><![CDATA[Lisp]]></category>

		<guid isPermaLink="false">http://duowang.info/?p=595</guid>
		<description><![CDATA[Lisp是历史第二悠久的高级语言，仅次于Fortran，可以把它看做解释性语言，因为可以在命令行下直接输入命令，然后得到结果，这个过程被称为REPL（Read-Eval-Print Loop）。比如最简单的数字表达：（再次说明下Lisp用分号;表示注释，这里我用$表示命令提示符） $ 10 &#160;;整数 10 $ 20/2 ;可约整数之比 10 $ &#160;#b10010 &#160;;二进制用 #b为前缀 18 $ #o76 &#160; &#160; &#160; ;八进制以 #o为前缀 62 $ #xABCD &#160; ;十六进制 43981 $ 2/3 &#160;;俩整数若不能整除，则表示为分数 2/3 $ 3/2 &#160;;即使能写成有限小数也表示为分数，意味着Lisp可以精确地表达有理数 3/2 $ &#160;#c&#40;2 1&#41; &#160;;Lisp用#c前缀来表示复数，不多说了 #C&#40;2 1&#41; 再看一些算术运算的例子： $ &#160;&#40;+ 9 8 7&#41; ; &#160;可以任意操作数，任意不光指很多，也可以 0个或者1个 24 $ &#160;&#40;- 10 [...]]]></description>
			<content:encoded><![CDATA[<p>Lisp是历史第二悠久的高级语言，仅次于Fortran，可以把它看做解释性语言，因为可以在命令行下直接输入命令，然后得到结果，这个过程被称为REPL（Read-Eval-Print Loop）。比如最简单的数字表达：（再次说明下Lisp用分号;表示注释，这里我用$表示命令提示符）</p>
<div class="codecolorer-container lisp dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lisp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ <span style="color: #cc66cc;">10</span> &nbsp;<span style="color: #808080; font-style: italic;">;整数</span><br />
<span style="color: #cc66cc;">10</span><br />
$ <span style="color: #cc66cc;">20</span>/<span style="color: #cc66cc;">2</span> <span style="color: #808080; font-style: italic;">;可约整数之比</span><br />
<span style="color: #cc66cc;">10</span><br />
$ &nbsp;#b10010 &nbsp;<span style="color: #808080; font-style: italic;">;二进制用 #b为前缀</span><br />
<span style="color: #cc66cc;">18</span><br />
$ #o76 &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">;八进制以 #o为前缀</span><br />
<span style="color: #cc66cc;">62</span><br />
$ #xABCD &nbsp; <span style="color: #808080; font-style: italic;">;十六进制</span><br />
<span style="color: #cc66cc;">43981</span><br />
$ <span style="color: #cc66cc;">2</span>/<span style="color: #cc66cc;">3</span> &nbsp;<span style="color: #808080; font-style: italic;">;俩整数若不能整除，则表示为分数</span><br />
<span style="color: #cc66cc;">2</span>/<span style="color: #cc66cc;">3</span><br />
$ <span style="color: #cc66cc;">3</span>/<span style="color: #cc66cc;">2</span> &nbsp;<span style="color: #808080; font-style: italic;">;即使能写成有限小数也表示为分数，意味着Lisp可以精确地表达有理数</span><br />
<span style="color: #cc66cc;">3</span>/<span style="color: #cc66cc;">2</span><br />
$ &nbsp;#c<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;Lisp用#c前缀来表示复数，不多说了</span><br />
#C<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></div></div>
<p>再看一些算术运算的例子：</p>
<div class="codecolorer-container lisp dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lisp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ &nbsp;<span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">9</span> <span style="color: #cc66cc;">8</span> <span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">; &nbsp;可以任意操作数，任意不光指很多，也可以 0个或者1个</span><br />
<span style="color: #cc66cc;">24</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>- <span style="color: #cc66cc;">10</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">; 第一个是被减数，其他都是减数</span><br />
<span style="color: #cc66cc;">5</span><br />
$ <span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;规则同加法</span><br />
<span style="color: #cc66cc;">24</span><br />
$ <span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;除法规则同减法</span><br />
<span style="color: #cc66cc;">3</span>/<span style="color: #cc66cc;">4</span><br />
$ <span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;注意，只有一个操作数，此时加法默认另外一个操作数为加法群的单位元 0</span><br />
<span style="color: #cc66cc;">8</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>+<span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;所以没有操作数的时候，就是单位元</span><br />
<span style="color: #cc66cc;">0</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>* <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;乘法群单位元为1</span><br />
<span style="color: #cc66cc;">8</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>*<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">; 应该可以猜到</span><br />
<span style="color: #cc66cc;">1</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>- <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;默认被减数是0</span><br />
-<span style="color: #cc66cc;">2</span><br />
$ &nbsp;<span style="color: #66cc66;">&#40;</span>/ <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;默认被除数是 1， 注意(-) 和(/)这种误操作数的减法和除法语法错误，会报错。</span><br />
<span style="color: #cc66cc;">1</span>/<span style="color: #cc66cc;">2</span></div></div>
<p>再看一些比较运算：<br />
= 用来表示相等，如果参数都相等则返回T，否则返回nil<br />
(= 1 1)                        ==&gt; T<br />
(= 10 20/2)                    ==&gt; T<br />
(= 1 1.0 #c(1.0 0.0) #c(1 0))  ==&gt; T</p>
<p>不等于用/= 来表示<br />
(/= 1 1)        ==&gt; NIL<br />
(/= 1 2)        ==&gt; T<br />
(/= 1 2 3)      ==&gt; T<br />
(/= 1 2 3 1)    ==&gt; NIL<br />
(/= 1 2 3 1.0)  ==&gt; NIL</p>
<p>小于大于不大于不小于分别用 &lt;, &gt;, &lt;=, and &gt;= 表示，类似这些比较也可以有多个参数，每个参数与右边的参数比。<br />
(&lt; 2 3)       ==&gt; T<br />
(&gt; 2 3)       ==&gt; NIL<br />
(&gt; 3 2)       ==&gt; T<br />
(&lt; 2 3 4)     ==&gt; T<br />
(&lt; 2 3 3)     ==&gt; NIL<br />
(&lt;= 2 3 3)    ==&gt; T<br />
(&lt;= 2 3 3 4)  ==&gt; T<br />
(&lt;= 2 3 4 3)  ==&gt; NIL</p>
<p>另外还有取最大最小值的max和min函数<br />
(max 10 11)    ==&gt; 11<br />
(min -12 -10)  ==&gt; -12<br />
(max -1 2 -3)  ==&gt; 2</p>
<p>参考: <a href="http://www.gigamonkeys.com/book/numbers-characters-and-strings.html">Practical Common Lisp  Chapter 10 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://duowang.info/archives/595/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Common Lisp笔记-1.Lisp环境搭建</title>
		<link>http://duowang.info/archives/483</link>
		<comments>http://duowang.info/archives/483#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:01:32 +0000</pubDate>
		<dc:creator>duo</dc:creator>
				<category><![CDATA[Lisp]]></category>

		<guid isPermaLink="false">http://duowang.info/?p=483</guid>
		<description><![CDATA[很早就想学习Lisp语言，因为它的高深神秘，感觉Lisp之于其它编程语言就像TAOCP之于其它算法书一样。网上找了很多介绍文章和电子书来看，不过一上来就被什么atom，list等概念弄晕了，甚至还听说lisp程序代码本身就是数据结构，可以被操作的说法，立刻换Tab去看娱乐八卦文章去了。 不过最近读传奇程序员的八卦访谈合集《Coders at Work》， 发现这个采访者写过一本《Practical Common Lisp》，官网可以免费看，发现确实写的好，至少让我能看下去。就把读这本书的笔记整理下，记录下整个过程的困惑疑问，以及开窍的过程。 首先得有个Lisp环境，这个简单，作者Peter Seibel在官网上附上了一个地址, 本质上就是个Emacs加Slime，加一些书上要用到的代码宏库什么的集成环境。不过我没用这个，我用的是单纯的Lisp in a box。如果你用Windows系统，最简单了，先下载安装base installer，再下载安装CLISP module，然后开始菜单就能看到安好了，点击就能用了。若是Linux，如果安了emacs，需要安装lisp（我是ubuntu下apt-get install cmucl)和SLIME，如果不习惯emacs，可以找找别的lisp编程环境，我就没经验了，具体怎么下载安装配置我就不细说了。一切就绪后，在emacs里 Alt+x 输入 slime，就启动了lisp环境。 其实linux下最简单的方法是安装lisp之后，直接在terminal输入lisp，就出来一个lisp的环境，类似python的调用方法，但这样就没有一个适合lisp的editor，总所周知，lisp的语法是比较变态的，不用一个专门的editor是很痛苦的。 看见了命令行，可以输入一些简单命令体会一下，唯一需要说明的是Lisp用分号(可以不止一个）表示注释。 ;;;一些简单命令 &#62;&#40;+ 2 3&#41; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;;加法，可以试下减法乘法除法 5 &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>很早就想学习Lisp语言，因为它的高深神秘，感觉Lisp之于其它编程语言就像TAOCP之于其它算法书一样。网上找了很多介绍文章和电子书来看，不过一上来就被什么atom，list等概念弄晕了，甚至还听说lisp程序代码本身就是数据结构，可以被操作的说法，立刻换Tab去看娱乐八卦文章去了。</p>
<p>不过最近读传奇程序员的八卦访谈合集《Coders at Work》， 发现这个采访者写过一本《<a href="http://gigamonkeys.com/book/">Practical Common Lisp</a>》，官网可以免费看，发现确实写的好，至少让我能看下去。就把读这本书的笔记整理下，记录下整个过程的困惑疑问，以及开窍的过程。</p>
<p>首先得有个Lisp环境，这个简单，作者Peter Seibel在官网上附上了一个<a href="http://www.gigamonkeys.com/lispbox/">地址</a>, 本质上就是个Emacs加Slime，加一些书上要用到的代码宏库什么的集成环境。不过我没用这个，我用的是单纯的<a href="http://common-lisp.net/project/lispbox/">Lisp in a box</a>。如果你用Windows系统，最简单了，先下载安装<a href="http://common-lisp.net/project/lispbox/LispBox-base.exe">base installer</a>，再下载安装<a href="http://common-lisp.net/project/lispbox/LispBox-CLISP.exe">CLISP module</a>，然后开始菜单就能看到安好了，点击就能用了。若是Linux，如果安了emacs，需要安装lisp（我是ubuntu下apt-get install cmucl)和<a href="http://www.common-lisp.net/project/slime">SLIME</a>，如果不习惯emacs，可以找找别的lisp编程环境，我就没经验了，具体怎么下载安装配置我就不细说了。一切就绪后，在emacs里 Alt+x 输入 slime，就启动了lisp环境。</p>
<p>其实linux下最简单的方法是安装lisp之后，直接在terminal输入lisp，就出来一个lisp的环境，类似python的调用方法，但这样就没有一个适合lisp的editor，总所周知，lisp的语法是比较变态的，不用一个专门的editor是很痛苦的。</p>
<p>看见了命令行，可以输入一些简单命令体会一下，唯一需要说明的是Lisp用分号(可以不止一个）表示注释。</p>
<div class="codecolorer-container lisp dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lisp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">;;;一些简单命令</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;加法，可以试下减法乘法除法</span><br />
<span style="color: #cc66cc;">5</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;结果</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>+ <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">;可以加很多数</span><br />
<span style="color: #cc66cc;">6</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #ff0000;">&quot;hello, world&quot;</span><br />
<span style="color: #ff0000;">&quot;hello, world&quot;</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;hello, world&quot;</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">;format 类似于C的printf函数</span><br />
hello<span style="color: #66cc66;">,</span> world &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">;函数本身的效应</span><br />
<span style="color: #b1b100;">NIL</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;函数的返回值，NIL表示False</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> hello-world <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>format t <span style="color: #ff0000;">&quot;hello, world&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &nbsp;<span style="color: #808080; font-style: italic;">;定义函数</span><br />
HELLO-WORLD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">;每个表达式都有返回值，定义函数的话返回定义的函数名</span><br />
<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span>hello-world<span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;调用函数</span><br />
hello<span style="color: #66cc66;">,</span> world<br />
<span style="color: #b1b100;">NIL</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #808080; font-style: italic;">;不解释了</span></div></div>
<p>总之吧，现阶段，Lisp就是很多括号，运算符在最前，每个命令都有个返回值。</p>
]]></content:encoded>
			<wfw:commentRss>http://duowang.info/archives/483/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

