How do I execute a .scm script (outside of the REPL) with MIT-Scheme?
Asked Answered
F

4

57

I want to type something like 'scheme file.scm' and have it interpret the file, and then take me back to my shell, rather than loading it in the REPL.

edit: I tried scheme < test.scm and it still uses the REPL, the only difference is that scheme exits when the stream ends.

Furbelow answered 24/5, 2009 at 15:13 Comment(0)
P
51

scheme < file.scm should work (as long as you don't specify --interactive and stdin is not a terminal, scheme works non-interactively).

Percaline answered 24/5, 2009 at 15:20 Comment(1)
This doesn't fulfill the OP's edited requirement of "not using the REPL". See this answer.Czarist
C
17

To run a scheme program using MIT Scheme:

scheme --quiet < program.scm

The --quiet option ensures that the output from your program is the only thing that is displayed (i.e. you won't see the REPL, as per your requirements).

Caveat: This will not work if your program prompts the user for input using the input procedures (e.g. read, read-char, read-line, etc.). This is because of the shell input redirection (<) (See: relevant question). Unfortunately, there is currently no proper way of executing an MIT Scheme script from the command line when input procedures are used. The best option is probably mit-scheme --quiet --load 'myscript', but you'd have to manually exit MIT Scheme when the script finishes. Relevant mailing list thread: [MIT-Scheme-devel] How to run a script and exit?

EDIT: Due to the possibility that you may mistype < as >, resulting in the overwrite of your source code, I would suggest encapsulating the above command within a shell script or a shell function. For example:

runscheme () {
    scheme --quiet < "$1"
}

Then you can run runscheme program.scm without fear that your source code will be overwritten. (Special thanks to Paul Rooney for bringing this potential mistake to my attention).

References

scheme --help:

--batch-mode, --quiet, --silent

Suppresses the startup report of versions and copyrights, and the valediction.

This command line option seems to have been mistakenly ommitted from the list of command line options in the documentation, but I think this is a legimate command line option because scheme --help shows it, and because --batch-mode is used in other parts of the reference manual (e.g. here).

Czarist answered 9/12, 2017 at 2:54 Comment(5)
don't get the < the wrong way around or you will overwrite your own source code, or is it only me that does stuff like that?Cactus
@PaulRooney If you tend to make such mistakes, I would suggest writing a shell script or shell function for running your Scheme programs. Example shell function: runscheme () { scheme --quiet < "$1" }.Czarist
ok thank you. I dont tend to make such mistakes too often. Sorry it was not a criticism of the answer. I just did it and it made me laugh when I realised what had happened.Cactus
@PaulRooney Edited the answer so that others can avoid such mistakes in the future. Thank you for bringing this to my attention.Czarist
sorry I really didnt intend for you to change the answer. I just thought it was amusing. I would upvote, but I did that already.Cactus
G
8

I think what you want is SCM. You can execute a .scm script like this:

$ scm -f foo.scm arg1 arg2 arg3

See http://people.csail.mit.edu/jaffer/scm_3.html#SEC28 for more details.

The SCM homepage: http://people.csail.mit.edu/jaffer/SCM

Goldoni answered 13/4, 2011 at 9:21 Comment(2)
Strange thing, but it doesn't work without -f for me. Note this, guys.Bootless
The question is about MIT Scheme, and not about SCM.Czarist
D
0

checked chez --help, and then I found this(let's say that I'm using chez scheme):

chez --script ./temp.scm

Also, --verbose is very useful:

chez --verbose --script ./temp.scm
Daisy answered 21/12, 2017 at 19:57 Comment(1)
The question is about MIT Scheme, and not about Chez Scheme.Czarist

© 2022 - 2024 — McMap. All rights reserved.