Как мне получить текущий модуль / скрипт / имя файла в GNU Smalltalk? - PullRequest
2 голосов
/ 06 августа 2011

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 .

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Вы можете спросить текущий метод, откуда он взялся: thisContext method methodSourceFile printNl.

1 голос
/ 08 августа 2011

Кажется, что лучшее, что можно сделать, это использовать 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.
]
...