Archive for lisp

这个问题是老长时间之前的了,我在repl下边看书边写代码测试一些看书想到的问题,然后把你个内建函数名写错了,sbcl提示我参数不是list,但是群里求救别人都没看出来是函数名写错了,后来我发现是特么的函数名写错。但是我很纳闷,为啥会这么个出错模式。 有人推荐我下了lw,lisp works。然后lisp works提示函数未找到。然后就会轻松知道原因了。 后来妮神给我讲,函数调用是根据名字来确定用哪个函数,而cl标准未规定函数调用的时候,是在参数计算前确定哪个函数还是在后,或者中间。 所以这个问题就导致了,sbcl和lw一样是先执行参数后确定函数的,因为可能参数里边会定义这个函数。(javascript也是这样的)sbcl执行参数发现参数不是list报错了,我测试的那个函数是匹配列表的,可以是cons所以不一定是列表,真是凑巧啊。而lw可能回溯回去 报了函数名不正确的错误。 群里另一个人好像用clisp的实现,是先确定函数然后计算参数的。 当时群里写过一个测试代码,杀叔让我写一个python版本的,我在函数里边用了global,然后python也就替换

Continue

妮神教的,没看过标准的我只能猜测,不过开始猜测的还正确了 我在一个包文件里这么定义了一个常量 (defconstant +levels+ (vector :error :warning :info :debug)) load的时候说重复定义,这显然是不正确的,我其他地方都没定义过,显然后边那个值又计算了。我在群里问就是后边这个值是不是又计算了一次。 不过我不知道原因是load了多次导致的 妮神的讲解就是,加载到repl的时候会load多次,然后 就会定义多次,而常量不允许定义多次,cl的实现就会判断定义的时候后边的值是否eql,eql就通过,不eql就报错。而vector虽然是不变长的,但是还不是一个对象,执行两次不eql,所以会报错。 直接用defparameter定义的,包里边自己别修改一般不会有问题吧。

Continue

在妮神帮助下,学习了很多cl的知识,后边都总结一下。 本想晚上洗袜子,跑步。写代码写的上火,写了一晚上写了40行cl代码,四个宏,并且功能还没做完。想给框架先写个log模块的,用宏可以编译前判断log打印等级决定生成是否打印,现在整的完全不想写cl代码了[泪流满面] 洗洗睡,袜子明天起的早再洗 今天早上思路清晰多了,代码精简到34行.修复了一个bug。问题是修复了这个bug,展开式变成4行,没修复之前展开式只有一行,不爽 ,,四行的话和写个函数没啥区别了 昨晚上和今天早晨的微博,然后就不记录前后原因了。 说说怎么编译包。 首先要load 依赖包,不然会编译的时候找不到。 (ql:quickload "cl-async") 编译包的顺序,要先编译package.lisp并且load。不然编译别的文件会找不到你自己定义的包. (load (compile-file "package.lisp")) 之后按顺序编译其他文件 (load (compile-file "logging.lisp")) (load (compile-file "se

Continue

今天本来想写点web框架代码,早早睡觉的,框架代码写了一点。发现测试时候load 然后执行,想文件多了没法搞了。先看看cl打包吧。 然后就查看过的书,找讲包的内容,发现很少。就一个defpackage,实用cl编程里边讲的多一点,注意事项很多,然并卵,写完发现一样不好用。 去群里求救,需要asdf这么个东西,起了个蛋疼名。之前用过但是不知道干嘛的,文档 https://www.common-lisp.net/project/asdf/asdf.html 首页有个有意思的地方Examples Download any of the many packages available through Quicklisp to see as many examples. 哈哈,不过文档里有。 看文档sbcl里边好像自带asdf,我装过quicklisp,并且启动repl的时候自动加载。可以直接使用(asdf:asdf-version)看到asdf的版本3.0.2 duang.asd <pre>(in-package :asdf-user) (asdf:defs

Continue

从昨天到今天,是决定写东西用的语言,准备用一个函数式语言。前几天连想没想用cl找库开搞,不过这个过程是困难的,找到没几个相关库,还感觉很不如意,文档只有简单的介绍,我这刚学会语法的水平简直用不了,对库调用什么的,我直接找了sbcl的io-net包,但是还是放弃了,准备先用cl写点小程序再说。 其实golang写这个东西是个不错的选择,但是对打括号闭合感觉太不有爱,也对golang相对熟悉不想再研究了。今天中午编译了两个 小时的rust,看了一下很不错,要用的东西基本有,现成的没有,如果不考虑花费时间会很长,就会边学边用了。然后相继看了ocaml,haskell,scheme这几个听的多的,比较了一下官网,库,和文档,最后选择了haskell。scheme 语法比较合我意,但是目测和cl应该一样的悲剧。总的来说,从官网内容丰富程度,我选择了scheme。scheme官网上还有很多本scheme的书,很好。

Continue

sbcl的终端交互模式,不支持方向键,终端的快捷键也不支持,输入程序简直但疼的要命,然后想找一个好点的。下午玩玩学学,搞了一下午。 最终敲定的方案:vim+slimv.vim。http://www.vim.org/scripts/script.php?script_id=2531装一个小插件就行了。这个是仿的emacs+slime的。 这个也是一个方案,但是对emacs的快捷键不熟悉,也不想学。话说写lisp代码好像要用emacs。。。觉得还是小小的研究一下 还有一个是<code>rlwrap,开始也是想找一个类似ipython一样的。找到:</code>http://stackoverflow.com/questions/11109249/how-to-customize-the-sbcl-repl rlwrap sbcl就行了。 网速不给力,也没有下载成功。 基本的命令 配置什么的可以找安装的文档。这里有教程:http://kovisoft.bitbucket.org/tutorial.html 还是很好的一个插件!

Continue

今天有想着瞎折腾了,帮老师改毕业设计还早着,但是实在不想写,可能因为感冒不爽。还是对不了解的东西感兴趣,然后开始了。 找到两个库,cl-http和hunchentoot,一个重量级,一个轻量级。选择后者了,因为只是想玩玩,写的代码肯定helloworld水平,just do it。 主要参考文章:http://blog.csdn.net/cx1468059916/article/details/8262515很详细 1.安装sbcl,执行命令:sudo apt-get install sbcl,sbcl好像是开源里边最受欢迎的。 2.安装quicklisp,是进行库管理的,方便安装。 下载quicklisp。wget http://beta.quicklisp.org/quicklisp.lisp 进入sbcl,载入:* (load "quicklisp.lisp") 安装(quicklisp-quickstart:install) 每次启动sbcl,载入sbcl,(ql:add-to-init-file) 安装库:(ql:quic

Continue

1.数组,Array <tt>make-array</tt> 构造一个数组。 [9]&gt; (make-array '(2 3)) #2A((NIL NIL NIL) (NIL NIL NIL)) [10]&gt; (make-array '(3 3)) #2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL)) 其中 n 是数组的维度。 [11]&gt; #2a((1 2 3) (4 4 4)) #2A((1 2 3) (4 4 4)) <tt>可以使用:initial-element</tt> 参数初始化数组元素的值。 [12]&gt; (make-array '(2 3) :initial-element 2) #2A((2 2 2) (2 2 2)) 取出数组内的元素我们调用 <tt>aref,</tt>要替换数组的某个元素,我们使用 <tt>setf</tt> 和 <tt>aref。</tt> &gt; (setf arr (make-array '(2 3))) #2A((NIL

Continue

1.映射函数 [1]&gt; (setf l '(1 2 3)) (1 2 3) [8]&gt; (mapcar #'(lambda (x) (+ x 10)) l) (11 12 13) <tt>maplist</tt> 接受同样的参数,将列表的渐进的下一个 <tt>cdr</tt> 传入函数 [9]&gt; (maplist #'(lambda (x) x) l) ((1 2 3) (2 3) (3)) 2.树 看完这一节,才对lisp的其中一个优点有所理解。就像lisp的名字“Lisp” 起初是 “LISt Processor” 的缩写。都是列表啊。 <em>Cons</em> 对象可以想成是二元树, <tt>car</tt> 代表右子树,而 <tt>cdr</tt> 代表左子树。图就不传了,原图有点错误,这个比较好理解。 我们有下面的列表。 [13]&gt; (setf x 1) 1 [15]&gt; (and (integerp x) (zerop (mod x 2))) NIL [16]&gt; (

Continue

1.列表(Lists) <tt>cons</tt>把两个对象结合成一个有两部分的对象,称之为 <em>Cons</em> 对象。概念上来说,一个 <em>Cons</em> 是一对指针; 第一个是 <tt>car</tt> ,第二个是 <tt>cdr</tt> 。 任何非空的列表,都可以被视为一对由列表第一个元素及列表其余元素所组成的列表。 [1]&gt; (setf x (list 'a 'b 'c)) (A B C) [2]&gt; (car x) A [3]&gt; (cdr x) (B C) 看图理解cons。 [caption id="attachment_801" align="alignnone" width="298" caption="lisp list"]<a href="http://0x55aa-wordpress.stor.sinaapp.com/uploads/2012/10/Figure-3.2.png"><img class="size-full wp-image-801" title="lisp list" sr

Continue