Есть ли у Factor многострочные шебанги? - PullRequest
0 голосов
/ 20 августа 2011

Common Lisp имеет многострочные шебанги:

#!/bin/bash
#|
exec clisp -q -q $0 $0 ${1+"$@"}
exit
|#

Это позволяет выполнять более сложные операции внутри шебанга.CLISP - один из немногих языков, в котором имя скрипта отсутствует в ARGV.Здесь имя сценария принудительно отправляется дважды в CLISP, чтобы скрипт Lisp мог получить доступ к своему имени сценария через ARGV.

Есть ли способ сделать это в Factor, чтобы сработало следующее?

$ cat ios7crypt.factor 
#! /usr/bin/env factor

USING: kernel namespaces io prettyprint ;
IN: ios7crypt

: usage ( -- )
    "Usage: ios7crypt.factor [options]" print
    "-encrypt <password>" print
    "-decrypt <hash>" print
    "-test" print
    "-help" print ;

: main ( -- ) "help" get . ;

MAIN: main

$ ./ios7crypt.factor
f

$ ./ios7crypt.factor -help
f

В приведенной выше строке должно быть напечатано t, но Factor игнорирует -help, так как оно было указано после имени сценария.

$ factor ios7crypt.factor 
f

$ factor -help ios7crypt.factor 
t

Это работает, поскольку -help было отправлено до имени сценария../ios7crypt.factor -help тихо падает -help, потому что Шебанг расширяется до factor ios7crypt.factor -help.К сожалению, для Factor, по-видимому, требуются все параметры командной строки перед именем сценария.

Есть ли многострочный шебанг, перекрывающий это поведение?

1 Ответ

0 голосов
/ 20 августа 2011

Параметры командной строки, отправленные сценарию, не анализируются автоматически. Нужно вручную отправить их парсеру.

$ cat args.factor 
#! /usr/bin/env factor

USING: namespaces command-line prettyprint ;
IN: args

: main ( -- )
    command-line get parse-command-line
    "a" get .
    "b" get .
    "c" get .
    ;

MAIN: main

Пример:

$ ./args.factor -a -b=banana
t
"banana"
f
...