代码之家  ›  专栏  ›  技术社区  ›  mcandre

公共Lisp等价于Haskell的主函数?

  •  7
  • mcandre  · 技术社区  · 15 年前

    哈斯克尔 main 函数只做我想做的事情:当文件被自己加载时计算(例如。 ./myfile.hs runhaskell myfile.hs )在其他任何情况下。 主要的 当文件被另一个文件导入时将不会调用。 newLISP 也有这个功能。

    是否有相同的通用Lisp代码?

    我读了 source code 对于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从不使Lisp变量引用 p->argv_execute_文件 ,因此无法辨别 myfile.lisp文件 是由REPL中的用户或其他Lisp文件直接加载的。只要 (car *args*) myfile.lisp文件 ,我的任务很简单。

    注意:如果文件是从REPL加载的,shebang会给CLISP带来麻烦,所以我将此代码放入 ~/.clisprc.lisp :

    (set-dispatch-macro-character #\# #\!
     (lambda (stream character n)
      (declare (ignore character n))
      (read-line stream nil nil t)
      nil))
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Cody Reichert Chris Ismael    10 年前

    我找到一个 solution . 这有点骗人,但确实管用。我很快会修改它,使之适用于除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)))
    
        2
  •  0
  •   Community Mohan Dere    8 年前

    (eval-when (situation*) ...)

    更新 很抱歉,答案很混乱。

    我可能错了,但似乎做不到你真正想要的。我会制作一个shell脚本并调用 clisp -i myfile.lisp -x (main) .

    是否有任何理由不使其可执行(描述 here )?

    P.S.Common Lisp是一种语言 clisp 是其中一个实现。

    推荐文章