Scheme, Scheme Implementations, SCM

-> In Japanese

-> In French

Updated: Wed Jan 2 01:45:11 2002 JST

Updates

Table of Contents

Scheme

Scheme is a dialect of Lisp (List Processing programming language). The programs are written mainly with procedures returning a value (functions) and Lisp is called a functional language. The classification of programming languages into functional or procedural is not so meaningful because the end of all programming languages is programs. The Lisp way of thinking is also for making good programs and the C language has similar ways to Lisp's to a certain extent since its beginning. In practice, however, there seems to be only a few programmers thinking in Lisp.

A document entitled "Lisp as an Alternative to Java -- Erann Gatt, Jet Propulsion Laboratory, California Institute of Technology", dated November 9 1999, says the following. Their expreriment "results show that Lisp's performance is comparable to or better than C++ in terms of execution speed, with significantly lower variability ... Furthermore, development time is significantly lower and less variable than either C++ or Java. Memory consumption is comparable to Java." It also says "development time for the Lisp programs was significantly lower than the development time for the C, C++ and Java programs" and "the difference cannot be accounted for by programmer experience." The experiment was performed with all the programs compiled to native code. So the execution speed has to be evaluated differently for the interpreted Lisp code but the other results seem to be commonly applicable to all Lisp.

For those who like Lisp, there is nothing to be surprised with the above experiment results. They beleive firmly that Lisp is an excellent programming language. But if Lisp is so excellent, a small puzzling fact remains why Lisp is not widely diffused. It would be of time consuming effort to unriddle it if not impossible. The best way would be to show the Lisp's advantages by practice as Mr. Shiro Kawai's Practical Scheme does.

Scheme is the smallest among all the Lisp dialects providing all the necessary features for programming. Scheme is perfectly specified within 50 pages, including index. This is due partly that Scheme is Lisp but no other languages have these compact specifications. Before Scheme, other languages appear to be obtaining a circle from polygon by increasing the number of sides infinitely .

Because Scheme specifications are extremely clear, Scheme programs are to be simple, correct and beautiful from the very beginning of programming skill.

Scheme was created with the concept that "Programming languages shoud be designed not by piling feature on top of feature, but by removing the weakness and restrictions that make additional features appear necessary." It was so designed that "a very small number of rules for forming expressions, with no restrictions on how they are composed, suffice to form a practical and efficient programming language (Revised5 Report on the Algorithmic Language Scheme--r5rs--Introduction)."

If the rules are correct, the programs on those rules are correct. If the number of necessary and sufficient rules are reduced, the applicable domain of the rules is extended. The rules of a programming language are what provides the ways of expression, which give Scheme a diversiform expressiveness. Because each of the diversiform Scheme programs is subject strictly to Scheme rules, every Scheme program is duly correct and clear.

Scheme, invented by Guy Lewis Steele Jr. and Gerald Jay Sussman was first described in 1975. Guy Lewis Steele Jr. is the author of the "Common Lisp Reference Manual(First edition-1984, Second edition-1989)--Digital Press." He writes that Common Lisp is influenced to some extent by Scheme in its Introduction.

Scheme specifications were almost fixed on "Revised4 Report on the Algorithmic Language Scheme--r4rs-1991" after several revisions with introduction of new features such as Common Lisp's study results. The almost all actual Scheme implementaions are at least compliant with r4rs.

The latest specifications of Scheme are provided by Revised5 Report on the Algorithmic Language Scheme--r5rs-1998. R5rs is a super set of r4rs.

Ñ╫ÑφÑ░ÑΘÑ▀Ñ≤Ñ░╕└╕∞Scheme kindly makes available my translation of r5rs into Japanese.
My translation was first made for myself when I was compelled to use Scheme unable to find documents on it in Japanese. I dared to make it public hoping to have no grave errors because the programs I wrote worked as my understanding of r5rs. I find inacurcies now in my translation. But once made public, it is difficult to motivate myself to remake the translation. I wish the readers to be tolerant enough.
In the meanwhile, it is known there are other versions of translation of r4rs and r5rs and a new translation appears lately made by Mr. Masaaki Murakami. The original r5rs contains lots of difficulties at least for me. Various translations would be of great help for better understanding of the original one.

