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莫非太小眾了?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM