Common Lisp编译程序的小技巧

  这几天开始玩Common Lisp,遇上了一个有意思的问题,CL一般是解释运行,也有实现可以编译生成字节码(fas文件)。我正在用的两种CL实现是SBCL和CLISP,前者是我从《实用Common Lisp编程》一书中看来的,CLISP相对于SBCL的特点之一就是CLISP把Lisp编译成字节码文件(这就和Java很类似了,倍感亲切),可是也不能直接编译出机器代码,这让我这个执着于汇编与C语言的感觉非常不爽,想到以前在《Python核心编程》上看到的"sh-bang",灵机一动,居然还真行得通!下面看一个例子就明白了:

  (1)Lisp文件:test.lisp

1 (format t "hello,Common Lisp world!~%")
2 (defun sqr (n)
3      (* n n))
4 (format t "the square of ~a is ~a ~%" 5 (sqr 5))

  (2)编译及其他:

1 $clisp -c test.lisp
2 
3 #...略去输出...
4 
5 $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,输出如下:

1 $ chmod u+x test.fas 
2 $ ./test.fas 
3 hello,Common Lisp world!
4 the square of 5 is 25 

  如果想要运行上面的例子,请确保您已经安装了clisp。

  好吧,我说的根本不算是Lisp技巧,这只是大多数Shell都支持的一个特性:在第一行如果存在 #!/XXX/XXX 这样的内容,就会自动调用XXX来解释下面的内容对这个例子来说,就是用/usr/bin/clisp来解释test.lisp的字节码文件,相当于运行了clisp test.fas(但是不知为什么,感觉这样调用舒服一点),最后得吐下槽啊:“插入代码”里都支持F#、Erlang却没有Lisp族语言,Lisp莫非太小众了?

posted @   Chaobs  阅读(3013)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2014-07-19 MinGW安装图文教程以及如何配置C语音编程环境
2014-07-19 Delphi实例之橡皮筋画图的实现
2014-07-19 Delphi实例之绘制正弦函数图像
2014-07-19 Delphi实例之一个较复杂的记事本的实现
点击右上角即可分享
微信分享提示