Je cherche swipl
la fonctionnalité similaire à perl -e
En particulier, je veux exécuter le code prolog de cette façon:
swipl --wanted-flag "fact(a). message:-writeln('hello')." -g "message" -t halt
Ceci est possible à faire avec
swipl -f file -g "message" -t halt
où les clauses prolog sont écrites dans le file
Je lance swipl côté serveur qui prend les entrées utilisateur comme des clauses de prolog, par conséquent écrire un fichier sur le serveur n’est pas une bonne idée.
Une chose que vous pouvez faire est d’utiliser load_files/2
avec l’option stream
et de charger depuis l’entrée standard, pas depuis un argument (vous pouvez toujours passer le point d’entrée en argument, je suppose):
Dites dans un fichier fromstdin.pl
vous avez:
main :- load_files(stdin, [stream(user_input)]), current_prolog_flag(argv, [Goal|_]), call(Goal), halt. main :- halt(1).
et avec cela vous pouvez faire:
$ echo 'message :- format("hello~n").' | swipl -q -t main fromstdin.pl -- message |: hello
Les commentaires de @false à cette réponse et à la question vous diront ce que c’est |:
si vous vous posez la question, mais si cela vous agace, faites simplement:
$ echo 'message :- format("hello~n").' \ | swipl -q -t main fromstdin.pl -- message \ | cat hello
au lieu.
Cela vous permettra de lire n’importe quel Prolog depuis l’entrée standard et d’appeler un prédicat arbitraire. Que ce soit une chose intelligente à faire, je ne sais pas. Je ne serais pas non plus surpris s’il existe un moyen beaucoup plus facile de parvenir à la même chose.