Scheme was first diffused as educational language due to its above mentioned features but it's not limited to education. This page follows Mr. Shiro Kawai and is intended to care the practical aspect of Scheme application.

Scheme Implementations

An implementation must be installed to make use of Scheme.
In order to select one among lots of Scheme implementations, our criterion would be the Japanese language processing for us Japanese. If a Scheme implementaion is written in C, the char type is used to represent the Scheme characters for which char? returns #t. The Japanese locale need not necessarily be supported but if two successive bytes like Japanese characters are processed always as independent bytes, they can not be input nor displayed though able to be processed.
Among the implementations I experienced, these are the ones accepting Japanese input and display shown in an frequency of use order: (1)SCM, (2)Gauche, (3)STk, (4)guile and (5)mit-scheme.

The OSs I am using are, in the frequency of use order, too, FreeBSD 4.4-RELEASE, Debian Linux Potato (kernel 2.2r1), OS/2 Warp V4.0, Windows 2000 and Windows 98. This seems to be exactly in reverse order if seen from number of users. UNIX and Linux are flexible enough and easy to use but they are not as widely used as the others are due to their complicated settings.

This table shows how I installed the Scheme implementations for each of them.

Scheme implementaions I installed
OS SCM Gauche STk guile mit-scheme
FreeBSD 4.4 make configure && make configure && make configure && make binary
Debian Linux 2.2r1 make / configure && make configure && make binary
OS/2 Warp V4.0 make / * * binary
Windows 2000 make / * * /
Windows 98 make / * * /

* ... I could't install.
/ ... Not tried.

