Python的if __name__=="__main__"惯用语在GNU Smalltalk中如何使用?

9

这种事情存在吗?

Ruby:

(注:Ruby是一种编程语言)
if __FILE__ == $0
    main
end

Perl:

unless(caller) {
    main;
}

Lua:

if type(package.loaded[(...)]) ~= "userdata" then
    main(arg)
else
    module(..., package.seeall)
end

6
也许,可以询问真正想要的是什么,而不是展示如何在其他语言中获得预期行为 - user166390
1
期望的内容:main 函数的语法,它在被其他代码导入时不会运行。换句话说,Python 中的 if __name__=="__main__" - mcandre
2
与语言无关的等效方法:创建另一个模块/文件,调用其他模块/文件中的“main”函数,导入前者并调用后者。 - Rosh Oxymoron
Igor,我同意。Smalltalk的特权是在VM内的GUI窗口中评估表达式。对于Squeak和Pharo来说,要实现Python等行为似乎几乎不可能。但对于GST来说,如果可以访问当前代码的文件名,则肯定是可能的。当代码不是在GUI中运行而是在Bash中运行时(例如$ gst hash_lib.st),包括命令行界面非常有用,同时允许其他代码($ gst md5.st)导入前者的代码而不运行其主函数。 - mcandre
3
我认为,mcandre 想知道如何将代码添加到库中,这些代码仅在单独运行库(而非被包含在其他代码中)时才会执行。 - przemo_li
显示剩余2条评论
1个回答

1

利用奇特的多行 shebang 和 argv 技巧就能完成工作。

请参见 Rosetta Code

scriptedmain.st:

"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.
].

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接