Common Lisp编译程序的小技巧
这几天开始玩Common Lisp,遇上了一个有意思的问题,CL一般是解释运行,也有实现可以编译生成字节码(fas文件)。我正在用的两种CL实现是SBCL和CLISP,前者是我从《实用Common Lisp编程》一书中看来的,CLISP相对于SBCL的特点之一就是CLISP把Lisp编译成字节码文件(这就和Java很类似了,倍感亲切),可是也不能直接编译出机器代码,这让我这个执着于汇编与C语言的感觉非常不爽,想到以前在《Python核心编程》上看到的"sh-bang",灵机一动,居然还真行得通!下面看一个例子就明白了:
(1)Lisp文件:test.lisp
(format t "hello,Common Lisp world!~%")
(defun sqr (n)
(* n n))
(format t "the square of ~a is ~a ~%" 5 (sqr 5))
(2)编译及其他:
$clisp -c test.lisp #...略去输出... $vim test.fas
(3)用编辑器打开test.fas后在第一行加上 #!/usr/bin/clisp :
#!/usr/bin/clisp
(|SYSTEM|::|VERSION| '(20080430.))
#0Y_ #0Y |CHARSET|::|UTF-8|
#Y(#:|1 1 (FORMAT T "hello,Common Lisp world!~%")-1|
#18Y(00 00 00 00 00 00 00 00 20 01 DA 6B 01 33 01 15 19 01)
(#Y(#:|1 1 (FORMAT T "hello,Common Lisp world!~%")-1-1|
#19Y(00 00 00 00 01 00 00 00 21 17 DA AF 38 02 31 95 9E 19 03)
("hello,Common Lisp world!\n")
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
|COMMON-LISP|::|*STANDARD-OUTPUT*|)
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
#Y(#:|2 3 (DEFUN SQR (N) ...)-2|
#20Y(00 00 00 00 00 00 00 00 20 01 DA 2F 01 DA DC 32 9C C5 19 01)
(|COMMON-LISP-USER|::|SQR| |SYSTEM|::|REMOVE-OLD-DEFINITIONS|
#Y(|COMMON-LISP-USER|::|SQR|
#17Y(00 00 00 00 01 00 00 00 26 02 AD AE 33 02 39 19 02) ()
(|COMMON-LISP|::|T| |COMMON-LISP|::|NIL| |COMMON-LISP|::|NIL|)
(|COMMON-LISP-USER|::|N|) |COMMON-LISP|::|NIL| 1))
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
#Y(#:|4 4 (FORMAT T "the square of ~a is ~a ~%" ...)-3|
#22Y(00 00 00 00 00 00 00 00 20 01 DA 6B 01 DC DC 6F 03 33 03 15 19 01)
(#Y(#:|4 4 (FORMAT T "the square of ~a is ~a ~%" ...)-3-1|
#39Y(00 00 00 00 03 00 00 00 21 19 DA B1 38 02 31 95 AF B1 31 90 DB B1
38 02 31 95 AE B1 31 90 DC B1 38 02 31 95 9E 19 05)
("the square of " " is " " \n")
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
|COMMON-LISP|::|*STANDARD-OUTPUT*| 5. |COMMON-LISP-USER|::|SQR|)
(|COMMON-LISP|::|T| |COMMON-LISP|::|T| |COMMON-LISP|::|T|))
(4)下面执行chmod u+x test.fas
(5)执行./test.fas,输出如下:
$ chmod u+x test.fas
$ ./test.fas
hello,Common Lisp world!
the square of is
如果想要运行上面的例子,请确保您已经安装了clisp。
好吧,我说的根本不算是Lisp技巧,这只是大多数Shell都支持的一个特性:在第一行如果存在 #!/XXX/XXX 这样的内容,就会自动调用XXX来解释下面的内容对这个例子来说,就是用/usr/bin/clisp来解释test.lisp的字节码文件,相当于运行了clisp test.fas(但是不知为什么,感觉这样调用舒服一点),最后得吐下槽啊:“插入代码”里都支持F#、Erlang却没有Lisp族语言,Lisp莫非太小众了?
Common Lisp编译程序的小技巧的更多相关文章
- iOS开发中调试小技巧
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
- D3D9 优化小技巧
此篇文章主要讲一些小技巧,针对前面转载的D3D9 GPU Hacks,我们可以做的一些优化. 在做延迟渲染或者其它需要深度的地方使用INTZ格式的纹理,这样可以直接对纹理进行操作,节省了显存和带宽,这 ...
- ireport制作小技巧
ireport制作小技巧 首先ireport中大小写问题: 1.parameter中如果小写,引用也小写 2.$F{},一般都大写 3.子报表中引用父报表中查询出来的值时,只需要小写即可,即在子报表的 ...
- 小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET
小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET 小议common lisp程序开发流程 分类: lisp 2011-04-17 20:59 1316人阅 ...
- BizTalk开发小技巧
BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B ...
- Yii2开发小技巧
工作中或多或少会用到的关于 Yii2 的小技巧的一个总结,包括model.controller.view或者配置文件的一些写法. 模型相关 获取查询SQL $query = User::find()- ...
- Vue 使用中的小技巧
在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...
- iOS - 开发中调试小技巧
对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...
- Windows 下目录切换以及挂载小技巧
Windows 下目录切换以及挂载小技巧 一.前言: 作为几年的 Linux 老用户,再购买了一款新的本本只支持 Windows(主要是Linux下的驱动)操作系统后,加之发现 Windows 提供 ...
随机推荐
- 存储过程之七—java代码调用
一.简介 jdbc调用存储过程与调用一般的sql语句有些差别.jdbc调用一般的sql语句的时候,返回的是结果集,或是sql语句后是否执行成功的标记量.而存储过程返回的可以是结果集,输出参数.返回状态 ...
- openstack-networking-neutron(四)--iptables
Filter表:过滤数据包,默认表. (1)INPUT 链:过滤所有目标地址是本机的数据包(对进入本机数据包的过滤) (2)OUTPUT 链:过滤所有本机产生的数据包(对源地址得数据包的过滤) ( ...
- HTTP协议状态码
如果向您的服务器发出了某项请求要求显示您网站上的某个网页(例如,当用户通过浏览器访问您的网页或在检测工具抓取该网页时),那么,您的服务器会返回 HTTP 状态代码以响应该请求. 一些常见的状态代码为: ...
- matlab里.*和*的区别
*:矩阵相乘 (cross) .*:矩阵你元素一对一相乘 (dot) 例子: >> a=[2 3];>> b=[4 5];>> a*b' ans = 23 > ...
- 三星嵌入式开发平台 三星Cortex-A9 4412 POP与SCP对比
iTOP-4412核心板是迅为电子推出的一款高端四核核心板,其中分为POP封装与SCP封装,配备三星Exynos 4412四核处理器,主频为1.4GHz,内置16GB存储空间.该板设计小巧.配备三星自 ...
- 使用jsonpath解析json内容
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容.下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它. 一.首先需要 ...
- box unboxing(装箱 拆箱) C#编程指南
box(装箱)消耗大 box在堆栈中创建一个新的对象,性能消耗大 int i = 123; // Boxing copies the value of i into object o. object ...
- 如何使用AutoIT完成单机测试
下面我们来介绍如何使用AutoIT完成单机程序的自动化测试.使用AutoIT完成桌面应用程序的自动化测试,最重要的是找到识别GUI对象的方法,然后调用AutoIT函数来操纵它或读取它的属性值,并与正确 ...
- 使用 ssh 连接github的方法说明(gitub的官方说法)
https://help.github.com/articles/generating-an-ssh-key/
- CSS padding margin border属性
主要定义四个区域:内容(content).内边距(padding).边框(border)和外边距(margin) margin:层的边框以外留的空白 background-color:背景颜色 bac ...