【问题标题】:How do I get the current module/script/file name in GNU Smalltalk?如何在 GNU Smalltalk 中获取当前模块/脚本/文件名?
【发布时间】:2011-08-05 23:47:11
【问题描述】:

GNU Smalltalk 省略了 argv 中的脚本名称。

#!/usr/bin/env gst -f

| argv program |

argv := Smalltalk arguments.

(argv size) > 0 ifTrue: [
    program := argv at: 1.

    Transcript show: 'Program: ', program; cr.
] ifFalse: [
    Transcript show: 'argv = {}'; cr.
]

$ ./scriptname.st
argv = {}

我看到了两种获取脚本名称的方法:

  • 跟踪一些 Smalltalk 方法,该方法返回类似于 Perl 的变量 $0 的脚本名称。
  • 跟踪多行 shebang 的语法并强制 GST 提供脚本名作为 argv 的第一个成员。这是Common Lisp 中的一个示例。

【问题讨论】:

  • 将您的问题发布到 GNU Smalltalk 邮件列表中,您很可能会从实施 GST smalltalk.gnu.org/community/ml的人员的知识和经验中受益。

标签: filenames smalltalk gnu-smalltalk


【解决方案1】:

似乎最好的办法是使用shebangs将脚本名称强制为ARGV,然后检查Smalltalk getArgv: 1是否以硬编码字符串结尾。

张贴在这里和Rosetta Code。

"exec" "gst" "-f" "$0" "$0" "$@"
"exit"

Object subclass: ScriptedMain [
    ScriptedMain class >> meaningOfLife [ ^42 ]
]

| main |

main := [
    Transcript show: 'Main: The meaning of life is ', ((ScriptedMain meaningOfLife) printString); cr.
].

(((Smalltalk getArgc) > 0) and: [ ((Smalltalk getArgv: 1) endsWith: 'scriptedmain.st') ]) ifTrue: [
    main value.
]

【讨论】:

    【解决方案2】:

    你可以询问当前方法是从哪里来的:thisContext method methodSourceFile printNl。

    【讨论】:

    • 这很有帮助,但它不适用于 scriptedmain (rosettacode.org/wiki/ScriptedMain#Smalltalk),因为它不会告诉您哪个文件是使用 gst somefile.st 运行的。
    • 感谢您加入 GNU Smalltalk 邮件列表。当我用 Google 搜索我的新手问题时,我经常看到您在邮件列表存档中提出相同的问题。
    猜你喜欢
    • 2011-05-12
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2017-09-09
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多