[英]Common Lisp equivalent to Haskell's main function?
Haskell的main
功能正是我想要的:評估文件何時被自己加載(例如./myfile.hs
或runhaskell myfile.hs
),而不是其他情況。 當文件由另一個文件導入時,不會調用main
。 newLISP也具有此功能。
Common Lisp有相同的代碼嗎?
我閱讀了CLISP的源代碼 。 以下是用戶輸入clisp myfile.lisp
或./myfile.lisp
時發生的情況:
myfile.lisp
保存為p->argv_execute_file
。 (LOAD "p->argv_execute_file")
並將其推送到Lisp堆棧。 *args*
。 CLISP從不使用引用p->argv_execute_file
的Lisp變量,因此無法識別myfile.lisp
是由用戶在REPL中直接加載還是由另一個Lisp文件加載。 如果只有(car *args*)
是myfile.lisp
,我的任務就很容易了。
注意:如果從REPL加載文件,Shebangs會給CLISP帶來麻煩,所以我把這段代碼放在~/.clisprc.lisp
:
(set-dispatch-macro-character #\# #\!
(lambda (stream character n)
(declare (ignore character n))
(read-line stream nil nil t)
nil))
我找到了解決方案 。 這有點狡猾,但它確實有效。 我很快就會將其修改為CLISP以外的CL實現。
#!/bin/sh
#|
exec clisp -q -q $0 $0 ${1+"$@"}
exit
|#
;;; Usage: ./scriptedmain.lisp
(defun main (args)
(format t "Hello World!~%")
(quit))
;;; With help from Francois-Rene Rideau
;;; http://tinyurl.com/cli-args
(let ((args
#+clisp ext:*args*
#+sbcl sb-ext:*posix-argv*
#+clozure (ccl::command-line-arguments)
#+gcl si:*command-args*
#+ecl (loop for i from 0 below (si:argc) collect (si:argv i))
#+cmu extensions:*command-line-strings*
#+allegro (sys:command-line-arguments)
#+lispworks sys:*line-arguments-list*
))
(if (member (pathname-name *load-truename*)
args
:test #'(lambda (x y) (search x y :test #'equalp)))
(main args)))
(eval-when (situation*) ...)
更新混淆答案抱歉。
我可能是錯的,但似乎不可能完全按照你的意願行事。 我會創建一個shell腳本並調用clisp -i myfile.lisp -x (main)
。
有沒有理由不讓它可執行( 這里描述)?
PS Common Lisp是一種語言, clisp
是其中一種實現方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.