【问题标题】:Does Chicken Scheme have an equivalent to Perl's $0?Chicken Scheme 是否有相当于 Perl 的 $0 的功能?
【发布时间】:2011-03-04 00:46:35
【问题描述】:

如何可靠地获取 Chicken Scheme 中的脚本名称?

似乎 -ss 占用了脚本名称,因此除非我使用点斜杠来运行我的脚本,否则它是不可见的。

scriptedmain.scm:

#!/usr/bin/env csi -q

(display (command-line-arguments))
(display "\n")
(exit)

追踪:

$ ./scriptedmain.scm 
(-q ./scriptedmain.scm)
wonko:Desktop andrew$ csi -ss scriptedmain.scm 
()

【问题讨论】:

    标签: scheme command-line-arguments getmodulefilename chicken-scheme


    【解决方案1】:

    这是一个较晚的回复,因此可能对原始发帖人没有用处。但对于可能遇到此问题的任何其他人,简单的答案是使用参数:

    (program-name)
    

    这应该为所有情况返回正确的名称。 Docs here.

    【讨论】:

    • 迟到总比不到好。谢谢老兄!
    • 我的最新版本适用于除编译之外的所有情况。出于某种原因,它就坐在那里。
    • @mcandre :不确定您所说的“除已编译的所有情况”是什么意思。我在下面查看了您的示例 scriptedmain.scm - 带有程序名称,它可以用作解释脚本或编译的本机可执行文件。顺便说一句,我不会打扰那个脚手架(bash -> csi)。它不是真的需要#!/usr/bin/env chicken-scheme #!/usr/bin/csi -s
    • 顺便说一句,我不会打扰那个脚手架(bash -> csi)。它并不是真正需要的。把它放在你的 ~/.csirc 中: (register-feature!'in-repl) 用以下之一开始你的脚本:#!/usr/bin/env chicken-scheme #!/usr/bin/csi -s 然后用它们结束以下块: (cond-expand (in-repl ; do something here) (else (main (command-line-arguments)))) 现在您的代码将正常工作,无论您将文件加载到 repl 并交互式开发,通过解释器将文件作为脚本执行,或者将其编译为本机可执行文件并运行。
    • 抱歉代码格式问题。我猜 cmets 不尊重内联代码 :(
    【解决方案2】:

    (argv) 应该可以完成这项工作。示例:

    #!/usr/local/bin/csi -script
    
    (display (argv)) (newline) (exit)
    

    打印(/usr/local/bin/csi -script ./test.scm)

    【讨论】:

    • 几乎!您必须为使用 csc 编译脚本的特殊情况添加代码;那么程序是 (list-ref (argv) 0)。
    • “脚本”是指“未编译”。还有其他解决方案可以区分解释程序和编译程序。
    【解决方案3】:

    scriptedmain.scm 将在以下情况下运行(main)并打印程序名称:

    从解释器运行:

    csi -ss scriptedmain.scm
    

    使用 shebangs 从解释器运行:

    ./scriptedmain.scm
    

    编译:

    csc -o scriptedmain scriptedmain.scm
    ./scriptedmain
    

    添加到GitHub

    #!/bin/sh
    #|
    exec csi -ss $0 ${1+"$@"}
    exit
    |#
    
    (define (main)
        (display (format "Program: ~a\n" (program-name)))
        (exit))
    
    (if (not (equal? (program-name) "csi"))
        (main))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-18
      • 2023-03-31
      • 1970-01-01
      • 2014-04-02
      • 2019-10-31
      • 1970-01-01
      • 2020-03-22
      • 2012-08-02
      相关资源
      最近更新 更多