home *** CD-ROM | disk | FTP | other *** search
- Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!news2.telebyte.nl!fr.ip.ndsoftware.net!newsfeed.freenet.de!eusc.inter.net!news.imp.ch!news.imp.ch!80.83.46.147.MISMATCH!news.alphanet.ch!alphanet.ch!not-for-mail
- From: schinz@alphanet.ch (Michel Schinz)
- Newsgroups: comp.lang.scheme.scsh,comp.lang.scheme,comp.answers,news.answers
- Subject: Scsh (a Unix Scheme shell) FAQ
- Supersedes: <scsh-faq-1-1081841402@alphanet.ch>
- Followup-To: comp.lang.scheme.scsh
- Date: Thu, 13 May 2004 07:30:02 +0000 (UTC)
- Organization: Alphanet NF
- Lines: 976
- Approved: news-answers-request@MIT.EDU
- Distribution: world
- Expires: Thu, 17 Jun 04 09:30:02 MET
- Message-ID: <scsh-faq-1-1084433402@alphanet.ch>
- Reply-To: schinz@alphanet.ch (Michel Schinz)
- NNTP-Posting-Host: localhost
- X-Trace: shakotay.alphanet.ch 1084433404 8850 127.0.0.1 (13 May 2004 07:30:04 GMT)
- X-Complaints-To: usenet@alphanet.ch
- NNTP-Posting-Date: Thu, 13 May 2004 07:30:04 +0000 (UTC)
- Summary: This posting describes scsh, a Unix shell that uses Scheme
- as its scripting language and has a full Posix interface,
- string manipulation functions, high-level network support
- and more.
- Keywords: Scheme shell Unix programming script Posix network
- Xref: senator-bedfellow.mit.edu comp.lang.scheme.scsh:3732 comp.lang.scheme:59725 comp.answers:57138 news.answers:271214
-
- Posted-By: auto-faq 3.3 (Perl 5.006)
- Archive-name: unix-faq/shell/scsh-faq
- Posting-Frequency: monthly
- URL: http://www-internal.alphanet.ch/~schinz/scsh-faq.html
-
- Frequently Asked Questions
- **************************
-
- This is the scsh Frequently Asked Questions list of 14 March 2004.
-
- This article is provided as is without any express or implied
- warranties. While every effort has been taken to ensure the accuracy of
- the information contained in this article, the maintainer assumes no
- responsibility for errors or omissions, or for damages resulting from
- the use of the information contained herein.
-
- Meta-questions
- **************
-
- This section contains questions and answers about this FAQ, its
- authors, etc.
-
- What is the aim of this FAQ?
- ============================
-
- The aim of this FAQ is to provide some help and documentation to
- people interested in scsh, a Unix shell that uses Scheme as its
- scripting language. It is mainly aimed towards those who do not know
- much about scsh or Scheme. This explains why some questions that might
- seem trivial to the seasoned Scheme programmer are included anyway.
-
- Who wrote this FAQ?
- ===================
-
- Most of the FAQ was written and is still maintained by Michel Schinz
- (<schinz@alphanet.ch>) and Eric Marsden (<emarsden@laas.fr>). To send
- mail about the FAQ in general, please do not use these personal
- addresses, but the alias mentioned below (*note Contact::).
-
- What was changed recently in this FAQ?
- ======================================
-
- Here is a list of recent changes. The name of the person who
- suggested the change (either explicitly by sending a mail, or
- implicitly by posting in the newsgroup) is mentioned in parentheses.
-
- 1. 2000/02/29 v2.16 language comparisons, example error handler,
- mention guile-scsh.
-
- 2. 2000/08/28 v2.17 binary RPMs for linux distributions, s48.org.
-
- 3. 2000/09/05 v2.18 Olin Shivers' e-mail/web page location updated,
- authors section added, history shortened, regexp section updated.
-
- 4. 2000/12/22 v2.19 win32 binaries
-
- 5. 2001/01/15 v2.20 HTML versions of the scsh manual/paper mentioned
- (Dorai Sitaram).
-
- 6. 2001/05/28 v2.21 building on MacOS X, Sourceforge site.
-
- 7. 2001/06/08 v2.22 scsh version 0.5.3 released.
-
- 8. 2001/06/14 v2.23 section about the guile port updated (Paul
- Emsley).
-
- 9. 2001/07/02 v2.24 Matthias Radestock's Scheme FAQ mentioned, URL for
- R5RS updated.
-
- 10. 2001/09/06 v2.25 fix Wily URL (Bengt Kleberg)
-
- 11. 2001/10/19 v2.26 added Martin Gasbichler among the scsh authors,
- referenced his bugs page.
-
- 12. 2002/01/10 v2.27 updates for the 0.6 release, http://www.scsh.net,
- Mike Sperber added among the authors.
-
- 13. 2002/02/04 v2.28 improved perl code, thanks to John W. Krahn.
-
- 14. 2002/02/26 v2.29 minor update for scsh 0.6.1.
-
- 15. 2002/03/20 v2.30 Python example corrected (Beni Cherniavksy)
-
- 16. 2002/05/20 v2.31 minor update for scsh 0.6.2.
-
- 17. 2002/05/24 v2.32 URL for Windows binary updated (Reini Urban)
-
- 18. 2002/06/21 v2.33 Mentioned Cash (partial scsh port to OCaml).
-
- 19. 2002/08/16 v2.34 Fix exception-handling example, include OpenBSD in
- the list of supported platforms, update the FreeBSD ports
- information.
-
- 20. 2002/12/17 v2.35 Rewrote the part about MzScheme (Paul Steckler)
-
- 21. 2003/01/13 v2.36 minor update for scsh 0.6.3.
-
- 22. 2003/02/12 rewrote part comparing scsh with other scripting
- languages (Yoann Padioleau), added Ruby script, updated scsh
- license, removed reference to CIG, dropped version numbers for
- this FAQ.
-
- 23. 2003/02/14 removed broken and outdated link to notes on the scsh
- Web sever, added reference to the "new" Scheme 48 documentation
- (Michael Sperber), changed home pages of Rees and Kelsey.
-
- 24. 2003/02/18 corrected scsh example script to include dot files
- (Sriram Thaiyar).
-
- 25. 2003/03/13 added reference to Sunterlib (Anthony Carrico).
-
- 26. 2003/04/22 minor update for scsh 0.6.4.
-
- 27. 2003/10/03 updated Brian Carlstrom's web page.
-
- 28. 2003/11/02 added links to the archives of the newsgroup and the
- mailing list (Brian Carlstrom).
-
- 29. 2003/12/01 minor update for scsh 0.6.5.
-
- 30. 2004/02/29 finally mention the death of c.l.s.scsh
-
- 31. 2004/03/14 mention problems with scsh 0.6.x and Ultrix (Brian
- Carlstrom)
-
- Where do I get the latest version of this FAQ?
- ==============================================
-
- The latest version of the FAQ can be found at the "scsh FAQ
- home-page":
- http://www-internal.alphanet.ch/~schinz/scsh-faq.html
-
- This home-page contains three versions of this FAQ: an ASCII
- version, an HTML version and an Info version. If you have access to
- the World Wide Web, I strongly recommend that you get the HTML version,
- since all the hyperlinks can be followed just by clicking on them.
-
- Apart from that, this document is posted on the 13th of each month to
- the newsgroups `comp.lang.scheme.scsh', `comp.lang.scheme',
- `comp.answers' and `news.answers'.
-
- Where do I send comments about this FAQ?
- ========================================
-
- Comments about this FAQ should be sent to the following address:
- <scsh-faq@alphanet.ch>.
-
- Please help us in producing a useful document by sending suggestions
- and material for this FAQ. If you find stylistic, grammatical or syntax
- errors, please also report them.
-
- General
- *******
-
- This section contains general questions about scsh: what it is,
- where to find it, etc.
-
- What is scsh?
- =============
-
- Scsh is a Scheme shell. That is, it is a Unix shell which uses Scheme
- as its scripting language. It was designed and written by Olin Shivers,
- Brian Carlstrom, Martin Gasbichler and Mike Sperber, and is built on
- top of Scheme 48, an implementation of Scheme written by Jonathan Rees
- and Richard Kelsey.
-
- Scsh currently includes the following features:
-
- - A complete Posix interface.
-
- - A very complete support for networking, with high and low level
- interfaces. An additional network package, including an HTTP
- server, SMTP support, etc. is also available separately.
-
- - Powerful string manipulation functions: pattern matching, file-name
- manipulations, etc.
-
- - AWK-like macros.
-
- - An s-expression-based notation for regular expressions (SREs).
-
- - Threads.
-
- However, it is currently aimed primarily at scripting use, rather
- than interactive use (*note Interactive scsh::).
-
- How do you pronounce scsh?
- ==========================
-
- According to Olin, scsh is pronounced "skishhhh" (it rhymes with
- "fish").
-
- What is the current version of scsh?
- ====================================
-
- The current version (as of 14 March 2004) is 0.6.5.
-
- What are the licensing terms for scsh?
- ======================================
-
- Scsh is distributed under a BSD-like open source licence. Here are
- the exact terms, which can be found in the file `COPYING' of the
- distribution:
-
- Copyright (c) 1993-2002 Richard Kelsey and Jonathan Rees Copyright
- (c) 1994-2002 by Olin Shivers and Brian D. Carlstrom. Copyright
- (c) 1999-2002 by Martin Gasbichler. Copyright (c) 2001-2002 by
- Michael Sperber.
-
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met: 1. Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer. 2. Redistributions in binary form must reproduce the
- above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other
- materials provided with the distribution. 3. The name of the
- authors may not be used to endorse or promote products derived
- from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Previous to version 0.5.2 scsh was distributed under a more
- restrictive licence.
-
- What is Scheme?
- ===============
-
- Scheme is a small and elegant programming language of the Lisp
- family, originally designed by Guy Lewis Steele Jr. and Gerald Jay
- Sussman. It includes powerful features like first-class procedures and
- continuations, and is statically scoped (like Pascal). For more
- information, refer to the Scheme FAQ (*note Getting the docs::).
-
- What is Scheme 48?
- ==================
-
- Scheme 48 is a small and portable Scheme implementation written by
- Jonathan Rees and Richard Kelsey. It is based on a virtual machine
- architecture (i.e. it does not compile to native code).
-
- Scheme 48 implements all the features described in R5RS (*note
- Getting the docs::) and some extensions like exceptions and a module
- system.
-
- How does scsh compare to other common scripting languages?
- ==========================================================
-
- Many scripting languages are in use today, and comparing scsh with
- all of them would be impossible. Here, we therefore restrict ourselves
- to the following three popular scripting languages: Perl, Python and
- Ruby. Below, they will be collectively referred to as PP&R.
-
- To simplify the comparison, it will be split in three parts: first we
- will look at the programming languages themselves, that is the
- abstractions they offer to the programmer; then, we will look at the
- implementation(s) of these languages; finally, we will look at the
- (standard) libraries available for these different languages.
-
- Underlying programming languages
- --------------------------------
-
- From a programming language perspective, scsh is different than PP&R
- in that it is based on a general-purpose programming language, namely
- Scheme. PP&R, on the other hand, were all designed to be scripting
- languages originally. Today many people use them for relatively large
- applications which do not qualify as scripts, but scripts were the
- primary target of these languages. This sometimes shows in their
- design, for example when it comes to variable declarations which are by
- default optional in PP&R but not in Scheme.
-
- Scheme is also special in that it is a functional programming
- language, whereas Python and Ruby are object-oriented and Perl is
- procedural (even though most modern Perl code is written using
- objects). This does not mean that it is not possible to do functional
- programming with PP&R or object-oriented programming with Scheme. It
- just means that in Ruby and Python the object-oriented programming
- style is encouraged both by the language itself (e.g. everything is an
- object) and the standard libraries. The same holds for Scheme and the
- functional programming style.
-
- Another major difference between Scheme and PP&R is the syntax. PP&R
- all have infix syntax with different notations for different concepts.
- For example, the `if' conditional expression is syntactically different
- from, say, a function call. Scheme, on the other hand, has a very
- regular prefix syntax based on so-called s-expressions. In Scheme, an
- `if' looks no different than a function call.
-
- This very regular syntax make it possible to extend Scheme using a
- sophisticated macro system. Such macros are used in several crucial
- places in scsh, for example to support regular expressions with a
- syntax based on s-expressions (see below), or to provide a mechanism to
- iterate over the contents of a file in a way reminiscent of the AWK
- language.
-
- It should finally be noted that Scheme, Ruby and at least one
- implementation of Python (Stackless Python) give the programmer a way
- to capture the current continuation. This makes it possible to
- implement, directly in the language, very powerful control features
- including coroutines. More about continuations can be found, for
- example, in the Scheme FAQ (*note Getting the docs::).
-
- Language implementations
- ------------------------
-
- Perl, Python, Ruby and scsh are relatively close to each other when
- it comes to the features offered by their current implementation(s).
-
- Ruby, Python and scsh have an interactive mode which enables one to
- enter expression and see the result of their evaluation. Perl does not
- include such a mode by default, even though its debugger can be used as
- a basic interactive evaluator. Ruby, Python and scsh also provide a
- debugger.
-
- Libraries
- ---------
-
- Because of their popularity, there is an impressive amount of
- third-party libraries available for PP&R, which cover many application
- domains. Currently, the same cannot be said about scsh, although a few
- third-party libraries are available (*note Scsh code archive::).
-
- That said, scsh has excellent support for writing scripts in a Posix
- environment, which is its main domain of application. A great design
- effort has been put into making Posix look nice from scsh. This is
- accomplished not only by providing nicer names for Posix functions, but
- also by altering their behaviour. This contrasts with PP&R which often
- use both the name and the behaviour of the standard Posix functions.
-
- One example situation where scsh diverges both from Posix and PP&R is
- child process management. With Posix and PP&R, when child a process
- exits, its parent process has to wait on it explicitly. If it fails to
- do so, the dead child process (actually some information about it, like
- its exit status) remains in the kernel's process table, as a zombie
- process. This can be a serious problem, since the kernel's process
- table can eventually become full with zombie processes.
-
- Scsh can manage dead children processes in an automatic fashion
- through a technique called process reaping. The basic idea is that scsh
- takes care of waiting for child processes and stores their exit status
- in the Scheme data-structure associated to them. The scsh programmer is
- then free to wait or simply ignore its children, without having to
- worry about zombie processes.
-
- Another strength of scsh is its handling of regular expressions.
- Since regular expressions are important in many scripting applications,
- pretty much all scripting languages provide support for them, and PP&R
- or scsh are no exceptions. It should be noted that the regular
- expressions offered by scsh have some limitations when compared to
- PP&R, like the lack of non-greedy versions of some operators. On the
- other hand, scsh's regular expressions have some very interesting
- properties not found in PP&R:
- * a notation based on s-expressions instead of plain strings, which
- makes it unnecessary to quote special characters in strings, and
- makes it possible to lay out regular expressions nicely, comment
- them, etc.
-
- * a representation of regular expressions as trees instead of
- strings, which eases their manipulation by programs, for example
- to compose large regular expressions out of small ones, or to
- write functions building regular expressions.
-
- Example script
- --------------
-
- The following code snippets aim to provide an idea of how scsh
- compares with other common scripting languages. They all print a list
- of all the executables available in the current PATH to the standard
- output (improvements to these examples are welcome).
-
- - `sh'
- #!/bin/sh
-
- IFS=':'
- for d in $PATH; do
- for f in $d/*; do
- [ -x $f -a ! -d $f ] && echo $f
- done
- done
-
- - `perl'
-
- What is the sound of Perl? Is it not the sound of a wall that
- people have stopped banging their head against?
- - _Larry Wall_
-
- #!/usr/local/bin/perl
-
- for my $dir (split /:/, $ENV{PATH}) {
- opendir DIR, $dir or die "can't opendir $dir: $!";
- -x "$dir/$_" && !-d _ && print "$_\n" for readdir DIR;
- closedir DIR;
- }
-
- - `python'
- #!/usr/local/bin/python
-
- import os, string, stat
- for d in string.split(os.environ['PATH'], ':'):
- for f in os.listdir(d):
- mode = os.lstat(d + '/' + f)[stat.ST_MODE]
- if not stat.S_ISDIR(mode):
- print f
-
- - `ruby'
- #!/usr/bin/ruby
-
- ENV["PATH"].split(/:/).each {|path|
- Dir.foreach(path) {|file|
- puts(file) if File.stat(File.join(path, file)).executable?
- }
- }
-
- - `scsh'
- #!/usr/local/bin/scsh -s
- !#
-
- (define (executables dir)
- (with-cwd dir
- (filter file-executable? (directory-files dir #t))))
- (define (writeln x) (display x) (newline))
-
- (for-each writeln
- (append-map executables ((infix-splitter ":") (getenv "PATH"))))
-
- Where can I get scsh?
- =====================
-
- The latest version of scsh can be downloaded from the scsh home page,
- located at http://www.scsh.net/.
-
- There is also a SourceForge projet page for scsh at
- http://scsh.sourceforge.net/.
-
- Binaries for the Debian distribution of GNU/Linux are available from
- http://www.debian.org/Packages/stable/interpreters/scsh.html. A
- binary RPM for Red Hat Linux for x86 is available in the shells group of
- the libc6 contrib archive (say `rpmfind scsh').
-
- Binaries for win32 using Cygwin32 are available at
- http://xarch.tu-graz.ac.at/autocad/lisp/cl/scsh-0.5.2-cygwin-bin.tgz
- (thanks to Reini Urban). These require a recent version of cygwin1.dll.
- And please notice that this is an old (0.5.2) version of scsh, not the
- latest.
-
- Where can I find documentation about scsh?
- ==========================================
-
- The main documentation about scsh is the scsh manual. It is
- included in the distribution, in `<prefix>/lib/scsh/doc/scsh-manual'
- where `<prefix>' is the location where you installed scsh.
-
- You may also want to take a look at the technical report describing
- the design of scsh. It is also included in the distribution, in
- `<prefix>/lib/scsh/doc/scsh-paper'.
-
- The documentation about Scheme 48 is also worth reading, since it
- describes features like the module system, the interface with C, the
- command processor and some interesting libraries. It is in
- `<prefix>/lib/scsh/doc/s48-manual'.
-
- Also, since scsh is written on top of a Scheme system, you have
- access to the great power of Scheme. However, no Scheme documentation
- is available with scsh, so you may wish to obtain the standard Scheme
- references as well. Here are some useful pointers:
-
- - The official specification for Scheme is "The Revised^5 Report on
- the Algorithmic Language Scheme", often abbreviated R5RS. This is
- the document you should use to look up details about Scheme. It is
- available in various formats at:
- http://www.schemers.org/Documents/Standards/
-
- - An excellent and up-to-date Scheme FAQ was written by Matthias
- Radestock and is available at:
- http://www.schemers.org/Documents/FAQ/.
- An older FAQ was maintained by Mark Kantrowitz and Barry Margolin
- and, for those interested, is still available at:
- http://www.faqs.org/faqs/scheme-faq/.
- - Schemers.org (http://www.schemers.org/) is a collection of Scheme
- resources maintained by the Programming Languages Team at Rice
- University.
-
- - The Scheme home-page is located at:
- http://www.swiss.ai.mit.edu/projects/scheme/
- - The Scheme 48 home-page is located at http://s48.org/.
-
- - There are many good books about Scheme, for example: "Structure and
- Interpretation of Computer Programs" (2nd ed.) by Harold Abelson
- and Gerald Jay Sussman, MIT Press, 1996 or "Scheme and the Art of
- Programming" by George Springer and Daniel P. Friedman, MIT Press,
- 1989. The full text of the first one is available online at the
- following address: http://mitpress.mit.edu/sicp/.
-
- For more references, see the Scheme FAQ.
-
- The home-pages of the various people involved in the design of
- Scheme, Scheme 48 or scsh may also be of interest to you. Here are
- some links:
-
- - Gerald Jay Sussman:
- http://www-swiss.ai.mit.edu/~gjs/gjs.html
-
- - Jonathan A. Rees:
- http://mumble.net/jar/
-
- - Richard Kelsey:
- http://s48.org/~kelsey/
-
- - Olin Shivers:
- http://www.cc.gatech.edu/fac/Olin.Shivers/
-
- - Brian D. Carlstrom:
- http://www.carlstrom.com/
-
- - Martin Gasbichler:
- http://www-pu.informatik.uni-tuebingen.de/users/gasbichl/
-
- - Mike Sperber:
- http://www-pu.informatik.uni-tuebingen.de/users/sperber/
-
- Is there some kind of reference card for scsh?
- ==============================================
-
- Not exactly. There is a small list of all of scsh's functions in the
- file `doc/cheat.txt', but it has not been updated for quite some time.
- However, it would be great to have a nice TeXified reference card,
- which would include R5RS functions as well (something like the nice
- Perl reference card).
-
- Which newsgroups and mailing-lists are related to scsh?
- =======================================================
-
- Currently, there is a mailing-list which is mirrored to a newsgroup.
-
- To (un)subscribe to the mailing-list, send a message to
- <scsh-request@zurich.ai.mit.edu>. To submit a message to the
- mailing-list, send it to <scsh@zurich.ai.mit.edu>.
-
- The mailing-list is also readable as a standard newsgroup, thanks to
- gmane, a mail-to-news gateway. More information is available at the
- following URL:
- http://gmane.org/info.php?group=gmane.lisp.scheme.scsh
-
- There used to be a newsgroup dedicated to scsh, called
- `comp.lang.scheme.scsh' but it is now deprecated.
-
- Also, `comp.lang.scheme', which talks about Scheme in general, may
- be of interest to you. If Scheme is your first functional language, you
- might also want to read `comp.lang.functional'.
-
- Does scsh run on my system?
- ===========================
-
- Currently, scsh runs without modification on the following systems:
- Harris CXUX, HP-UX, IBM AIX, Linux, FreeBSD (*note Scsh on FreeBSD::),
- OpenBSD, NetBSD, NeXTSTEP, SGI IRIX, Solaris, SunOS, MacOS X and Win32.
- It should also run without too many changes on other 32 bits UNIX
- platforms (for 64 bit platforms like Digital Unix, *note Porting scsh::)
-
- Since version 0.6, scsh doesn't run on Ultrix anymore, and users of
- this system are encouraged to use version 0.5.3 instead.
-
- Is scsh easy to port?
- =====================
-
- On 32 bits UNIX machines, yes, usually. If your system isn't already
- supported, take a look at the file `doc/install.txt' which contains
- porting instructions.
-
- Porting scsh to 64 bit UNIX machines (or, more generally, non-32 bit
- machines) is currently harder. The main reason is that this requires
- modifications to the Scheme 48 virtual machine (VM). This VM is written
- in PreScheme, a dialect of Scheme, and the PreScheme compiler isn't
- distributed with scsh. It is, however, included in standard Scheme 48
- distributions, which are available on Richard Kelsey's FTP site:
- ftp://ftp.nj.nec.com/pub/kelsey/
- (you'll also find a paper about PreScheme there).
-
- In any case, never try to hack the C code generated by the PreScheme
- compiler (file `scheme48vm.c'); this is ugly and you'll have to restart
- from scratch for the next release of Scheme 48.
-
- Apart from the problems with the Scheme 48 VM, there are also some
- problems with scsh: the current version contains C code that assumes
- 32-bitness. This occurs mainly in the foreign-function interfaces (that
- is, interface between Scheme and C), where integers are converted
- between their Scheme and C representation.
-
- Since v0.5.2 there is also a port to Win32 which uses the cygwin32
- toolkit (thanks to Brian Carlstrom).
-
- Can I run scsh under some other Scheme implementation?
- ======================================================
-
- Currently, scsh is tightly bound to Scheme 48 because it uses two
- non-standard features of Scheme 48: its module system and its foreign
- function interface (FFI). This does not mean that porting it to another
- Scheme implementation is impossible, but it is certainly hard.
-
- Mike Sperber and Richard Kelsey are drafting a SRFI for a standard
- FFI based on the current Scheme 48 FFI. This would help in making scsh
- portable, since its C part could be easily reused with other
- implementations using this FFI.
-
- Matthew Flatt will be implementing this standard FFI for PLT Scheme.
- Therefore, PLT Scheme may become a viable alternative to Scheme 48 for
- scsh users. PLT Scheme is an umbrella name for a family of
- implementations of Scheme, which includes DrScheme and MzScheme. More
- information about it can be found at:
- http://www.plt-scheme.org/
-
- There is also a near-complete port of scsh to the Guile interpreter
- by Gary Houston, which you can access by cvsweb at
- http://subversions.gnu.org/cgi-bin/cvsweb/guile/guile-scsh/. It needs
- the `guilerxspencer' and `rxspencer' packages, available at
- http://arglist.com/guile/.
-
- While scsh was designed primarily for Scheme, most of it can be
- ported with some adaptations to other languages. We are currently aware
- of one such port for Objective Caml, called Cash, which can be found at:
- http://pauillac.inria.fr/cash/
-
- Installing and using scsh
- *************************
-
- Now that you have downloaded scsh, you might want to install and use
- it. Some help about this subject is provided here.
-
- Compilation problems
- ====================
-
- Scsh should compile without problems on most Unix platforms.
- Particular notes:
-
- 1. On MacOS X, with scsh versions older than 0.6.0, you had to specify
- the host type to configure, since autoconf was not able to
- autodetect it; you had to include `--host=powerpc-apple-bsd' in the
- configure commandline.
-
- 2. On Linux, compiling versions older than 0.5.2 with the new version
- on the glibc caused problems. The 0.5.2 release notes say
- "problems with the signal system blowing up builds on some of the
- more obscure Unix systems have been fixed").
-
- Is there a "port" of scsh for FreeBSD?
- ======================================
-
- Installing scsh on FreeBSD is best done by compiling FreeBSD's scsh
- "port" (meaning the FreeBSD term of a port, which is an integrated
- third-party package) or by getting a binary "package" from a FreeBSD
- ftp server. The FreeBSD port is available under `ports/lang/scsh'.
-
- It looks like I do not have enough memory to compile scsh?!?
- ============================================================
-
- If you get errors like "not enough memory" when building scsh, you
- may try to adjust the limits on memory usage imposed by your system.
- To do this, you have to use the `ulimit' command under `sh' and
- derivatives or the `unlimit' command under `csh' and derivatives
- (`tcsh' and the like). See the reference manual of your shell for more
- information.
-
- Is there some kind of "contributed code archive" for scsh?
- ==========================================================
-
- The following resources may be of interest to you:
-
- 1. The Scheme Untergrund Library, which collects contributed code for
- Scheme 48 and scsh:
- http://www.nongnu.org/sunterlib/
-
- 2. The scsh Wiki on which you can, among other things, share some
- code snippets http://www.scsh.net/cgi-bin/wiki.cgi
- 3. The resource page, on the scsh home page
- http://www.scsh.net/resources.html.
-
- 4. The scsh contributed code repository, at
- ftp://ftp.scsh.net/pub/scsh/contrib/, Which currently includes:
-
- 1. sunet, an extensible web server written by Olin Shivers with
- extensions by Michael Sperber;
-
- 2. Functional Postscript, which provides a Scheme interface to
- the Postscript page description language;
-
- 3. A text markup system by Scott Draves and Jonathan Rees;
-
- 4. pgscsh, a socket-level interface to the PostgreSQL
- object-relational DBMS, by Eric Marsden.
-
- Go on and send more code.
-
- 5. The various Scheme code repositories, which are all listed in the
- Scheme FAQ. The two main repositories are the Scheme Repository
- at Indiana University:
- http://www.cs.indiana.edu/scheme-repository/home.html
- and the CMU AI Repository, Scheme Section (a.k.a. the CMU Scheme
- Repository):
- http://www.cs.cmu.edu/Web/Groups/AI/html/repository.html.
-
- Also, some useful code is included with Scheme 48 (hash tables
- support, sorting functions, etc.) in the Big Scheme module. Please
- notice that you will have to open the module before being able to
- access its functions. For additional information, check the file
- `doc/big-scheme.txt' in the scsh distribution.
-
- If you want to write some code for scsh but you don't know what, you
- might want to take a look at the scsh home-page (*note Getting scsh::)
- which contains a list of interesting projects.
-
- Can I use "plain" Scheme code with scsh?
- ========================================
-
- Generally speaking, all of the existing Scheme code can be run
- without problem with scsh. There is only *one* possibly annoying
- incompatibility between R5RS-compliant interpreters and scsh: Symbols in
- scsh are case-sensitive while this is not true for R5RS-compliant
- interpreters. This means, for example, that the following expression:
-
- (eq? 'symbol 'Symbol)
-
- evaluates to `#t' with an R5RS-compliant interpreter (including the
- original Scheme 48), while it evaluates to `#f' with scsh.
-
- In practice this shouldn't be a big problem, but if you encounter
- code that works perfectly with all Scheme interpreters except scsh, then
- this may be the reason.
-
- If you want to know the design decision behind this choice, you
- should read the technical report describing the design of scsh (*note
- Getting the docs::).
-
- There are also other extensions to R5RS in scsh (e.g. C-like escaped
- characters in strings) but they shouldn't break existing Scheme code;
- you should have them in mind, however, when trying to write portable
- Scheme code under scsh.
-
- Can I use scsh as an interactive shell?
- =======================================
-
- Well, technically you can: just run the "scsh" command and you will
- enter a Scheme 48 session with all scsh functions available. However,
- this is definitely not suitable for interactive work: there is no
- command-line editing, no command-line history, no file/function name
- completion, no terse syntax, etc. All these features are planned, and
- Olin has a design for much of them. However, nobody found the time to
- implement them yet.
-
- In the meantime, a nice solution is to use a separate tool which
- provides some of these features. Here is a partial list of such tools:
-
- 1. Emacs: use the `cmuscheme' package, written by Olin. It is now
- part of Emacs, but if you don't have it on your system, you may
- use the one provided with scsh, which is also a little more
- up-to-date (check the directory `emacs'). This mode enables you
- to run scsh (or any Scheme interpreter by the way) as an inferior
- process. It provides command-line editing, command-line history,
- dynamic completion, file-name completion, automatic indentation of
- Scheme code and more.
-
- If you want to give it a try right now, just type `C-u M-x
- run-scheme', and then enter `scsh' at the prompt.
-
- 2. Some terminal emulator that enables input (or output) editing. An
- example is the 9term terminal emulator, inspired by the Plan 9
- terminal emulator. Check out 9term's home-page at:
- http://www.cs.su.oz.au/~matty/9term/index.html
-
- 3. Any text editor that can run a process in one of its windows. An
- example is wily (although it is more than a text editor), inspired
- by Plan 9's ACME tool. For more information:
- http://www.cs.yorku.ca/~oz/wily/
-
- I get "undefined variable" errors when I try to use some functions?!?
- =====================================================================
-
- If you get "undefined variable" errors when you use functions from
- the big-scheme package or macros like `define-record', then maybe you
- didn't open the appropriate packages. To open them, there are two
- solutions:
-
- 1. use the `,open' command in interactive mode, or
-
- 2. use Scheme 48's module system.
-
- The first solution is nice for interactive work, while the second is
- the one to use for scripts.
-
- Documentation on the Scheme 48 module system can be found in the
- Scheme 48 documentation. Olin Shivers also posted a message with
- further explanations to the scsh newsgroup, which is archived at
- http://groups.google.com/groups?selm=qijyawastzo.fsf%40lambda.ai.mit.edu.
-
- Can I use SLIB (a Scheme library) with scsh?
- ============================================
-
- Yes, provided that you get (or write) an initialization file for
- scsh. Tomas By wrote one that you can get there:
- ftp://ftp.dcs.shef.ac.uk/home/tomas/scsh.init
-
- By the way, more information about SLIB is available by following
- this URL:
- http://www-swiss.ai.mit.edu/~jaffer/SLIB.html
-
- Some basic I/O functions (like EOF testing) seem not available in scsh?!?
- =========================================================================
-
- Don't forget that scsh is built on top of Scheme. Therefore, you
- have access to the full power of Scheme in scsh, and that includes some
- basic I/O functions, like the test for EOF, etc. However, these
- functions are not documented in the scsh manual, but in the official
- Scheme specification (R5RS, *note Getting the docs::).
-
- How can I return the eof-object?
- ================================
-
- Some functions and macros (like the nice AWK macro) take a reader
- function as an argument. This reader function is required to return the
- eof-object at the end of the input. This is easy when the input is a
- port, but much harder when the input is something else (like a list of
- lines, etc.). The reason is that R5RS specifies that the eof-object
- can't be read by the `read' procedure, and therefore can't be included
- literally in your source. However, it can be defined like that:
-
- (define eof-object (read (make-string-input-port "")))
-
- Is there support for protocols like HTTP, SMTP, etc.?
- =====================================================
-
- Yes, but it isn't included in the scsh distribution. You will find
- it in the contributed code directory for scsh:
- ftp://ftp.scsh.net/pub/scsh/contrib/
-
- I get strange errors with some network functions?!?
- ===================================================
-
- If you are using scsh 0.4.2 under Solaris 2 or Irix 5, and the errors
- you get look like:
-
- Error: 122
- "Operation not supported on transport endpoint"
- #{Procedure 9398 %listen}
-
- then you should switch to a newer version of scsh: this was a known bug
- of scsh 0.4.2.
-
- If, for some reason, you want to stick with v0.4.2, here is how to
- fix the bug:
-
- In scsh's distribution directory, edit the file
- `scsh/solaris/netconst.scm' (if you are under Solaris 2 and above) or
- `scsh/irix/netconst.scm' (if you are under Irix 5 and above) so that
- the following lines:
-
- (define socket-type/stream 1) ; stream socket
- (define socket-type/datagram 2) ; datagram socket
- (define socket-type/raw 3) ; raw-protocol interface
- ;;(define socket-type/rdm 4) ; reliably-delivered message
- ;;(define socket-type/seqpacket 5) ; sequenced packet stream
-
- are replaced by the following lines:
-
- (define socket-type/stream 2) ; stream socket
- (define socket-type/datagram 1) ; datagram socket
- (define socket-type/raw 4) ; raw-protocol interface
- ;;(define socket-type/rdm 5) ; reliably-delivered message
- ;;(define socket-type/seqpacket 6) ; sequenced packet stream
-
- then recompile scsh, by running make in the main directory, and
- reinstall it.
-
- How do I get the multiple values returned by a function?
- ========================================================
-
- This is documented in the R5RS. However, with all these
- continuations, the documentation might be a little hard to understand
- for newcomers. So here is a little (although not very useful) example
- that uses `values' and `call-with-values':
-
- (call-with-values (lambda () (values 6 7)) *)
- => 42
-
- As you can see, the first argument to `call-with-values' is a
- procedure which return multiple values, and the second is a procedure
- which gets these multiple values as arguments.
-
- Scheme 48 provides another syntax to access multiple values: the
- `receive' macro. This macro binds multiple values returned by an
- expression to variables, and then evaluates a sequence of expressions
- with these bindings active (for Common Lisp fans, this is similar to
- `multiple-value-bind'). Here is the above example, rewritten using
- `receive':
-
- (receive (x y) (values 6 7) (* x y))
- => 42
-
- For more information on this function, check out
- `doc/big-scheme.txt'.
-
- While this may not be evident here, the `receive' macro is often
- easier to use than `call-with-values'.
-
- How do I interface scsh with a C function?
- ==========================================
-
- Use the Scheme 48 facility to interface with C, documented in the
- Scheme 48 manual.
-
- What is the syntax of regular expressions?
- ==========================================
-
- Scsh 0.5.2 introduced support for SREs, or Structural Regular
- Expressions. These provide an s-expression notation for building up
- and operating on regular expressions. See the SRE section of the manual
- for further details.
-
- Standard string-based regexps are also available (and in fact SREs
- compile to string-based regexps). Henry Spencer's POSIX regular
- expression engine is used to implement the matching. The syntax
- accepted by this engine is described in its man page, which can be
- found in the scsh distribution, in file `scsh/regexp/regex.7'.
-
- How should I handle errors?
- ===========================
-
- Scsh raises exceptions instead of passing error status codes via the
- `errno' variable (this makes error handling much simpler). You can use
- the `with-errno-handler' form to handle these errors gracefully.
-
- Certain error conditions are signalled by calls to the `error'
- primitive. If you wish to intercept these conditions gracefully you can
- write your own handler. The following example shows how to intercept the
- host-not-found condition on DNS lookup.
-
- #!/usr/local/bin/scsh \
- -dm -m whnf -e main -s
- !#
-
- (define-structure whnf
- (export main)
- (open scheme scsh handle)
- (begin
-
- (define (with-host-not-found* thunk)
- (call-with-current-continuation
- (lambda (k)
- (with-handler
- (lambda (condition next)
- (cond ((string-match "^name->host-info" (cadr condition))
- (display "No such host")
- (newline)
- (k '()))
- (else (next))))
- thunk))))
-
- (define-syntax with-host-not-found
- (syntax-rules ()
- ((with-host-not-found ?body ...)
- (with-host-not-found* (lambda () ?body ...)))))
-
- (define (main args)
- (with-host-not-found
- (host-info "foo.bar.com")))))
-
-