Common Lisp编译程序的小技巧
2015-07-19 21:03
218 查看
这几天开始玩Common Lisp,遇上了一个有意思的问题,CL一般是解释运行,也有实现可以编译生成字节码(fas文件)。我正在用的两种CL实现是SBCL和CLISP,前者是我从《实用Common Lisp编程》一书中看来的,CLISP相对于SBCL的特点之一就是CLISP把Lisp编译成字节码文件(这就和Java很类似了,倍感亲切),可是也不能直接编译出机器代码,这让我这个执着于汇编与C语言的感觉非常不爽,想到以前在《Python核心编程》上看到的"sh-bang",灵机一动,居然还真行得通!下面看一个例子就明白了:
(1)Lisp文件:test.lisp
(2)编译及其他:
(3)用编辑器打开test.fas后在第一行加上 #!/usr/bin/clisp :
(4)下面执行chmod u+x test.fas
(5)执行./test.fas,输出如下:
如果想要运行上面的例子,请确保您已经安装了clisp。
好吧,我说的根本不算是Lisp技巧,这只是大多数Shell都支持的一个特性:在第一行如果存在 #!/XXX/XXX 这样的内容,就会自动调用XXX来解释下面的内容对这个例子来说,就是用/usr/bin/clisp来解释test.lisp的字节码文件,相当于运行了clisp test.fas(但是不知为什么,感觉这样调用舒服一点),最后得吐下槽啊:“插入代码”里都支持F#、Erlang却没有Lisp族语言,Lisp莫非太小众了?
(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 5 is 25
如果想要运行上面的例子,请确保您已经安装了clisp。
好吧,我说的根本不算是Lisp技巧,这只是大多数Shell都支持的一个特性:在第一行如果存在 #!/XXX/XXX 这样的内容,就会自动调用XXX来解释下面的内容对这个例子来说,就是用/usr/bin/clisp来解释test.lisp的字节码文件,相当于运行了clisp test.fas(但是不知为什么,感觉这样调用舒服一点),最后得吐下槽啊:“插入代码”里都支持F#、Erlang却没有Lisp族语言,Lisp莫非太小众了?
相关文章推荐
- 加速计
- onClick和onclientclick区别
- sqlite 启用事务
- 迅雷下载Android SDK
- Pascal’sTriangleII
- 关于最小生成树算法的理解
- 关于CSS和CSS3中一些注意事项1
- CSU 1021 B(Contest #3)
- 蓝牙4.0实现及原理
- 起点
- springmvc: bindException 的single-type-import已定义具有相同简名的类型
- java基础知识—java集合总结
- mui 搜索框图标左对齐
- 桶排序 O(n) 线性时间
- 物理仿真
- Arduino初探:让 Arduino 闪起来
- ios 距离传感器和摇一摇
- Java读取txt文件赋值到StringBuffer里
- C++快速排序总结
- VMware装XP