簡體   English   中英

Common Lisp相當於Haskell的主要功能?

[英]Common Lisp equivalent to Haskell's main function?

Haskell的main功能正是我想要的:評估文件何時被自己加載(例如./myfile.hsrunhaskell myfile.hs ),而不是其他情況。 當文件由另一個文件導入時,不會調用main newLISP也具有此功能。

Common Lisp有相同的代碼嗎?

我閱讀了CLISP的源代碼 以下是用戶輸入clisp myfile.lisp./myfile.lisp時發生的情況:

  1. CLISP將myfile.lisp保存為p->argv_execute_file
  2. CLISP創建表達式(LOAD "p->argv_execute_file")並將其推送到Lisp堆棧。
  3. CLISP將任何其他命令行參數保存在列表中。
  4. CLISP將參數存儲在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM