gpt4 book ai didi

scripting - Common Lisp 相当于 Haskell 的 main 函数?

转载 作者:行者123 更新时间:2023-12-03 06:58:33 25 4
gpt4 key购买 nike

Haskell 的 main 函数正是我想要的:评估文件何时自行加载(例如 ./myfile.hsrunhaskell myfile.hs),除此之外没有其他情况。当该文件被另一个文件导入时,main将不会被调用。 newLISP也有这个功能。

Common 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 永远不会创建引用 p->argv_execute_file 的 Lisp 变量,因此无法辨别 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))

最佳答案

我找到了solution 。这有点像 shell 技巧,但它确实有效。我很快就会修改它以适用于 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)))

关于scripting - Common Lisp 相当于 Haskell 的 main 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com