这几天开始玩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编译程序的小技巧的更多相关文章

  1. iOS开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  2. D3D9 优化小技巧

    此篇文章主要讲一些小技巧,针对前面转载的D3D9 GPU Hacks,我们可以做的一些优化. 在做延迟渲染或者其它需要深度的地方使用INTZ格式的纹理,这样可以直接对纹理进行操作,节省了显存和带宽,这 ...

  3. ireport制作小技巧

    ireport制作小技巧 首先ireport中大小写问题: 1.parameter中如果小写,引用也小写 2.$F{},一般都大写 3.子报表中引用父报表中查询出来的值时,只需要小写即可,即在子报表的 ...

  4. 小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET

    小议common lisp程序开发流程 - Ever 17 - 博客频道 - CSDN.NET 小议common lisp程序开发流程 分类: lisp 2011-04-17 20:59 1316人阅 ...

  5. BizTalk开发小技巧

    BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B ...

  6. Yii2开发小技巧

    工作中或多或少会用到的关于 Yii2 的小技巧的一个总结,包括model.controller.view或者配置文件的一些写法. 模型相关 获取查询SQL $query = User::find()- ...

  7. Vue 使用中的小技巧

    在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1.多图表resize事件去中心化 ...

  8. iOS - 开发中调试小技巧

    对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不同语言.不同IDE.不同平台的 ...

  9. Windows 下目录切换以及挂载小技巧

    Windows 下目录切换以及挂载小技巧 一.前言: 作为几年的 Linux 老用户,再购买了一款新的本本只支持 Windows(主要是Linux下的驱动)操作系统后,加之发现 Windows 提供 ...

随机推荐

  1. oracle中的数值函数整理

    主要分为三块介绍(单值函数.聚合函数.列表函数) 一.单值函数(比较简单,看一遍基本也就理解记住了) 1.基本加减乘车没有什么可说的,只需要注意一点,任何值与null一起运算 ,结果都为null,因为 ...

  2. 魔改——MFC SDI程序 转换为 MDI程序

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  3. Sping mvc 环境下使用kaptcha 生成验证码

    一.kaptcha 的简介 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kap ...

  4. python基础入门

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

  5. Merge Two Sorted Lists

    Merge Two Sorted Lists https://leetcode.com/problems/merge-two-sorted-lists/ Merge two sorted linked ...

  6. The available repos for opensuse13.2

    opensuse13.2国内源和设置命令   ustc-osshttp://mirrors.ustc.edu.cn/opensuse/distribution/13.2/repo/oss/ustc-n ...

  7. AngularJS模块加载

    配置块 在模块的加载阶段,AngularJS会在提供者注册和配置的过程中对模块进行配置.在整个AngularJS的工作流中,这个阶段是唯一能够在应用启动前进行修改的部分. angular.module ...

  8. Canvas修行之黑客帝国代码雨

    既然是修行,不卖弄关子,不吊胃口,修行成果必须先晒一晒. 下图是我用canvas画的黑客帝国代码雨,想起当年看黑客帝国时,那个代码雨场景让我心旷神怡,大开脑洞,满脑子是那种三维空间,无数0和1像雨一样 ...

  9. [书目20160218]微软软件研发的奥秘:MSF精髓

    目录 第一部分 解决方案交付基础 第1章 什么是MSF,它适合你吗 2 1.1 MSF的历史和起源 2 1.2 为什么是“框架” 3 1.3 MSF有何不同 5 1.4 MSF第四版的要素 5 1.5 ...

  10. 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx

    Before the invention of book-printing, it was very hard to make a copy of a book. All the contents h ...