Posterior a consultar con especialistas en este tema, programadores de deferentes ramas y maestros hemos dado con la respuesta al dilema y la plasmamos en esta publicación.
Solución:
Directiva ISO: inicialización. Esto debería funcionar.
:- initialization main.
main :-
write('Hello Worldn').
editar lo siento, me salté los detalles más interesantes. Aquí hay un script de muestra, digamos guardado en ~/test/main.pl
#!/home/carlo/bin/swipl -f -q
:- initialization main.
main :-
current_prolog_flag(argv, Argv),
format('Hello World, argv:~wn', [Argv]),
halt(0).
y hecho ejecutable con
chmod +x ~/test/main.pl
entonces obtengo
~$ ~/test/main.pl
Hello World, argv:[]
~$ ~/test/main.pl as,dnj asdl
Hello World, argv:[as,dnj,asdl]
en guión main.pl
, utilicé la ruta swipl que resulta de compilar desde el origen sin privilegios de administrador. El proceso de compilación de SWI-Prolog colocó bin y lib en ~/bin y ~/lib
Nota: el indicador -f deshabilita la carga de la inicialización ~/.plrc, y esto podría ser necesario para obtener un “control más estricto” sobre la ejecución…
Actualmente no estoy seguro de si la página de documentación está actualizada con el estado SW actual. De algún mensaje de la lista de correo, y mis propios esfuerzos para reutilizar thea, parece que las banderas de la línea de comando cambiaron recientemente…
La otra respuesta es más o menos correcta, sin embargo, la forma en que funciona puede depender de su sistema operativo. La forma más portátil de hacerlo es, aparentemente:
$ cat example.pl
#!/path/to/your/swipl
:- set_prolog_flag(verbose, silent).
:- initialization main.
main :-
format('Example script~n'),
current_prolog_flag(argv, Argv),
format('Called with ~q~n', [Argv]),
halt.
main :-
halt(1).
La diferencia aquí es que no hay nada en la línea shebang además de la ruta a swipl. Todo lo demás se hace usando directivas. en mi sistema operativo, solo eso funciono!
$ chmod u+x example.pl
$ example.pl foo bar baz
Example script
Called with [foo,bar,baz]
EDITAR
Probablemente sea más limpio eliminar la línea shebang por completo y, en su lugar, ejecutar desde la línea de comando:
$ swipl -s example.pl -- foo bar baz
Example script
Called with [foo,bar,baz]
Nuevamente, usando una directiva para establecer main/0
ya que el objetivo de inicialización le evita tener que hacer esto explícitamente en la línea de comando. Vocación swipl
desde la línea de comandos, por otro lado, le permite a su sistema operativo encontrar dónde está el ejecutable, en lugar de codificar esta información en el script.
Puedes usar initialization/2
.
#!/path/to/swipl -q
:- initialization(main, program).
main :-
write("Hello"), nl,
halt.
Razón fundamental:
-
-q
(--quiet
) se utiliza para suprimir todos los mensajes informativos, incluidos los mensajes informativos que se originan en el archivo de inicialización de SWI-Prolog (~/.swiplrc
).:- set_prolog_flag(verbose, silent).
podría usarse en su lugar, pero no suprime los mensajes informativos que provienen del archivo de inicialización. -
:- initialization(main, program).
–program
hace que Prolog salga con un código de error al fallarmain
o al encontrar una excepción, en lugar de permanecer en el REPL. -
halt
– Detiene el programa con código de salida 0.
Lo anterior asume que desea cargar el archivo de inicialización (~/.swipl
) antes de ejecutar el programa. Si no desea cargar el archivo de inicialización, utilice #!/path/to/swipl -f -q
como el shebang. Esto hace que el script se inicie más rápido.
(Además, asegúrese de configurar el bit ejecutable (chmod +x hello.pl
) antes de ejecutar el script (./hello.pl
))
Sección de Reseñas y Valoraciones
Si para ti ha sido provechoso este post, agradeceríamos que lo compartas con más seniors de esta forma nos ayudas a dar difusión a nuestro contenido.