common lisp的列表(Lists),等式 (Equality)

1.列表(Lists) cons把两个对象结合成一个有两部分的对象,称之为 Cons 对象。概念上来说,一个 Cons 是一对指针; 第一个是 car ,第二个是 cdr 。 任何非空的列表,都可以被视为一对由列表第一个元素及列表其余元素所组成的列表。 [1]> (setf x (list 'a 'b 'c)) (A B C) [2]> (car x) A [3]> (cdr x) (B C) 看图理解cons。 [caption id="attachment_801" align="alignnone" width="298" caption="lisp list"]lisp list[/caption] 可以这么些: [8]> (setf y (cons 'a (cons 'b (cons 'c nil)))) (A B C) 与图中所画内容相对应了 嵌套列表 [9]> (setf z (list 'a (list 'b 'c) 'd)) (A (B C) D) [10]> (car (cdr z)) (B C) [caption id="attachment_802" align="alignnone" width="300" caption="lisp嵌套列表"]lisp嵌套列表[/caption] 如果参数是一个 Cons 对象,函数 consp 返回真。
(defun our-listp (x) (or (null x) (consp x)))  因为所有不是 Cons 对象的东西就是一个原子 (atom),判断式 atom 可以这样定义:
(defun our-atom (x) (not (consp x)))
NIL 是一个原子,同时也是一个列表。 (null x)就是判断x为nil时,返回t。当然空列表也是nil。 2.等式 (Equality) 每一次你调用 cons 时, Lisp 会配置一块新的内存给两个指针。所以如果我们用同样的参数调用 cons 两次,我们得到两个数值看起来一样,但实际上是两个不同的对象: [14]> (eql (cons 'a nil) (cons 'a nil)) NIL 本质上 equal 若它的参数打印出的值相同时,返回真: [15]> (equal (cons 'a nil) (cons 'a nil)) T 3.lisp的指针 书上给了一个例子: [22]> (setf x '(a b c)) (A B C) [23]> x (A B C) [24]> (setf y x) (A B C) [25]> y (A B C) [26]> (eql x y) T 当我们给 y 赋一个相同的值时, Lisp 复制的是指针,而不是列表。当你赋一个值给变量或将这个值存在数据结构中,其实被储存的是指向这个值的指针。当你要取得变量的值,或是存在数据结构中的内容时, Lisp 返回指向这个值的指针。 函数 copy-list 接受一个列表,然后返回此列表的复本。 [27]> (setf y (copy-list x)) (A B C) [28]> (eql x y) NIL 4.列表的存取 [29]> (nth 0 '(a b c )) A [30]> (nth 1 '(a b c )) B [35]> (nthcdr 0 '(a b c d)) (A B C D) [36]> (nthcdr 1 '(a b c d)) (B C D) [37]> (nthcdr 2 '(a b c d)) (C D) 取第几个元素用nth,nthcdr是取第n个cdr,nth 等同于取 nthcdrcar。并且都是零索引。 Common Lisp 定义了函数 first 直到 tenth 可以取得列表对应的元素,但不是 零索引。 函数 last 返回列表的最后一个 Cons 对象。此外, Common Lisp 定义了像是 caddr 这样的函数,它是 cdrcdrcar 的缩写 (car of cdr of cdr)。所有这样形式的函数 cxr ,其中 x 是一个字串,最多四个 ad ,在 Common Lisp 里都被定义好了。
Read more...

common lisp变量和赋值,类型判断

