Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scripting 公共Lisp等价于Haskell';它的主要功能是什么?_Scripting_Haskell_Common Lisp_Main - Fatal编程技术网

Scripting 公共Lisp等价于Haskell';它的主要功能是什么?

Scripting 公共Lisp等价于Haskell';它的主要功能是什么?,scripting,haskell,common-lisp,main,Scripting,Haskell,Common Lisp,Main,Haskell的main函数正是我想要的:在文件自身加载时进行评估(例如/myfile.hs或runhaskell myfile.hs),而不是在其他情况下main。也有这个功能 公共Lisp是否有等效的代码 我为CLISP读了这本书。下面是当用户输入clisp myfile.lisp或/myfile.lisp时发生的情况: (set-dispatch-macro-character #\# #\! (lambda (stream character n) (declare (ignore

Haskell的
main
函数正是我想要的:在文件自身加载时进行评估(例如
/myfile.hs
runhaskell myfile.hs
),而不是在其他情况下<当文件由另一个文件导入时,不会调用code>main。也有这个功能

公共Lisp是否有等效的代码

我为CLISP读了这本书。下面是当用户输入
clisp myfile.lisp
/myfile.lisp
时发生的情况:

(set-dispatch-macro-character #\# #\!
 (lambda (stream character n)
  (declare (ignore character n))
  (read-line stream nil nil t)
  nil))
  • CLISP将
    myfile.lisp
    另存为
    p->argv\u execute\u文件
  • CLISP创建表达式
    (加载“p->argv\u execute\u file”)
    ,并将其推送到Lisp堆栈上
  • CLISP将任何其他命令行参数保存在列表中
  • CLISP将参数存储在Lisp变量
    *args*
  • CLISP从不使Lisp变量引用
    p->argv\u execute\u file
    ,因此无法辨别
    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))
    
    (在(情况*)时评估…)

    更新很抱歉给您带来了困惑的答案

    我可能错了,但似乎不可能完全按照你的意愿去做。我将制作一个shell脚本并调用
    clisp-imyfile.lisp-x(main)

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

    p.S.Common Lisp是一种语言,
    clisp
    是实现之一。

    我发现了一个。这有点像骗局,但确实有效。我将很快修改它,以用于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)))
    

    :load toplevel仅在代码编译时起作用,并且:execute在加载文件时调用main,这不是所需的功能。@mcandre
    :load toplevel
    在加载文件时起作用,但其他一切都是正确的,我将更新答案,谢谢。clisp-I myscript.cl不能像shebang那样工作。此外,clisp在加载脚本时不允许使用-x参数。但无论如何还是要感谢:)为什么需要与主函数等效的函数?