- Cygwin environment is used for installing on Windows98 and Windows 2000.
Cygwin environment is available from http://sources.redhat.com/cygwin.
- Emx environment is used for installing on OS/2. Gnu make and bash are also needed in addition to gcc.
Emx environment is available from http://hobbes.nmsu.edu.
- For the SCM on Windows(MS-DOS), a binary is also available from Mr. Jaffer's site. However, *.scm files have to exist in the (implementation-vicinity) to execute the binary in addition to the SLIB library described below.
- On floating point numbers on FreeBSD, there is a problem that its mantissa precision defaults to 53 bits, for which the r4rstest.scm described below fails. The problem could be worked around by embedding some codes for SCM on FreeBSD. Linux has no such a problme.
For the floating point numbers, there seems to be implementations leaving some inaccuracies on their input/output (cf. (/ 1448997445238699 (expt 10 15) óΓ 1.448997445238699 and (* 6525704354437806 (expt 2 - 52))).
Mr. Shiro Kawai kindly informed me of a paper: "Printing Floating-Point Numbers Quickly and Accurately", Robert G. Burger and R. Kent Dybvig, Proceedings of the SIGPLAN '96 Conference on Programming Language Design and Implementation. It describes a quick and accurate output algorithm of the floating point numbers, justified using Chez Scheme. Chez Scheme, principally developed by Mr. R. Kent Dyvig, seems to implement the algorithm.

About SCM

In order to use SCM, SLIB must be installed beforehand so that SCM can require it on need.

SLIB

SLIB is available from http://swissnet.ai.mit.edu/~jaffer/SLIB.html maintained by Mr. Aubrey Jaffer. The latest version is "2d2".

Unzip slib2d2.zip to a convenient directory, for instance to '/usr/local/lib'.


    % unzip slib2d2 -d /usr/local/lib
  
SLIB libraries are opened out into the directory named slib under the specified directory. Set the environment variable 'SCHEME_LIBRARY_PATH' to this directory in the environment initialization file. The last forward slash (backslash for OS/2 and Windows) is needed in order to concatenate the file name to the directory path later on.

Installing SCM

  1. Unzip scm5d4.zip to a convenient directory, for instance to /home. SCM source files are opened out into the directory named scm under the specified directory.
    
        unzip scm5d4 -d /home
        
  2. It might be worthwhile to check the followings before compiling SCM.

    • Using the bignum data format

      To make maximum use of SCM's bignum data format, I recommend to set the NUMDIGS_MAX defined in scmfig.h to around 20000 digits.

    • Notes on compiling with FreeBSD

      The double precision (flonum) mantissa with FreeBSD defaults to 53 bits (IEEE 754). To set the mantissa precision to 64 bits, a function fpsetprec() must be called when the main function begins, #including 'floatingpoint.h' to the compiled units (FreeBSD Q and A). This resets the Intel CPU register for extended 64 bits floating point arithmetic. However, this increases the overflow risk because all the internal double arithmetic is done in 64 bits since then and might induce sometimes incorrectness due to rounding of the extended predision to double precision.
      Patch scmmain.c or edit it on your own risk. I myself meet no grave problem so far. The patch is already applied to the developpement version of SCM and will be available from its next release.
      FP_PE is declared in 'ieeefp.h' and included when including 'floatingpoint. h'.
      
               ...
              /*
               * FP precision modes
               */
      	  typedef enum {
      	        FP_PS=0,        /* 24 bit (single-precision) */
      		FP_PRS,         /* reserved */
      		FP_PD,          /* 53 bit (double-precision) */
      		FP_PE           /* 64 bit (extended-precision) */
      	  } fp_prec_t;
      	  ...
              
  3. Create scmlit.
    
          make scmlit
          
    - scmlit is prepared for executing the script file build written in Scheme.
    Scmlit is composed of minimum modules allowing to execute the build script and it is highly possible that it is compiled on any OSs.
    - When compiling it with OS/2-emx, the necessary header files are not included with the original 'findexec.c'. Patch or edit it. This is necessary to compile the full featured SCM, too.
  4. Execute build script with arguments.
    There are two formats for build arguments: short one like '-p freebsd' and long one like '--platform=freebsd'. I am explaining with short formats. See for details 'scm.info' file opened out into the scm directory: SCM -- Installing SCM -- Building SCM -- Build Options.

    • -h batch-script-format
      One of unix, dos, vms, amigados or system can be specified for batch-script-format.
      If '-h system' is specified, the compilation is executed actually. Other specifications let the program output the batch script to the standard output. SCM in fact is able to choose the batch script format from the environment where the build is executed. So -h option is not needed except for '-h system' specification.
    • -p platform-name
      Specify the name build database has for platform-name, one of the followings in present case: freebsd, linux, os/2-emx or unix(for cygwin).
      The build program will select from its database the compile options and link options related to the platform-name.
    • -F feature-name ...
      Specify for -F options the names separated by a space from the following table. The feature names marked with * (asterisk) indicate that I could not compile the feature. See scm.info and source files for details of the features.

      Features with ability of compilation(o = I could, * = I couldn't, / = not tested)
      Feature name Description FreeBSD Debian Linux OS/2- emx cygwin
      arrays Multi dimensional arrays o o o o
      array-for-each Array mapping o o o o
      bignums Multiple precision data o o o o
      cautious Number check of arguments o o o o
      compiled-closure Integration of C functions o o o o
      curses curses library o o o o
      debug Error check for debugging / / / /
      dump Executable image dump * * * *
      dynamic-linking Dld library * * * *
      read-line Line editor o o / /
      engineering-notation Engineering notation o o o o
      generalized-c-arguments Variable number args C functions o o o o
      i/o-extensions ANSI C file I/O o o o *
      inexact Floating point arithmetic o o o o
      macro r5rs macro o o o o
      posix posix functions (pipe,fork,uname etc.) o o * o
      unix Unix functions other than posix(symlink,nice,mknod etc.) o o * *
      record Record data type o o o o
      regex Regular expressions o o * *
      rev2-procedures r2rs procedures o o / /
      sicp (eq? () #f)==>#t, etc o o / /
      socket BSD sockets o o * /
      tick-interrupts ticks, ticks-interrupt, alarm etc. o o o o

    
          build example 1(FreeBSD)
            ./build -h system -p freebsd -F arrays array-for-each bignums \
            cautious compiled-closure generalized-c-arguments i/o-extensions \
    	inexact macro record
          
    The above specifications normally force compiling and linking to create scm executable. The one or both may fail if the specified features are not supported by the build database.
    If failure occurs, try to create a script file instead of executing direct compiling and linking and edit it later:
    
          build example 2(FreeBSD)
            ./build -p freebsd -F arrays array-for-each bignums \
            cautious compiled-closure curses generalized-c-arguments \
    	i/o-extensions inexact macro posix unix record \
    	regex socket tick-interrupts > makescm
    
    	chmod +x ./makescm
          
    The above creates the following script file:
    
          #!/bin/sh
          # unix script created by SLIB/batch 
          # ================ Write file with C defines
          rm -f scmflags.h
          echo '#define IMPLINIT "Init5d4.scm"'>>scmflags.h
          echo '#define INITS init_ramap();init_gsubr();init_ioext();init_posix();init_record();init_rgx();init_sc2();init_socket();init_unix();'>>scmflags.h
          echo '#define ARRAYS'>>scmflags.h
          echo '#define BIGNUMS'>>scmflags.h
          echo '#define CAUTIOUS'>>scmflags.h
          echo '#define FLOATS'>>scmflags.h
          echo '#define MACRO'>>scmflags.h
          echo '#define CCLO'>>scmflags.h
          echo '#define TICKS'>>scmflags.h
          # ================ Compile C source files
          cc -O -c rope.c unif.c subr.c sys.c eval.c scl.c repl.c time.c script.c findexec.c scmmain.c scm.c continue.c unix.c socket.c sc2.c rgx.c record.c posix.c ioext.c gsubr.c ramap.c
          # ================ Link C object files
          mv -f scm scm~
          cc -o scm -lc -lgnuregex -lm ramap.o gsubr.o ioext.o posix.o record.o rgx.o sc2.o socket.o unix.o continue.o scm.o scmmain.o findexec.o script.o time.o repl.o scl.o eval.o sys.o subr.o unif.o rope.o
          
    By executing ./makescm, the macro definitions are written to a file named scmflags.h and scm executable is created, displaying the following messages in present case:
    
          sys.c: In function `prinport':
          sys.c:311: warning: passing arg 1 of `lputs' makes pointer from integer without a cast
          posix.c: In function `l_ttyname':
          posix.c:322: warning: assignment makes pointer from integer without a cast
          sys.o: In function `ltmpnam':
          sys.o(.text+0x40c): warning: tmpnam() possibly used unsafely; consider using mkstemp()
          /usr/libexec/elf/ld: sys.o: warning: unresolvable relocation against symbol `tmpnam' from .text section
          
    Ignore all warnings except that for tmpnam. The above warning for tmpnam is telling that the tmpnam function was unable to be linked with the link options specified in the script file.
    I can't explain the reason why tmpnam was not linked because it exiists in the libc library. What I can tell is that the tmpnam function is linked and becomes available without -lc.
    FreeBSD's C compiler is gcc (2.95.2 for 4.2-RELEASE) but its C library seems not from GNU.
    FreeBSD strongly recommends to use mkstemp() instead of tmpfile and tmpnam (tmpfile (3)) and there might be a mechanism somewhre which prohibit to link it when the standard C library is specified. I would be grateful if someone teach me.

    Anyway, full featured SCM is created by executing the following edited script file. In the following example, I changed the optimization option to the maximal O3. The SCM session prompt "SCM> " is also specified.

    
          #!/bin/sh
          # unix script created by SLIB/batch 
          # ================ Write file with C defines
          rm -f scmflags.h
          echo '#define IMPLINIT "Init5d4.scm"'>>scmflags.h
          echo '#define INITS init_ramap();init_gsubr();init_ioext();init_posix();init_record();init_rgx();init_sc2();init_socket();init_unix();'>>scmflags.h
          echo '#define ARRAYS'>>scmflags.h
          echo '#define BIGNUMS'>>scmflags.h
          echo '#define CAUTIOUS'>>scmflags.h
          echo '#define FLOATS'>>scmflags.h
          echo '#define MACRO'>>scmflags.h
          echo '#define CCLO'>>scmflags.h
          echo '#define TICKS'>>scmflags.h
          echo '#define PROMPT "SCM> "'>>scmflags.h
          # ================ Compile C source files
          cc -O3 -c rope.c unif.c subr.c sys.c eval.c scl.c repl.c time.c script.c findexec.c scmmain.c scm.c continue.c unix.c socket.c sc2.c rgx.c record.c posix.c ioext.c gsubr.c ramap.c
          # ================ Link C object files
          mv -f scm scm~
          cc -o scm -lgnuregex -lm ramap.o gsubr.o ioext.o posix.o record.o rgx.o sc2.o socket.o unix.o continue.o scm.o scmmain.o findexec.o script.o time.o repl.o scl.o eval.o sys.o subr.o unif.o rope.o
          
    This is the case of Debian Linux.
    
          build example 3(linux)
            ./build -p linux -F arrays array-for-each bignums \
            cautious compiled-closure curses generalized-c-arguments \
    	i/o-extensions inexact macro posix unix record \
    	regex socket tick-interrupts > makescm
          
    the following script file is created.
    
          #!/bin/sh
          # unix script created by SLIB/batch 
          # ================ Write file with C defines
          rm -f scmflags.h
          echo '#define IMPLINIT "Init5d4.scm"'>>scmflags.h
          echo '#define INITS init_ramap();init_gsubr();init_ioext();init_posix();init_record();init_rgx();init_sc2();init_socket();init_unix();'>>scmflags.h
          echo '#define ARRAYS'>>scmflags.h
          echo '#define BIGNUMS'>>scmflags.h
          echo '#define CAUTIOUS'>>scmflags.h
          echo '#define FLOATS'>>scmflags.h
          echo '#define MACRO'>>scmflags.h
          echo '#define CCLO'>>scmflags.h
          echo '#define TICKS'>>scmflags.h
          # ================ Compile C source files
          gcc -O2 -c rope.c unif.c subr.c sys.c eval.c scl.c repl.c time.c script.c findexec.c scmmain.c scm.c continue.c unix.c socket.c sc2.c rgx.c record.c posix.c ioext.c gsubr.c ramap.c
          # ================ Link C object files
          gcc -rdynamic -o scm -lc -lregex -lm ramap.o gsubr.o ioext.o posix.o record.o rgx.o sc2.o socket.o unix.o continue.o scm.o scmmain.o findexec.o script.o time.o repl.o scl.o eval.o sys.o subr.o unif.o rope.o
          
    The execution of the script file fails lack of libregex. Laser5 Linux 6.0 (Japanese Redhat Linux 6.0) kernel 2.2.5 did not have libregex neither, I remember. It seems the regular expression library is included in the standard library with Linux. The stript file without -lregex ends successfully, creating the SCM executable with rgx.c module successfully integrated.

    
          build example 4(cygwin)
            ./build -p unix -F arrays array-for-each bignums \
            cautious compiled-closure curses generalized-c-arguments \
    	inexact macro posix unix record tick-interrupts > makescm
    
    	chmod +x makescm ; ./makescm
          
    I used makefile to make the SCM for OS/2.

    Of course every OS with C environments accepts the Makefile. Here are the Makefiles I made by editing the one included in SCM version 4e3:

    The Makefiles are used for creation of scm and libscm.a. An empty scmflags.h is provided by hand (rm scmflags.h ; touch scmflags.h).

  5. Confirm the SCM behaviour by executing r4rstest.scm.
    
        ./scm r4rstest
        SECTION(2 1)
        SECTION(3 4)
         #<;primitive-procedure boolean?>;
         ...
       Passed all tests
    
       To fully test continuations, Scheme 4, and DELAY/FORCE do:
       (test-cont) (test-sc4) (test-delay)
       SCM> (test-cont) (test-sc4) (test-delay)
       ...
       Passed all tests
       ...
       (exit)
       
    In my environment (Pentium Pro 200 MHz, 128 MB memory) with FreeBSD, Debian Linux, Windows 2000 and Windows 98--cygwin, every SCM thus created passed the r4rstest. But the SCM for OS/2 failed with the following messages.
    
       ...
       errors were:
       (SECTION (got expected (call)))
       ((6 5 6) (#f #t (mult-float-print-test #f)))
       ((6 5 6) (#f #t (mult-float-print-test #f)))
       ((6 5 6) (#f #t (mult-float-print-test #f)))
       ((6 5 6) (#f #t (mult-float-print-test #f)))
       ((6 5 6) (#f #t (mult-float-print-test #f)))
       ...
       
    The first list of numbers shows the r4rs section (6.5.6 -- Numerical input and output corresponding to 6.2.6 of r5rs). The secction defines the procedures string->number and nmber->string. The errors are due to the inaccurracies of the floating point number I/O but do not affect the essential behaviour of Scheme. I don't think this causes any problem for the normal programming with SCM.

-> Back to previous page

-> Home


Dai Inukai