1.变量 let引入新的局部变量。 [33]> (let ((x 1) (y 2)) (+ x y)) 3 defparameter创造一个全域变量。 [37]> (defparameter *ga* 123) *GA* [38]> *ga* 123 用 defconstant 来定义一个全域的常量 [39]> (defconstant limit 8 ) LIMIT [40]> limit 8 检查某些符号,是否是一个全域变量或常数,用 boundp [41]> (boundp 'limit) T [42]> (boundp '*ga*) T 2.赋值 setf给全域或局域变量做赋值,如果 setf 的第一个参数是一个符号(symbol),且这个符号不是某个局部变量的名字,那么 setf 将设置这个符号为全局变量。还是使用 defparameter 显式地创建全局变量比较好。 [44]> *ga* 1 [45]> (let ((n 10)) (setf n 2) n) 2 [46]> (setf x (list 'a 'b 'c)) (A B C) 传入 setf 的第一个参数,还可以是一个表达式或一个变量名。在这种情况下,第二个参数的值被插入至第一个参数所引用 (refer)的地方。 [47]> (setf (car x) 'n) N [48]> x (N B C) [53]> (setf a 1 b 2 c 3) 3 [54]> a 1 [55]> b 2 [56]> c 3 相当于
(setf a b)
(setf c d)
(setf e f)

3. 类型
在 Common Lisp 里,数值才有类型,而不是变量。typep判断类型。
[57]> (typep 25 'integer)
T

类型 (Types)

Read more...

common lisp学习笔记二,quote,if,and和or

1.quote Lisp 提供 quote 作为一种保护表达式被求值的方式。Common Lisp 定义 ' 作为 quote 的缩写。 [62]> (quote (+ 3 5)) (+ 3 5) [64]> '(+ 3 5) (+ 3 5) 这意味着 Lisp 程序可以写出 Lisp 代码。 Lisp 程序员能(并且经常)写出能为自己写程序的程序。 2. if [20]> (if t 'a 'b) A [21]> (if nil 'b 'a) A 第一个参数是判断,第二个是为true时求值,第三个是false求值。 3. and和or 逻辑操作符 andor 与条件式 (conditionals) 类似。两者都接受任意数目的参数,但只对能够决定返回值的那几个参数来作求值。如果所有的参数都为 (即不为 nil ),那么 and 会返回最后一个参数的值,如果其中一个参数为 ,那么之后的所有参数都不会被求值。 or 也是如此,只要碰到一个是 的参数,就停止对之后的所有的参数求值。 [23]> (and t t (+ 1 3) t) T [24]> (and t t (+ 1 3) nil) NIL [25]> (and t t (+ 1 3) nil t) NIL [26]> (or nil nil (+ 4 5)) 9 [28]> (or nil nil (+ 4 5) nil) 9 [29]> (or nil nil (+ 4 5) (- 8 7) nil) 9 其实也可以这么理解,对每一个参数求值,当and遇到nil,或者or遇到非nil,终止求值,返回nil或者非nil。没遇到就返回最后一个参数的值。  
Read more...

互联网分享之道

今天在thinkphp的群里,有想要thinkphp 3.0写得代码例子,用来参考。我果断发给他了。 我写这些代码的时候,也是从论坛下载了别人分享的代码学习的。知道有一个参考学习得快,虽然官方有不错的文章和文档。 他分享给我一个phpcms的漂亮后台界面,在群里也有分享。群里有说“多几个你这样的群友群必火”,是撒,如果都分享自己的一点东西,无论珍藏与否,大家同时得到的东西都会变多。这是个基本的道理,但是做的人却不多。 可能你拿出来时会有很多顾虑,比如写得不好。当时我也有这种心态,毕竟我水平有限,也没认真写。但是无论谁都是从学开始的,你的东西多少都会给别人启发。 写博客记录自己的学习过程,我也是从中感到分享的快乐。以前搭建过博客,申请过域名,但由于各种原因没坚持下来。现在sae对一部分人条件宽松,又有二级域名,还有现成的程序,所以那些客观因素都没了,有时间就记录一下。不过想用python,django再写一个博客,用wp的数据库结构,界面就不改变了,挺喜欢这个界面。wp的博客除了插件省心,添加个功能方便外,很多功能我用不上,准备改掉他。  
Read more...

php跨库复制备份表

需要定时把一些数据表备份,并做数据统计。
$dates=date('Ymd',time());

//player表的备份
$newtable = "PlayerLog" . $dates;
$sql = "CREATE TABLE ".$newtable." LIKE game_qd.Player";
$linelist = $logdb->exec($sql);
print_r($linelist);
echo "\n\r\n";
$sql2 = "INSERT INTO ".$newtable." SELECT * FROM game_qd.Player";
$linelist = $logdb->exec($sql2);
print_r($linelist);
echo "\n\r\n player done";
,主要的代码就两行。 还学会了left  join的用法,当时没想到,是解决了判断一个备份表里有,另一个备份表里没有是计算差值时的问题。  
	
$sql7 = "select a.PlayerID,a.Score,(a.Score-IFNULL(b.Score , 0)) as Scorecha from ".$formtable." as a left join ".$endtable." as b on a.PlayerID=b.PlayerID order BY Scorecha desc,Score desc limit ".$limitnum;
.
Read more...

common lisp的符号、数字、列表和字符串

符号,字母开头,包括字母数字和连接符。 5 17 -34 +6 2/4 1/3 3.1415 1.722e-15 #c(1.722e-15 0.75) 有趣撒~ lisp支持分数形式,下面几个测试: [1]> (+ 3 2/3) 11/3 [2]> (+ 3.0 2/3) 3.6666667 [3]> (* 2.0 1/3) 0.6666667 [4]> (* 3.0 1/3) 1.0 [5]> (* 3.00 1/3) 1.0 [6]> (/ 3.0 1/3) 9.0 [7]> (/ 2.0 1/3) 6.0 lisp支持复数形式#c(r,i),r为实部,i为虚部。 lisp字符串包含在双引号中,#\a  #\3表示字符。反斜杠为转义字符。   命名约定:在全局变量开头和结尾带有“*”,常量都已“+”开头结尾。   构造一个列表:(list 4  5 6) [4]> (cons 'a '(b c)) (A B C) 用函数 cons 来构造列表。如果传入的第二个参数是一个列表,则返回一个由第二个参数所组成的新列表,其中新列表的第一个元素是传入的第一个参数。 [6]> (cons 'a (cons 'b nil)) (A B) 来取出列表元素的基本函数是 carcdr 。列表的 car 是第一个元素,而列表的 cdr 是第一个元素之后的所有元素 [13]> (setq l '(a b c)) (A B C) [14]> l (A B C) [15]> (car l) A [16]> (cdr l) (B C) 这个像erlang里列表操作,或者应该说erlang学的lisp。   nil唯一一个既是原子又是列表的对象。
Read more...

common lisp入门安装

又准备开始学lisp,前些时候就想学,但是就怕贪多嚼不烂。现在又想:喜欢就学,先学习语法,不用深。说不定以后就用到。 lisp方言很多,没什么太多了解,先学一个撒~ 下载地址:www.clisp.org,一路next安装windows版完成。 一个lisp的IDE:http://www.daansystems.com/lispide/ [1]> 10 10 [2]> (* 2 3) 6 感觉想极了编译原理里面学的,三元式还是啥的来。 [3]> (format t "hello world") hello world NIL t 是标准输出,NIL是对format求值的结果。列表的第一个元素是函数名。nil代表false,t代表true。 写成函数形式: [4]> (defun hello-world () (format t "hello world")) HELLO-WORLD [5]> (hello-world) hello world NIL 求值后,得到一个名为HELLO-WORLD的函数,函数没有参数。
Read more...

安装scrapy的方法详解

scrapy安装确实麻烦,网上找到一片详细按照教程保存下来。安装scrapy的方法详解下载地址:安装scrapy的方法详解
Read more...

firefox更新通道的修改

firefox更新通道分为:release ,beta, aurora,三个版本可以分别看作是正式版、测试版、内部不稳定版本。 今天firefox刚更新,就关注了一下版本。想用测试版体验新感觉(汗~)。 修改方法: c:\Program Files (x86)\Mozilla Firefox\defaults\pref\ ,找到channel-prefs.js文件,修改为pref(“app.update.channel”, “beta”);。 不知道为什么下面的方法不行。。。 输入:about:config,然后在搜索地方输入:app.update.channel,双击修改release为beta,就搞定了。
Read more...

十一假期荒废了,只学了个thinkphp

十一假期这么长,本想着前段时间没有学习,这里给补上。半路接了个网站,要用php开发,寻思着学个框架吧,开发还快速,选择了貌似中国最好的php框架,边看thinkphp官网的文档,然后到论坛下载了一个blog,就开工了。文档很详细,学起来也简单,偷懒中写完了。1000rmb到手了。顺便用到PHP-ExcelReader,一起学习了 这样其实也不错,可以很快的将学到的东西用到实践中去,以后用php快速开发可以用thinkphp的这个框架了^_^。 本想着假期接着学习golang和erlang的,现在泡汤了。抽时间一点一点的看实在是不符合我的性格,像我看小说,不看则已,一看就必须看完它。
Read more...

Previous Page 1 2 3 4 5 6 7 8 9 10 Next Page 最后一页